「整数」を含む日記 RSS

はてなキーワード: 整数とは

2023-09-20

https://anond.hatelabo.jp/20230920031702



  平成15年の東大文系数学入試当日に問題は出現するが、内容は、(1)積分計算(2)線形計画法(3)整数(4)確率

   (1)は最後計算の値が出ていないと途中経過が間違いであるので最後の値が合っていれば途中経過が正しいことが明らかである

   (2)線形計画法主題だが単なる場合分けの問題特に目玉の問題ではなかった。(3)漸化式を立てていくらかの仮定を付加すると正当に到達する問題

  いくらかの仮定を立てることがポイントだった。(4)確率の応用問題

2023-09-17

  平成15年の東大文系数学入試当日に問題は出現するが、内容は、(1)積分計算(2)線形計画法(3)整数(4)確率

   (1)は最後計算の値が出ていないと途中経過が間違いであるので最後の値が合っていれば途中経過が正しいことが明らかである

   (2)線形計画法主題だが単なる場合分けの問題特に目玉の問題ではなかった。(3)漸化式を立てていくらかの仮定を付加すると正当に到達する問題

  いくらかの仮定を立てることがポイントだった。(4)確率の応用問題

2023-08-28


   inductionっていうのは、誘導法といって教科書で習うわけですが、 どういうときに使うかというと、要するに整数問題で、一般のnのときに示しなさいと言われて、誘導していくやり方が

 できるときなわけで、かなりの場合には平凡に使えるのですが、かなりの場合というのはかなりの問題に対して誘導できるということですが、あのフェルマーの最終定理については、

  x^3+y^3=z^3ではないので、 x^5+y^5=z^5でもないというような誘導ができないので使えないし、そういうときは何か別の隠れた補題発見して証明してそれに対して誘導成功する

   場合もありますが、フェルマー問題は、誘導を充てる補題発見された形跡がない、しか個別問題では、n=3,4のときは、無限降下法という特別な、 背理に誘導するというやり方で

  証明されて、inductionに関する華々しい議論が陸続したが、5以上では成功しなかった。ここで何が重要かというと、警察官というのはその辺を歩いているだけであって出てきても驚愕でも

   華々しくもない場合もあるし、取扱事案について警察官が出てきたとかそれだけの事実ではなんらその問題に対して手段としてエレガントでもなんでもないわけですが、通常はいて当たり前で

  別に市民の誰も何も気にしていないような警官でも、出てきて諸般の技術披露しそれによって難しい事案が解決したときにはその警察官が出てきて何かをしたということが手段として驚愕である

    評価されることはあるとしても、警察官が出てきたときに事案解決に向かって実行したどの行為なりが驚愕的で、子供がはしゃぎそうなものであるかについては特にそれを分類的に説明した

  基本書などもなく周知されていない。例えば、拳銃は、警察学校での試し打ちなどもあるのでそれが存在使用されてもなんら当たり前で華々しくもない平凡なばあいであるとしても

   近所に包丁を振り回している男がいて近隣の人の誰も解決できない場合に110番通報をし、臨場して出てきた警察官その男に対して威嚇をしたり制圧したり場合によっては拳銃

  虚勢するなどして事案を解決した場合には警察官がとったその手段がエレガントである評価される場合もあろう。これはちょうど、NHK紅白最後小林幸子が出てくるにも似たようなものである

   警察官NHK紅白歌合戦に最後にトリとして出場するような存在ではないし、事案との関係しか出現しないため、警察官が出てきたとかではたらず、警察官のどの行為が、いわば、

   極限的な場合テクニックであるかは、事案との関係での評価となろう。

2023-08-27

  俺が黒羽で解くのに苦労した2012年のIMO最後整数問題だけど、あれは結局AoPSを見たら、inductionが出てくるという問題だったらしいね。inductionが出てきて完了するか

  Lemmaを2つ作ってそれにinductionを横から使うだけで、そのLemmaを発見する方が難しいとか大量の解法が掲示されているけど、結局は、inductionが出てくるという解法がもっと

  美しいのではないかと解する。この場合哲学的には出てこないはずのものが出てくること自体驚愕であると解されているが2012年の問題はそういう内容の問題だった。

   定理内容は、その連立方程式を満たすnは MOD 4で 1,2のときであるという定理なのである証明は難しい。世界中でも数人しか出来なかった。

  AoPSでも、1,2,5,6,9,10まではworkするが、13,14,17,18,21,22以降は確認がとれない。俺も解いてるときに n≧16では確認

   とれないし、どうやっていいか1つも分からなかった。誘導を出すときには、 4k+14k+2 4k+14k+13の議論必要となるが、誘導で出ると思わなかったらそこでおしまいなので。

  定理検討すると、1,2,5,6,9,10まではworkすることは理解できるが、13、14以上になると、確認がとれるのもあるし面倒でたまらんなってくる。そこで模範解答は、

   n≧16のときにやや面倒な議論をしてinductionを使っているが、実質的に、1,2,5,6,9,10では書きだせば該当するので。私は最初、n≧16では存在しないのではないか

  と勘違いしていい気になっていたらとんでもないミステイクで、アイオブさんっていう天才がいて

2023-08-24

  白チャートに載っている、 2^n > n を誘導法で示せというのはただの練習問題であって誘導法には様々なヴァリエーションがあり、より難問のときにそなえるための練習である

   n=kのとき 2^k > k とする。  k+1ときに、 2^(k+1)-k-1 = 2*2^k-k-1 > k-1 > 0

 これが誘導法というものである。この問題自明なので証明する必要がないが、誘導法が美しくて確実な証明であることを生徒に知らしめるための基礎である。現に、これを用いたとき

   k-1など、必ず >0とできる都合のいいものが出てくる。

  しかし、inductionは実に多くの種類があり、 いくつかの事実を指摘して例外的使用できるものや、補題に対して使用するもの整数に対する独自理論を編み出してそれに対しての

   使用成功する場合もあるなど、整数論に関して蓄積された多くのノウハウというかテクニックがあり、帰納法は奥が深いと言える。

  このように数学的帰納法使用例が大多数に及び、問題解決法の沃野形成して華々しい議論が陸続した経緯などは明らかではないが、整数論者が多くの問題に取り組む中で次第に

   発展していった分野であるともいえる。

2023-08-19

   極めて初等的な計算技術として平成6年に押方彰一から習ったのが1から10までの足し方であるけれど、実関数論で、単にf(f(x))を削除するためだけに、シンメトリーキャンセル

  という着想があり、これがどのような法思想に由来するのかが理解できない。おそらく伝来としては、三平方の幾何のあの定理、すなわち、a+bの正方形の中にcの正方形作成できる

  という幾何定理から来ているのではないかと思う。それを知っているからこそそのような着想が可能となるわけのものなので、2回目に、関数を2倍して消すのは簡単だけど、1回目の

  操作が難しい。シンメトリーキャンセルという技術は、幾何補題から、簡潔性、新規性必要最小限性を除外して残ったもののように思う。あの補題から、そういう要素を全部捨てたら

  何が残るか?シンメトリーキャンセルけが残ります。それを使ったら有効結論が出てくることが多い。だから、f(f(x))を消すときに使う人が多い。警察官の中にも、警察の力なめんなとか

  いいながら4人くらいでどつめる人がいますが、対称に囲い込んで消しているかどうかは分からない。対象者としても囲まれているくらいの気分しかないのではないか。そのシンメトリーキャンセル

  以外にも様々な定理補題から抽出された技術があると思いますが、整数論だと、12 operation法っていうのもありますが、あれは別の整数定理問題に由来していると思うので、

  その問題定理を知らないとそこから引き出してくることが難しいように思う。

2023-07-24

 Collarzでは、奇数だと、3倍して1を足しますが、整数で、次の数を考えますと、  MOD 2 で ≡1だから奇数でこの数を考えれば、∞のところでも成立している。

   よって体系としては、以下の特殊な数以外の全部の数で成立することを言わないといけない。しかしこの予想は非常に初等的なものなので、パソコンでもいくらでも計算

   できるわけですね。プログラムやらせたらどんなでかい数でも1にいくこと自体計算機によるという手段証明できてしまうし、上の事実から、∞のところでも定理は成立している。

   またこれは21だとその前が42だったはずなので、これを2倍していった奴も全部定理が成立する。しかしこの考察は小カテゴリーの体系として作ったのでこんななまぬるいことでは

   全部の自然数を埋められないので、この程度の小さい考察だとたけしさんに怒られるわけです。もっとビッグカテゴリーっていうんですかとにかく、ものを作らないといけないので、

   あ、それでですね、いわゆる超難問って全然規則性が分からないし解けないから、発見するのが難しい全然関係ない定理をつくってそれでズドンと落とすような感じでやるのですね

    それを、エレガントっていうわけですが、拳銃は撃つのはクソで、その拳銃発見して構成するところが難しいので、撃つのはどうでもいいわけです。Collarzの問題でも、

   何が腹が立つかといったら、一般のnでは結論が言えないから、やっぱりどこかに、それを言えるようなビッグ理論を持ってきてズドンとやる必要があるのですね

n | 1/3 (4^n - 1)

1 | 1

2 | 5

3 | 21

4 | 85

5 | 341

6 | 1365

7 | 5461

8 | 21845

9 | 87381

10 | 349525

2023-07-06

  命令:次の数字をはじき出すプログラムを書け。 a>b>c>d>0 の整数 で、

       ac+bd = (b+d+a-c)(b+d-a+c)

  を満たすような 整数 a,b,c,dを表示するもの

   言語BASICでもJAVAでもC++でもよい。 ただしBASIC計算能力は非常に低いので、小さい数で満足するものがないと思ったときは、JAVAC++を使え。

2023-07-04

11. 演習

Python勉強メモ

ゼロからPython入門講座

11. 演習

https://www.python.jp/train/exercise/index.html

 

以下、気になったところ。

 

スイカ割りゲームを作ってみよう

プログラムで実際に実行する手順や処理のことを、よく「手続き」といいます

 

手続き

cf. プロシージャ - Wikipedia

https://w.wiki/6ZsJ

プロシージャ (procedure)とは、プログラミングにおいて複数の処理を一つにまとめたものをいう。

手続きとするのが定訳である

一連の処理を意味を持った一まとまりにすることで、再利用性が高まりプログラム中に繰り返して現れる処理を1ヶ所で記述でき、プログラム保守管理を容易にする。

 

繰り返し利用されることからルーチンとも言う。

呼び出し関係は通常階層構造をなし、その最上位にある、プログラム全体のエントリーポイントを含むルーチンをメインルーチン、呼び出されるものサブルーチンと言う。

また、関数と呼ばれることもある(通常、数学における関数とは違ったものであるので、注意が必要である)。

 

乱数

乱数を生成する

Pythonでは、乱数を生成するときには random モジュールインポート します。

インポートしたモジュール関数は、モジュール名.関数名() の形式で呼び出します。

randrange() は、

 

random.randrange(開始値, 終了値)

 

形式指定すると、開始値以上かつ終了値未満(開始値乱数 < 終了値) となる乱数を生成します。

 

リファクタリング - マジックナンバーを避ける

プログラム機能そのままで、書き方を改善することを リファクタリング といいます

 

cf. リファクタリング (プログラミング) - Wikipedia

https://w.wiki/4iYa

リファクタリング (refactoring) とは、コンピュータプログラミングにおいて、プログラムの外部から見た動作を変えずにソースコードの内部構造を整理することである

また、いくつかのリファクタリング手法総称としても使われる。

ただし、十分に確立された技術とはいえず、また「リファクタリング」という言葉に厳密な定義があるわけではない。

 

主なリファクタリング

 

マジックナンバー

Pythonの慣例で、定数値の変数名は小文字のboard_size ではなく、BOARD_SIZE のようにすべて大文字します。

 

プログラム中にいきなり出てくる意味のわからない数字は、一般マジックナンバー といいます

基本的には、マジックナンバーは、値を直接書くのではなく、その値の意味がわかるように、常に 変数に代入してから利用するようにします。

 

マジックナンバー変数に代入せず、あっちこっちで使ってしまうと、あとでその値の意味がわからなくなってしまったり、値を変更するとき修正漏れが発生したりします。

 

cf. マジックナンバー (プログラム) - Wikipedia

https://w.wiki/6xRp

プログラムにおけるマジックナンバー(英: magic number魔法数字)とは、何らかの識別子もしくは定数として用いられる、プログラムソースコード中に書かれた具体的な数値である

そのプログラムを書いた時点では製作者は数値の意図を把握しているが、他のプログラマーまたは製作者本人がマジックナンバー意図を忘れたときに閲覧すると「この数字意味はわからないが、とにかくプログラムは正しく動く。まるで魔法数字だ」という皮肉を含む。

 

次のような理由で、マジックナンバープログラム中に含まれないことが好ましいとされる。

  • その数値の持つ意味がわかりづらい。
  • 数値を変更する場合に、複数の箇所を変更しなければならない可能性がある。

 

マジックナンバーを避けるため、マジックナンバーが書いてある箇所を定数や列挙型に置き換えるといった処置がとられる。

定数は意味のわかりやすいような名前を付けることができるため、一読して数値の意味理解できるからである

ここで、定数の初期化の際に右辺値に書かれる数値までマジックナンバーハードコーディングとは呼ばない。

 

ハードコーディング

cf. ハードコーディング - Wikipedia

https://w.wiki/4kSM

ハードコーディング英語: hard coding)とは、本来プログラム中に記述すべきでないリソースエラーメッセージなど)を、直接ソースコード中に埋め込むことである

これらは本来、外部ソースから取得するか、実行時に生成するべきものであり、これをソフトコーディング英語: soft coding)という。

 

具体例としては、固定された付加価値税が設定された電卓地球重力加速度が設定された体重計がある。

それらは付加価値税率が異なる共同体地球以外の重力場所では正常な値が取得できない。

 

今なら、高機能IDEを使えば、力技でハードコーディングを書き換えることも可能

 

適切なデータ型を使う

元のソースコードでは、スイカプレイヤー位置を、x座標とy座標それぞれ別々の変数として保持しています

しかし、スイカプレイヤーの座標は本来つの情報ですので、x座標とy座標で2つの変数に分ける意味はありません。

こういった場合

(x座標, y座標)

という形式の、2つの整数からなる タプル にするように、リファクタリング するのが良いでしょう。

 

関数活用する

主となる関数(ここでは suika_wari() ) と、

主となる関数が利用する補助的な関数 (ここではgenerate_position()、calc_distance()、 move_position())

を組み合わせて全体を構成する手法は、プログラムの開発でもっとも基礎的で重要テクニックです。

 

プログラムを開発するときには、

ということを考え、それぞれの機能関数として定義するようにしてみましょう。

 

主となる関数とは?

cf. エントリーポイント - Wikipedia

https://w.wiki/6xSV

エントリーポイントとは、プログラムを実行するうえで、プログラムサブルーチンの実行を開始する場所のこと。

プログラム全体のエントリーポイントとなる場所を含むルーチンがメインルーチンである

 

例えば、C言語の標準では、mainという名前関数(の先頭)がエントリーポイントであり、各関数エントリーポイントは、それぞれの関数の先頭である

 

まとめ

 

感想

以上で、Pythonの入門が終わった。

この教材のボリュームなら、数日で学習できる。土日とかに集中してやればサッと通過できるはず?

Python動作は、コード片をColabにコピペして実行すれば確認できるので楽だった。(あまり手を動かさなくても学べる)

次は、実用的なプログラムを書くためのノウハウTipsを学ぶ段階へ進もう!(中級編へ続く)

10. タプルとコレクション

Python勉強メモ

ゼロからPython入門講座

10. タプルとコレクション

https://www.python.jp/train/tuple/index.html

 

以下、気になったところ。

 

タプル

タプル

Pythonでは、複数データの組み合わせから構成されているデータ表現する場合、タプル という種類のオブジェクトを利用します。

タプル(tuple)は、組 などとも呼ばれ、複数の要素が決まった順番にならんだ値を指します。

 

タプルの書き方

タプルオブジェクトは、複数の値をカンマ , で区切って記述します。

 

タプルはカッコで囲む習慣

タプルは、要素となるデータを「 , 」で区切って記述できますが、「, 」だけだとちょっと見にくいので、通常は全体を丸括弧 () で囲んで記述します。

 

ningyocho = (35.686321, 139.782211)

kotoshi = ('平成', 2)

 

この括弧は必須ではありませんが、括弧なしでは読みにくく、間違いの元になる場合もあるので、通常は括弧をつけて記述する慣習になっています

 

タプルオブジェクトの要素を参照する

タプルオブジェクト登録したオブジェクトは、リスト と同じように 要素の順番 を指定して参照できます

 

タプルオブジェクト[要素の順番]

 

要素の順番 として指定する数値のことを、リストオブジェクトと同じように インデックス(添字) と呼びます

 

タプルの比較演算子

タプルは、数値や文字列と同じように、比較演算子 を使って他のタプルと値を比較できます

 

== 演算子でタプル同士を比較すると、同じ値のタプルならTrue を返します。

 

!= 演算子でタプル同士を比較すると、異なる値のタプルなら True、等しい値なら False を返します。

 

<、 <=、>、>= などの演算子で、タプル同士の大小を判定できます

 

タプル同士の値の比較は、先頭の要素から順番に同じインデックス同士の値を比較して、先に小さい値となったタプルが小さい値となります

比較するタプル同士の長さが異なる場合、短いタプルの要素と長いタプルの要素を比較してすべて等しければ、短い要素のほうが小さい値となります

 

タプルオブジェクト操作

タプルオブジェクト場合リストオブジェクトのように要素を変更することはできません。

タプルオブジェクトの要素を変更する場合は、リストオブジェクトのように要素を変更するのではなく、あたらしくタプルオブジェクト全体を作り直す必要があります

 

タプルとリスト

タプルとリストはとてもよく似ています

どちらも他のデータを格納できるコンテナオブジェクトで、格納した要素は数値をインデックスとして参照できます

リストにはデータを追加したり削除したりできますが、タプルは変更できません。

 

リストとタプルはどのように使い分ければよいのでしょうか?

 

タプルは複数データの組み合わせから構成されているデータのためのオブジェクトです。

決まったルール記述した、固定的な形式データです。

複数の要素から構成される独立したデータ をあらわすときは、タプルを使用します。

 

固定的な形式もつ独立したデータではなく、不定個数の独立したデータをたくさん集約してまとめておきたい、という用途には、リストが適しています

 

リストとタプルの使い分け

 

コレクション

コレクション

数値オブジェクトは、物質の重さや長さなど、いろいろなデータの値を直接あらわすオブジェクトです。

一方、 リスト辞書は、直接的なデータではなく、いろいろなデータ登録して、集約しておくために使われるオブジェクトです。

 

リストやタプル、辞書のように、他のオブジェクトを集約することを目的とした種類のオブジェクトのことを、

コレクション (Collection)

と呼びます

 

コレクション操作

コレクションに属するオブジェクトは、どれも同じように使える、共通の処理が用意されています

 

コレクションの要素数

コレクション登録されている要素の数は、len() 関数で調べられます

 

コレクション比較演算子

コレクションは、比較演算子 の == 演算子や != 演算子で、値が等しいかどうかを判定できます

 

in 演算子

in 演算子を使うと、コレクションに値が登録されているかどうかを調べられます

in 演算子は < や == のような 比較演算子一種で、

値 in コレクション

という式は、指定した値がコレクション登録されていれば True を、登録されていなければ False を返します。

 

辞書の in 演算子

辞書オブジェクト場合、in 演算子指定した キー登録されているかどうかを調べます

 

文字列の in 演算子

文字列オブジェクト場合も、in 演算子で中に文字が含まれいるかどうかを確認できます

 

for文

コレクションは、 for 文に指定して、コレクションの要素ごとに、for 文に記述した処理を実行できます

 

辞書とfor文

辞書オブジェクトを for 文に指定すると、辞書のすべての キー を取り出して、for文に指定した処理を行います

 

シーケンス

リスト・タプル・文字列はいずれも コレクション に属するオブジェクトですが、コレクション一種で、整数値のインデックス指定して要素を参照できるオブジェクトのことを、

シーケンス (Sequence)

と呼びます

 

コレクションシーケンスの違い

リストやタプルなどのオブジェクトは、コレクション一種で、他のオブジェクト登録し、集約できるオブジェクトです。

シーケンスとは、コレクションのうちで、集約する要素が一定の順序で並んでいて、その順序(インデックス)を使ってその要素を指定できる種類のオブジェクトのことを指します。

 

コレクションに属するオブジェクトでも、リストやタプルとは違って、辞書 は、順序を指定して要素を指定することはできません。

このため、辞書コレクションですが、シーケンスではありません。

 

 

シーケンス比較演算子

タプルやリスト文字列などのシーケンスオブジェクトは、 <、 <=、>、>= などの演算子で、値の大小を判定できます

シーケンスではない、辞書オブジェクトなどのコンテナオブジェクトは、 < などによる大小の比較はできません。比較すると、エラーとなります

 

コレクションのアンパック

コレクションのアンパック

代入式の右辺がコレクションなどの場合には、左辺に複数変数名を指定して、コレクションの要素を一括して変数に代入できます

コレクションの要素を一括して変数に代入する方法を、アンパック(unpack) といいます

 

(例)

list_obj = [1, 2, 3]

var1, var2, var3 = list_obj # var1, var2, var3 に、list_objの要素を順に代入

print(var1, var2, var3)

 

1 2 3

 

変数 var1、var2、var3 には、右辺のリストオブジェクトの要素が一つずつ順番に代入されます

この場合、var1 には list_obj の最初の要素である 1が、var2、var3 には、それぞれ2番目と3番目になる 2 と 3 が代入されます

 

アンパックを利用した代入は、Pythonプログラミングで頻繁に利用されます

 

アンパックは、複数の値を戻り値とする 関数 でよく使われます

 

関数計算した結果は、return文 を使って、戻り値として返します。

しかし、関数 total_and_average() は合計値と平均値の2つを計算しますが、 return文 に指定できる戻り値は一つだけです。

そこで、return文には (合計値, 平均値) のタプルを指定し、二つの値を一つのタプルにまとめて返り値とします。

 

(例)

def total_and_average(values):

  total = 0 # 合計値の初期値 0 を設定

  for value in values:

    total = total + value

  # データ件数を求める

  num = len(values)

  

  # 合計値 ÷ 件数平均値を求める

  average = total / num

  # 戻り値として (合計値, 平均値) のタプルを返す

  return (total, average)

 

戻り値としてタプルを使い、複数の値を一度に返す関数はとてもよく使われます

テクニックとして覚えておきましょう。

 

まとめ

8. オブジェクトとリスト

Python勉強メモ

ゼロからPython入門講座

8. オブジェクトリスト

https://www.python.jp/train/list/index.html

 

以下、気になったところ。

 

Pythonの型とオブジェクト

Pythonでは、整数実数文字列などのデータのことを、オブジェクト(Object) という用語で呼びます

Object英語で「物」とか「対象」とかい意味言葉ですが、Pythonでは、Python操作するいろいろな種類のデータプログラムなどのことを、まとめて オブジェクト と呼びます

 

オブジェクトの種類のことを、型 と呼びます

たとえば、数字の2は、整数型のオブジェクト文字列abc は、文字列型のオブジェクト という呼び方します。

次のプログラムは、関数 foo() を定義していますが、

def foo():

  print("hi!")

この foo も、 関数型のfooオブジェクト です。

import 文を使ってロードした モジュールオブジェクトです。

 

オブジェクト範囲

オブジェクトではないもの

演算子やwhile文 ・ if文 などはPythonに対する実行命令で、実体のあるオブジェクトではありません。

数値などの値のように、変数に代入したり、関数のように関数名を指定したりと、プログラマ名前をつけられるものオブジェクト

whileのようにつけられないものオブジェクトではない、

と考えると良いと思います

 

この説明だけでは、Pythonオブジェクトについて曖昧さが残りスッキリしない。

Python言語仕様で、オブジェクトはどうなっているのか?検索してみた。

 

google:python オブジェクト

 

cf.Python入門]Pythonオブジェクトとは - ITmedia

https://atmarkit.itmedia.co.jp/ait/articles/1907/12/news019.html

Python公式サイトにあるドキュメントオブジェクト、値、および型」では、Pythonにおけるオブジェクトとは「データ抽象的に表したもの」と表現されている。

まりPythonで書いたプログラム操作したり、処理したりするデータのことを「オブジェクト」という。

説明
int 整数」を表現する型
float 浮動小数点数」を表現する型
bool TrueFalseのいずれかの値を取り、真偽値(条件が成立しているかどうか)を表現する型
strUnicodeコードポイント値を任意の数だけ並べた「文字列」を表現する型(変更不可能
list 任意の型の要素を任意の数だけ並べた「リスト」を表現する型(変更可能
tuple 任意の型の要素を任意の数だけ並べた「タプル」を表現する型(変更不可能
dict キーと値の組からなる要素を任意の数だけ並べた「辞書」を表現する型(変更可能
set/frozenset任意の型の要素を任意の数だけ並べた順序のない「集合」を表現する型(setは変更可能。frozensetは変更不可能
function 関数」を表現する型
moduleモジュール」や「パッケージ」を表現する型

 

cf. 3. データモデルPython 3.11.4 ドキュメント

https://docs.python.org/ja/3/reference/datamodel.html#objects-values-and-types

Python における オブジェクト (object) とは、データ抽象的に表したものです。

Python プログラムにおけるデータは全て、オブジェクトまたはオブジェクト間の関係として表されます

(ある意味では、プログラムコードもまたオブジェクトとして表されます。これはフォン・ノイマン: Von Neumann の "プログラム記憶方式コンピュータ: stored program computer" のモデルに適合します。)

 

先に「プログラムデータ+処理」という話を挙げたが、

要するにPythonプログラムの中で処理(操作)できる対象すべてがデータであり、なおかつオブジェクトである」ということらしい。

 

上記の型の表を見ると、Pythonには「function」という関数オブジェクトもあるので、関数それ自体を1つのデータとして扱うことも可能

これを、「第一オブジェクト」という。

 

cf. 第一オブジェクト - Wikipedia

https://w.wiki/6wz4

第一オブジェクトファーストクラスオブジェクト、first-class object)は、あるプログラミング言語において、たとえば生成、代入、演算、(引数戻り値としての)受け渡しといったその言語における基本的操作制限なしに使用できる対象のことである

ここで「オブジェクト」とは広く対象物・客体を意味し、必ずしもオブジェクト指向プログラミングにおけるオブジェクト意味しない。

第一オブジェクトは「第一データ型に属す」という。

この言葉1960年代クリストファー・ストレイチーによって「functions as first-class citizens」という文脈で初めて使われた。

 

言語によって異なるが、第一オブジェクトは概ね次のような性質もつ

 

リスト

決まった順番に並んだ値で構成される情報は、Pythonでは リストオブジェクト表現します。

リストオブジェクトは、他のオブジェクトを 要素 として登録できるオブジェクトで、他のプログラミング言語では配列などと呼ばれることもあります

 

リストオブジェクトは、次のように 角カッコ [ と ] で作成します。

 

[要素1, 要素2, ...]

 

[ と ] の間には、リストの要素となるオブジェクトを、, で区切って指定します。

 

要素が登録されていない、空のリストは [] だけで作成します。

 

要素の参照

リストオブジェクト登録した要素は、次のような式で参照できます

 

リストオブジェクト[要素の順番]

 

リストオブジェクト登録した要素を参照するときは、リストオブジェクトに、参照する要素の順番を指定します。

最初の要素を参照するときは 0、その次は 1、のように指定します。

 

インデックス(添字)

ここで指定している要素の順番のことを、インデックス(添字) と言います

リスト最後の要素のインデックスは、リストの要素数 - 1 となります

 

インデックス(添字)は、1から始まるのではなく、0から始まる点に注意が必要

 

リスト操作

要素の挿入

リストに要素を追加するときには、リストメソッド である insert() を使用します。

 

挿入位置として、インデックスの最大値以上の値を指定すると、リストの末尾に要素を追加します。

 

要素の置き換え

登録済みの要素を別の要素に置き換えるときは、次のように記述します。

 

リストオブジェクト[インデックス] = 値

 

変数 の代入文とおなじ形式ですね。

代入文の左辺に指定できるインデックス値は、リストオブジェクト最後インデックス値 までです。

 

要素の削除

リストオブジェクト登録されている要素を削除するときには、del 文を使います

 

del リストオブジェクト[インデックス]

 

リストオブジェクトから指定したインデックスの要素を削除します。

del 文で指定できる要素のインデックスは、要素の置き換え と同じように、リストオブジェクト最後インデックス値 までです。

無効インデックス値を指定すると、エラーになります

 

while文を使ったリストループ処理

リストの長さを測るメソッド len()

リストオブジェクトの要素数を教えてくれる、len() という関数があります

関数 len() は、引数リストオブジェクト指定すると、その要素数を返してくれる関数です。

 

values = [1,2,3,4] # 要素数4のリスト

print(len(values))

4

 

for文によるループ

リストの要素を順番に参照する処理は非常によく行われるため、もっと簡単に書けるように、for 文 という、専用の文法が用意されています

 

for文の書き方

for 文は、次の形式記述します。

 

for 変数名 in リストオブジェクト:

  処理1

  処理2

  ...

 

for 文は、リストオブジェクト から要素を一つずつ順番に取り出し、それぞれの要素ごとに、for 文に続けて記述した処理を、一度ずつ実行します。

変数名 には、リストオブジェクトから取り出した要素を参照する変数名を指定します。

 

まとめ

2023-07-02

4. 条件式と分岐

Python勉強メモ

ゼロからPython入門講座

4. 条件式と分岐

https://www.python.jp/train/if_condition/index.html

 

以下、気になったところ。

 

条件式と分岐

コンピュータプログラムは、どんなに複雑そうにみえプログラムでも、細かく分解すれば次の3つの単純な構造の組み合わせで構成されています

1. 処理を上から順番に一つずつ実行する 順次処理

2. 条件によって処理を選択する 分岐処理

3. 条件が満たされている間、処理を繰り返す 反復処理

 

重要なことがサラッと書かれている。

これは一般的に「構造プログラミング」と呼ばれている考え方のことだ。

 

構造プログラミング - Wikipedia

https://w.wiki/3eS6

構造プログラミング(こうぞうかプログラミング、英: structured programming)は、コンピュータプログラムの処理手順の明瞭化、平易化、判読性向上を目的にしたプログラミング手法である

一般的には順接、分岐、反復の三種の制御構造(control structures)によって処理の流れを記述することと認識されている。

制御構造制御構文、構造化文(structured statement)、制御フロー文(control flow statement)とも呼ばれる。

また、プログラム任意に分割した部分プログラムサブルーチンコードブロック)の階層的な組み合わせによるプログラム構造化も指している。

このプログラミング手法の普及に貢献したのは、1968年計算機科学エドガーダイクストラによるACM機関紙への投書「Go To Statement Considered Harmful」と言われている。

 

前に「プログラムデータ+処理」という話をした。

プログラム構成する要素は、(1)データと(2)処理であり、構造プログラミングは、このうちの(2)処理に関する話という位置付けになる。

手続プログラミング命令プログラミング一種)では、処理を

  1. 順接
  2. 分岐
  3. 反復

という3つの動作組合せで作っている。

 

後で学ぶ関数型プログラミングでも、この3つと同じことができる動作が登場する。

参考までに手続型と関数型の基本動作について、対応関係を押さえておこう。

手続関数動作
順接 合成 処理をつなげていく
分岐パターンマッチ 処理を場合分けする
反復 再帰 処理を繰り返す

 

構造プログラミングの図解

構造プログラミングの仕組みは、文字でゴチャゴチャ説明されるよりも、目で図解を見た方が早いと思う。

Googleの画像検索で「構造プログラミング」を検索して、分かりやすそうな図解を探してみよう。

 

cf. 構造プログラミングの苦難の歴史

https://monoist.itmedia.co.jp/mn/articles/1008/17/news092.html

 

↑ちなみに、図解で出てくる流れ図みたいなのはフローチャート図」と呼ばれていて、プログラム構造を紙に書くときよく使われる書式である

 

比較演算子

値を比べる方法が紹介されている。

数値の大小は、比較演算子と呼ばれる記号で書ける。

 

増田比較演算子を書く方法

はてなアノニマスダイアリー通称増田)で記事を書く時、一部の文字エスケープされて元々の文字を表示できない。

検索したら回避方法が紹介されていた。

anond:20200114141823

増田記号を正しく入力するには、数値文字参照を使うんやで

&#38; → &

&#60; → <

&#62; → >

 

演算子 条件
a < b a は b より小さい
a <= b a は b と等しいか小さい
a > b a は b より大きい
a >= b a は b と等しいか大きい
a == b a と b は等しい
a != b a と b は等しくない

 

ブール型

真か偽かを示すデータの種類として、ブール型という新しい型が紹介されていた。

 

cf. ブーリアン型 - Wikipedia

https://w.wiki/3FSR

ブーリアン型(ブーリアンがた、英: Boolean datatype)は、真理値の「真 = true」と「偽 = false」という2値をとるデータである

ブーリアン、ブール型、論理型(logical datatype)などともいう。

2種類の値を持つ列挙型とも、2進で1ケタすなわち1ビット整数型とも、見ることもできる。

 

また、各種ブール演算を行うことができ、論理積 (AND、&、*)、論理和 (OR、|、+)、排他的論理和 (XOR、NEQV、^)、同値 (EQV、=、==)、非同値 (NEQV、<>、!=)、否定 (NOT、~、!) などの操作可能である

これらの演算ブール代数演算対応している。

 

cf. ブール代数 - Wikipedia

https://w.wiki/53JN

ブール代数(ブールだいすう、英: boolean algebra)またはブール束(ブールそく、英: boolean lattice)とは、ジョージ・ブールが19世紀中頃に考案した代数系の一つである

ブール代数研究は束の理論が築かれるひとつの契機ともなった。

ブール論理演算ブール代数の一例であり、現実の応用例としては、組み合わせ回路(論理回路)はブール代数の式で表現できる。

 

cf. 「Boolean」の翻訳を「論理型」とすべき3の理由 – Kenchant

https://senooken.jp/post/2016/03/21/2571/

プログラミング言語HTMLのようなマークアップ言語などプログラミングに関する文書を呼んでいるとboolean(ブーリアン)という単語に出くわす。

Booleanとは真(True)と偽(False)という2値をとるデータ型のことである

 

情報元によって、このBooleanの翻訳呼び方が異なっている。以下のように呼ばれたり訳され、最後に「型」や「値」がついたりつかなかったりする。

ブール、ブーリアン、真偽、論理、真理

 

このBooleanの呼び方としてどの訳し方がよいか気になったので調べた。

その結果「論理型」と訳すのがよいという結論が得られた。

その理由は以下3点だ。

 

1. Booleanはlogical data type(論理型)の特殊なケースであること。

2. JIS規格での翻訳採用数が一番多い。

3. 論理演算用語統一される。

 

Colabで比較演算子の働きを確かめてみよう。

10 < 100 # 10100より小さい

True

10 > 100 # 10100より大きい(間違い)

False

 

文字列の比較

文字列同士の比較では、人間感覚とはことなった比較結果となる場合があるので注意してください。

一般的には、半角の数字アルファベット比較は、次のような結果になり、安心して利用できます

 

1. 数字は、文字の0が最小、9が最大(0 < 1 < 2 < ... < 9)

2. アルファベットでは、a が最小、z が最大 (a < b < c < ... < z)

3. 大文字は小文字より小さい (A < a, B < b, ...)

4. 数字は、アルファベットよりも小さい (0 < 9 < A)

などのルールがあります

 

文字列の大小の比較に、ユニコードという文字一覧表を使っており、その文字コードの大小で比較しているという種明かしをしないと意味が分からないと思う。

種明かしをしていない、という意味で、この説明もあまり良くないと思った。

 

cf. python 文字列の比較 | Hello, Pygineer

https://knuth256.com/2021/09/20/python-%E6%96%87%E5%AD%97%E5%88%97%E3%81%AE%E6%AF%94%E8%BC%83%EF%BC%81unicode%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%81%A7%E6%96%87%E5%AD%97%E5%88%97%E3%81%AE/

文字列 (strインスタンス) の比較は、文字Unicodeコードポイントの数としての値 (組み込み関数 ord() の返り値) を使った辞書式順序で行われます

抽象文字レベルで (つまり人間にとって直感的な方法で) 文字列を比較するには unicodedata.normalize() を使ってください。

 

文字列の比較は、一致か不一致かを調べる場合が多いと思うので、大小の比較はあまり気にしなくても良いような気がする。

 

if 文 による条件分岐

条件による処理の分岐は、if 文 で行います

if 文は次のように記述します。

 

if 条件式:

処理1

処理2

...

 

このように記述すると、条件式 の結果が True になったとき、処理1、処理2、... が実行されます

条件式 が False場合は、処理1、処理2 は実行されません。

 

インデント(字下げ)

Pythonの書き方を特徴付けている1つが、この「インデント記法

 

if 文の書き方

if 文は、 まず if 条件式: という行で始まります

条件式の後ろに、: 記号必要ですので、忘れないように気をつけてください。

if 条件式: の次の行から、条件式が True となった場合に実行する処理を記述します。

 

インデント

条件が満たされたときに実行する処理は、行の先頭に スペース文字 を 4文字 入力してから記述します。

 

if a == 100:

  処理1

  処理2

  処理3

^^^^

スペースを4文字入力

このように、行の先頭にスペース文字を入れて段付けすることを、インデント と言います

インデントは、かならず スペース4文字 で行います

 

関数型プログラミング言語Haskell」でも、Pythonのインデントと似た「レイアウトルール」「オフサイドルール」という記法が用意されている。

 

cf. とほほのHaskell入門 - とほほのWWW入門

https://www.tohoho-web.com/ex/haskell.html#layout

レイアウト

Python の様にインデントを用いることで、{ ... } ブロックの { と } を省略することができます

 

main = do

 putStrLn "Red"

 putStrLn "Green"

 putStrLn "Blue"

 

話を戻すと、Pythonではインデント(字下げ)が文法的意味を持っており、省略できないということ。

Pythonでは、1つのブロックコードの塊)をインデント位置で束ねている。

 

他のプログラミング言語では、ブロックの開始と終了を表す記号(「{」と「}」など)がよく使われたりするけど、Pythonはその代わりにインデントを使う。

外見は見やすくなるけど、逆に言えばインデントを間違えたら、コード意味が変わってくるので、長所短所を両方併せ持った記法とも考えられる。

 

元々、Python教育用途言語としたスタートした歴史があるので、可読性を重視しており、誰が書いてもある程度同じようなコードになることが求められている。

その要求に対する答えの1つが、インデント記法ということだったのだろう。

 

else 節

関数型プログラミングの考え方を参考にする場合、if文を使った関数はelse節を省略しないで、True場合でもFalse場合でも、必ず戻り値を返すように設計しておいた方が良いと思う。

ifも文ではなく式として見るならば、評価した結果を必ず返すようにしておく必要がある。

副作用の有無に関わらず)TrueでもFalseでも、必ず値を返すようにしておけば、戻り値なし(void)を避けられる。

これは後々、例外処理の書き方などで効いてくるので、Pythonでもif文でelse節を省略しないで書けないか?考える習慣を身につけておきたい。

 

比較以外の条件式

特になし。

 

elif 節

特になし。

 

まとめ

3. 文字列と入出力

Python勉強メモ

ゼロからPython入門講座

https://www.python.jp/train/index.html

 

3. 文字列と入出力

https://www.python.jp/train/string/index.html

 

以下、気になったところ。

 

文字列と入出力

特になし。

 

文字列

特になし。

 

Pythonでは、文章人名などの文字からなるデータを、文字列 (string) といいます

いや、Pythonだけじゃなくて、他のプログラミング言語でも、文字からなるデータは「文字列」って呼ぶだろ?

文字列は、Python専売特許じゃねえだろ?

初心者勘違いさせるような言い方してんじゃねーよ?

 

文章人名など、文字からなるデータソースコードに書く場合には、数値と違って、文字前後を "(ダブルクォテーション) か '(シングルクォテーション) で囲んで記述します。

文字列は、とりあえずダブルクオーテーションで囲むと。

 

文字列演算子

文字列同士の足し算は、文字列の連結になります

文字列の "ABC" と "DEF" を足すと、"ABCDEF" になります

 

"ABC" + "DEF"

'ABCDEF'

 

データ型の違い

データには種類があり、数値型とか文字列型とかがある。

これはPythonに限った話ではなく、プログラミング言語全般共通の話。

数値型同士のデータ四則演算ができるけど、違う型のデータでは四則演算ができない。

 

文字列と数値

データ型を他のデータ型に変換することを「型変換」とか「キャスト」(cast)などと言ったりする。

Python 型変換」で検索すると詳しい解説が出てくる。

 

文字列の数値化

数字だけからなる文字列は、次のように int() を使って整数に変換できます

text = "123"

int(text)

123

 

数値の文字列

int() を使って文字列整数に変換するのとは逆に、str() を使って数値を文字列に変換できます

num = 123 # 整数

str(num)

'123'

 

処理するデータの型違いによるエラーは、基本的なうっかりミスの1つなので、常に型は意識してデータを扱いたい。

特にPythonのような動的型付け言語は、型を意識しなくてもプログラムが書けてしまうが、その分バグになりやすいので注意が必要だ。

いちいち型を気にするのは面倒くさいので、「型推論」というズボラな人向けの機能もある。

 

型推論 - Wikipedia

https://w.wiki/6wB2

型推論(かたすいろん、英: type inference)とはプログラミング言語機能の1つで、静的な型付けを持つ言語において、変数関数シグネチャの型を明示的に宣言しなくても、変数宣言における初期化のための初期値や、関数呼び出しにおける実引数などといった、周辺情報および文脈などから自動的に(暗黙的に)各々の型を決定する機構のこと。

言語によってはtype deductionと呼ばれることもある。

 

推論に失敗するとその時点でエラーを報告できるため、少なくとも誤った型を用いることによるバグ回避できる。

また、アルゴリズム記述に集中できるのでプログラム抽象度が上がるというメリットもある。

ただし型推論関数の多重定義オーバーロード)は相性が悪く、オーバーロードサポートする言語では型推論による恩恵が十分に受けられない(型推論ではシグネチャを一意に決めることができない)ケースがある。

 

Pythonには型推論機能がないので、プログラマーが工夫して型によるバグをなくすしかない。

Python 型推論」で検索すると、いろいろなTipsが紹介されている。

 

PythonVSCode型推論結果を自動で表示してくれるようになった【TypeHinting】

https://zenn.dev/yosemat/articles/36638f17e9ded8

 

最初のうちは、型によるエラーはあまり気にしなくても良いと思う。

エラーが出たらその都度つぶしていけばいいし、あとでテスト方法を学んだら、型を検査する方法も分かってくるはずだ。

 

print() 関数

特になし。

 

print() 関数は、引数として指定した値を画面に出力します。

 

input() 関数

特になし。

 

input() 関数を使うと、キーボードを使って、文字列データ入力できます

 

メソッド

嘘の説明があるなー。

初心者向けに便宜的な説明をしておこう、という趣旨は仕方がないかもしれないけど、後で訂正するというか、詳しく説明するという注意書きは必要だろう。

 

文字列などのデータには、そのデータ操作するための、専用の 関数 が結びついています

データに結びついた関数のことを、メソッド と呼びます

 

何が嘘かって、用語定義問題なんだけど、「メソッド」という言葉一般的に、オブジェクト指向プログラミング用語で、クラス定義されている関数のことをメソッドと呼んでいる。

しかし、教える順番として、クラスとかオブジェクトは後の方に出てくるなら、今の段階ではメソッドをどう説明すればいいのだろうか?

Python文字列は、実はStringクラスオブジェクトであり、Stringクラスには文字列操作するための様々なメソッド(処理)が用意されている、ということをクラス説明なしにするのは、ややこしいかもしれない。

なので、オブジェクトのことをここではざっくりと「データ」という言い方でごまかしている。

私のようなPython素人場合もっと良い説明方法が思い浮かばない。

とりあえず、ここではメソッドデータに紐づけられている関数ということにしておこう。

 

メソッド関数一種です。これまで見てきたように、特定データに結びつき、

データ.メソッド名()

形式で呼び出してデータ操作する関数を、メソッド と呼びます

メソッド は、結びついている データ対象として、処理を行います

 

念のため、この教材のオブジェクト説明を見てみた。

8. オブジェクトリスト Pythonの型とオブジェクト

https://www.python.jp/train/list/index.html

Pythonでは、これまで紹介してきたような、整数実数文字列などのデータのことを、オブジェクト(Object) という用語で呼びます

Object英語で「物」とか「対象」とかい意味言葉ですが、Pythonでは、Python操作するいろいろな種類のデータプログラムなどのことを、まとめて オブジェクト と呼びます

 

ここまで読んで、はじめてデータの種明かしがされて、Pythonデータオブジェクトであり、オブジェクトに用意されているメソッドが使えると。

せめて「詳しくは第8章のオブジェクト説明を読んでね」ぐらいは書いておいた方が良いと思う。

 

あと、オブジェクト説明もあまり良くないと思う。

なんでオブジェクトというデータ構造、仕組みを用意するのか?という根拠説明がスッポリと抜け落ちている。

一般的オブジェクト指向プログラミングOOP)の説明方法、教え方は様々だが、単純にはC言語構造体が出発点であり、「データに処理をくっつけたもの」という説明でいいだろう。

ちなみに、その反対に「処理にデータをくっつけたもの」をクロージャ―という。

オブジェクトクロージャ―もPythonだけの仕組み、話ではないので、他にもっと分かりやす説明方法があれば、そこから引用した方が良いだろう。

 

問題説明の順番で、前提となる知識がない段階では、どのようにごまかした説明で切り抜け、後で詳しい種明かしをするか?という教え方の設計インストラクショナル・デザイン)が問われている。

まりうまくごまかせていないところを見ると、もしかしたらPythonを教えている教師たちは、あまり頭が良くないのかもしれない?

 

まとめ

2. Python基礎の基礎

Python勉強メモ

ゼロからPython入門講座

https://www.python.jp/train/index.html

 

2. Python基礎の基礎

https://www.python.jp/train/type_and_func/index.html

 

以下、気になったところ。

Python基礎の基礎

特になし。

 

プログラミングは、次のステップの繰り返しです。

1. ソースコードを書く

2. ソースコードを実行する

3. 結果を確認する

4. 結果が間違っていたら 1. に戻ってソースコード修正する

 

この教材は小学校高学年から中学生ぐらいの子が読んでも理解できるようなレベルにかみ砕いて説明してくれているように思われる。

良心的だが、全くの初心者だった場合、もうちょい補足説明があっても良いような気がした。

 

補足コラム

勝手に補足すると、プログラム構成要素は、

  1. データ
  2. 処理

の2つがある。

まりプログラムとは、(1)データと(2)そのデータを処理する、という2つのパートから成り立っている、ということ。

 

プログラミングの入門では、データに関する説明と、処理に関する説明の基本が説かれているが、これはどのプログラミング言語でも共通している話なので、そこら辺を明示的に説明した方が、迷子にならなくて済むと思う。

「今話しているのは、データに関する話なんだな」とか「今話しているのは、処理に関する話なんだな」とか、構造的な理解が伴えば、プログラミング学習は非常にすっきりした見通しの下で進められる。

プログラミング習得済みの人にとっては、あえて言うまでもない前提のような話であっても、意外とこういうところに引っかかってしまい、理解が進まない子もいるだろう。

 

このPython教材を読み進めるときデータ説明や処理の説明が出てくるので、学習マップ全体の中で、位置付けを明瞭にしながら知識を押さえていきたい。

 

れんしゅうもんだい

特になし。

 

Pythonの式にはかっこも使えますから、式を囲って少し見やすくしてみましょう

(100 * 5) + (40 * 8)

 

ここら辺は、算数計算式と同じですね。

 

整数実数

四則演算は、掛け算と割り算で使う記号算数と違う。

 

Pythonでは、べき乗に「**」という記号を使う。

他のプログラミング言語の中には、べき乗に「^」という記号採用している場合もあるので、混同に注意。

 

cf. べき乗演算子「^」の謎

http://blog.media.teu.ac.jp/2021/08/post-89817a.html

「^」を冪乗演算子として採用しているプログラミング言語はそれほど多くないのです。

有名どころな言語の中では Visual Basic, R, Haskell くらい

 

浮動小数点数(floating point number)

cf.浮動小数点数】をわかりやす説明

https://it-lab.com/column/floating-point-number/

浮動小数点数とは

小数表現方法の一つ。

対義語は「固定小数点数」。

一般的に2進数を扱うコンピューターで利用されている。

 

小数点の位置を変えて表現するため”浮動(動く)”の小数点と言われる。

固定小数点数小数点の位置が固定されて表現されている。

 

整数除算

割り算関係記号まとめ

 

割り算

11 / 3

3.6666666666666665

 

余りだけを求める

11 % 3

2

 

商だけを求める

11 // 3

3

→この「//」が整数除算

 

cf. 除法 - Wikipedia

https://w.wiki/4A9d

 

変数

Pythonでは、計算の結果に名前をつけて参照できます名前をつけるときは、 = 記号を使って、次の形式記述します。

 

名前 = 式

 

この名前のことは 変数 といい、= を使った行を 代入文 といいます

 

これは、上記の補足コラムでいうところの、データに関する話。

 

いよいよ命令プログラミングの最大の欠陥である「代入」の登場だ!!!

代入は「副作用」を引き起こす代表例であり、バグの温床となっている。

命令プログラミングは代入(=副作用)を使いまくってプログラムを書くが、後で宣言プログラミングを学べば代入なしでもプログラムを書けることが分かる。(命令型:値の代入≠宣言型:値の束縛)

Pythonは定数がないクソ言語であることを最初から指摘してしまうと、Python勉強する意欲が萎え可能性もあるので、ここでは気にしないで通り過ぎておこう😭

 

ChatGPTによる補足

Pythonには定数はないので、変数名を大文字で書くことで定数のように扱うことができます

PEP8というPythonのコーディング規約には、定数を表す場合大文字アンダースコアで書くことが推奨されています

例えば、下記のように定義します。

 

PI = 3.14

print(PI) # 3.14

 

上記のように、変数名を大文字で書くことで定数のように扱うことができます

(定数ぐらい言語仕様に入れとけや!と思いました…)

 

予約語

プログラミング言語には「予約語」といって、プログラミング言語使用してしまっている文字列がある。

プログラマーコードを書くとき変数名として予約語は使えないので、注意が必要だ。

 

cf. 予約語 - Wikipedia

https://w.wiki/6w28

予約語(よやくご、英: reserved word)とは、プログラミング言語などの人工言語仕様に定められているもので、ユーザープログラム開発者自分で付ける識別名としては利用できない特定文字列のこと。

たとえば変数名や関数名などに使用することができない、とあらかじめ定められた文字列単語、字句など)のこと。

あるいは、プログラミング言語などにおいて、固定された意味を持っており、その結果、プログラマーの側ではその意味を再定義できない語。

 

Pythonでも「if」「while」などの予約語があり、これらは最初からPythonで内容が決められており、プログラマー勝手に内容を変更することができない。

 

コメント

コメントは、プログラムコード中に書けるメモや注記のこと。

Pythonコメントシャープ「#」の記号を使い、#の後ろに書いた文字コメントになる。

 

コメントアウト

コメントには、デバッグで使う用途もあり、ある行を無効化するときコメントを使う。この使い方を「コメントアウト」という。

多分、この話は後で出てくるんだろうと思うけど、プログラム中にコメントを書ける機能大事ということ。

 

関数

関数は、英語でいうと「function」。

この教材の説明だと、学生(小中高)には分かりづらいのではないか

まず、算数数学でいうところの「関数」と、手続きプログラミング言語の「関数」はちょっと違う、という点を明示しないと、同じ用語でも中身が違うので混乱する。

関数プログラミング言語の「関数」は、算数数学の「関数」(写像)とほぼ同じ意味なので混乱しないで済むだろう。

 

そこら辺の前提をぶっ飛ばし説明しているプログラミング教材は、子ども理解力が低い(バカ)から余計なことを言って混乱させないようにしようと思っているのかもしれないが、それは貴様の子ども時代バカだっただけで他の子もも貴様と同様にバカとは限らないことを理解しなければならない。

 

さて、話を戻すと、上記の補足コラム関係して、データと処理の関係を見てみよう。

データと処理の関係は以下のようになっている。

 

(1)入力データ → (2)処理 → (3)出力データ

 

この流れの(2)の「処理」が、「関数」だと思ってもらえばいい。

 

ChatGPTによる説明

Q:プログラミング関数数学写像関係説明してください。

 

A:

プログラミングにおける関数数学における写像は、入力を出力に変換するものであるという点で共通しています

関数は、プログラム内で再利用可能コードブロックであり、入力を受け取り、処理を実行し、出力を返します。

一方、写像は、数学的な概念であり、一つの集合から別の集合への対応関係を表します。

まり写像入力と出力のペアの集合であり、それぞれの入力に対して一つの出力が対応しています

 

関数写像は、同じような概念であるため、多くの場合、同じように扱われます

しかし、関数一般的数値計算プログラミング使用される一方で、写像は主に数学的な概念として使用されます

 

cf. 写像 - Wikipedia

https://w.wiki/6w3S

写像(しゃぞう、英: mapping, map)は、二つの集合が与えられたときに、一方の集合の各元に対し、他方の集合のただひとつの元を指定して結びつける対応のことである

関数、変換、作用素、射などが写像同義語として用いられることもある。

 

Python組み込み関数であるabs」は、絶対値を求める関数として定義されている。

abs(-200)

200

 

上記の流れに当てはめると

(1)入力データ: -200

(2)処理: abs絶対値を求める関数

(3)出力データ: 200

にそれぞれ該当している。

 

この教材の関数説明に当てはめると、

(1)入力データが「引数

(2)処理が「関数

(3)出力データが「戻り値」(返り値)

となっている。

これは単に用語定義呼び方問題なので、そういうもんだと思えばいい。悩む余地はない。

 

手続き型の「関数」(function)は、実際には写像mapping)ではなく、手続き(procedure)なので、(3)出力データがない場合もある。(戻り値がない=void場合副作用を使うだけの場合戻り値がない)

高校数学を習わないと関数プログラミング宣言プログラミング)は理解しづらいので、小学生中学生の段階では仕方なくPythonのようなゴミ言語プログラミングを学ぶしかないのだろう。

 

モジュールとimport

特になし。

 

Pythonはとても多機能プログラミング言語で、いろいろな機能をもった 関数 を、簡単につかえるように用意してくれています

その機能の数はあまりにも多いので、使いやすいように目的や種類ごとに分類して提供されます

こういった、Python機能を分類する単位を、モジュール といいます

 

例えば、三角関数対数など、多くの数学関連の機能は、mathという名前モジュールに分類されています

モジュールに入った関数を利用するときには、まずそのモジュールを import 文で インポート します。

 

そのまんまだね。

  2012年だかのIMOの第6問の整数問題は悪問だったのかというと疑問なしとしない。模範解答はいわゆるMessy手法と言われながらも完全な証明が書いてあり

  もしこれで解けるとすれば解けた人が大量に上っただろうからそもそも第6問に悪問が配置されることはないし、どんなに悪問でも世界中の猛者がよってたかって数人しか

   解けないとすればその論証中に、驚愕的な要素が入っていることは明らかなので

2023-07-01

ゼロからPython入門講座

https://www.python.jp/train/index.html

目次

 

1. Python初体験

Colabの使い方と、Pythonの実行方法を学びます

  1. Python初体験
  2. Google Colab の準備
  3. はじめてのPython
  4. エラーになったときには
  5. プログラムソースコード
  6. コードセルテキストセル
  7. ばえるPython
  8. はたらくPython
  9. この章のまとめ

 

2. Python基礎の基礎

Pythonデータと式の基礎を学びます

  1. Python基礎の基礎
  2. れんしゅうもんだい
  3. 整数実数
  4. 変数
  5. コメント
  6. 関数
  7. モジュールとimport

 

3. 文字列と入出力

Pythonテキストデータ簡単入力・出力方法を学びます

  1. 文字列と入出力
  2. 文字列
  3. 文字列演算子
  4. 文字列と数値
  5. print() 関数
  6. input() 関数
  7. メソッド

 

4. 条件式と分岐

if文を使って、データに応じた処理を行う方法を紹介しま

  1. 条件式と分岐
  2. 比較演算子
  3. 文字列比較
  4. if 文 による条件分岐
  5. else 節
  6. 比較以外の条件式
  7. elif 節

 

5. ブール型と論理演算

論理演算の基礎を解説しま

  1. ブール型と論理演算
  2. ブール型
  3. 論理演算
  4. and 演算子
  5. or 演算子
  6. not 演算子

 

6. while文による繰り返し

while文による処理の繰り返しを解説しま

  1. while文によるループ
  2. break文による中断
  3. 代入文と等号
  4. continue

 

7. 関数定義

独自関数作成と、呼び出し方を学びます

  1. 関数定義
  2. ローカル変数グローバル変数
  3. 関数の呼び出し方

 

8. オブジェクトリスト

リストを使って、一連のデータ操作する方法を紹介しま

  1. Pythonの型とオブジェクト
  2. リスト
  3. リスト操作
  4. while文を使ったリストループ処理
  5. for文によるループ

 

9. 辞書オブジェクト

辞書を使ったデータ検索を紹介しま

  1. 辞書
  2. 辞書操作
  3. in 演算子

 

10. タプルとコレクション

タプルオブジェクトの使い方を紹介しま

  1. タプル
  2. コレクション
  3. シーケンス
  4. コレクションのアンパック

 

11. 演習

これまでに紹介した知識を使って、簡単プログラムを書いてみましょう

  1. スイカ割りゲームを作ってみよう
  2. リファクタリング - マジックナンバーを避ける
  3. 適切なデータ型を使う
  4. 関数活用する

2023-06-27

anond:20230627011613

ついつい受験数学YouTuberちゃうけど整数問題がぶっちぎりで多い印象。

微積もそこそこ見る。

ベクトル全然見ない。

2023-06-26

https://anond.hatelabo.jp/20230626193706

  別に不快じゃねえだろ。東大入試数学が最高だと思っていて、円錐を斜めに切ったときの断面が二次関数でその面積を求めることが難しい問題だと思っていたら、

  くだらん作業をさせられていたことに気づいたときの方が腹が立つ。

    IMO整数の超難問で、Lemmaを2つ見つけるという驚愕発見でできますみたいな、ゲーム的に面白いもの存在があると知らされたときの方がむかつく。

   数学人間の頭の中に存在する価値のあるルールに即したゲーム面白いけど、体育なんかゲームでもなんでもないしくそまらん。

2023-06-21

  んーとそれで、弁護士の古城とかもちゃん山田朋美ってなんか2ちゃんねらーみたいな感じだから、古城が越谷支部接見に来て、準抗告でもなんでもするとかいうのですね、あと、

   検察官にも言いに行くみたいなことをいう。しかし、古城が検察官の部屋にいいに行っても、山田が、絶対起訴する、許さない、と言ったらしいのですね。あとそれから山田から

  他に言われたことは何もないというか、刑務所に行く可能性が高いんでしょということと、3回しか呼ばなかったのはクソフェミからだと思うのですが。当時私は体重が86キロあったんで

    単に山田が見たくないから3回しか呼ばなかったと思うのですね。あとそれ以外に、埼玉地方検察庁越谷支部って、さいたま地方検察庁の中でも越谷にある支部から

  一般的にはださいんですね。警察の車の中からみても、特になんという印象もないし、一般人として行ってみても古いし汚いしつまらないところです。印紙売り場っていうんですかそれもあります

   職員は苛ついているしよく分からないところである。それで検察官について言う事と言えば基本的検察官って尋問テクニックをやる人だから法令上の技術幾何技術とすると、検察官

  仕事はよく分からないが、整数とか代数にみられるような操作上のテクニックではないかと思う。幾何技術っていうのは構成するとき教科書に書いているものをもってくることが多いが、

   整数とか代数っていうか、不等式とか実関数論はalgebraだと思いますが、algebraのテクニックってものを持ってくるんじゃなくて計算のやり方が凄いところが多分にあるのではないか

    裁判官が高邁な人格による法解釈テクニック必要とすると、検察官計算上のテクニック必要だと思うのですが、全く知らんのですが、でもそういえば数学者植田一石がやてるのは

  ダイマ模型で、ダイマーって組み合わせ論大人版みたいな奴で、組み合わせ論って、induction hyposhesisとcontradictionの組み合わせみたいなものもあるのでやっぱり計算が多いか検察官

   向けだと思うのですが、あ、それから弁護士の古城からは、法律というのはそういうものだと言われて、それだけだと理解できないので後から前橋地検に行ったとき検事土屋からテクニック

  だけど存在しないとか言われて、その際の印象として、地検検事だけ生きているけど、高検検事とか最高検検事が死んでいるみたいな印象を受けたのですが、検察尋問技術って検察官しか

   そういうテキストブックを読まないので何が書いてあるのか知りませんが、検事土屋が、検事のすることはテクニックかいって、一方で判例六法は投げてきたので、じゃあ判例六法テクニックでは

  ないのかとか言われても分からないのですね。

2023-05-02

anond:20230502010112

同じ減り続ける(単調減少)でも、減り方が加速するのか、減り方が緩和するのか、それによって未来はかなり変わってくる。

から、減り続けるのかそうでないか二元論で考えるのではなくて、事態連続体として捉えるべきだよ。

実際に出生率の数値は、0、1、2、みたいな整数じゃなくて 1.33 とかの実数だし。同じ減り続けるのでも1.3 くらいと 1.8 くらいとではだいぶ違う。

2023-04-26

TBSニュースサイトヤバない?(追記)

はてぶの上位にちょいちょい載ってるTBS系のニュースサイト、newsdig.tbs.co.jpについて。

https://b.hatena.ne.jp/site/newsdig.tbs.co.jp/


何がヤバいかって、くっそ巨大なCookie(LocalStorageとかも含むのか知らんけど)をしこたま保存してんのよ。

気付いた時点では640MB占有してた。別に巡回チェックしてるわけでもなく、話題に挙がってたら見てみることもある程度のアクセス頻度なのだが。

Chromeユーザーアドレスバーに↓コピペして確認してみてくれ。

chrome://settings/content/all?searchSubpage=tbs.co.jp&amp;search=cookie


試しにCookie消去してから、ただ開いただけでサイト上で何の遷移もしてないのに279MBも保存された。


次点ではpresident.jpが553MB消費してた。(こっちも話題に挙がってたら見てみることもある程度。)

(その次にはGoogleが数百MBオーダーで消費してたけど、これはGoogleドライブのオフラインキャッシュとか考えれば妥当。他に数百MBオーダーで消費してるサイトは無かった。)


多くのサイトは数バイトKBオーダーなのに、こいつら何保存してんのか不気味すぎる。


(追記)

各自環境消費量を教えてくれた方々や有意義コメントを下さった方々ありがとうございます

始めにお断りしておくべきだったかもしれませんが、自分ソフトウェア系ではありますが、Webエンジニアではありません。認識が浅かったり、古かったり、そもそも間違ってる可能性もあります

CookieじゃなくてCacheStorageやんけと突っ込みもいただいていますが、「LocalStorageとかも含むのか知らんけど」と書いておいた意図は(どのような技術要素かはどうでもよくて)ユーザー端末に保存されるデータボリュームについての話を意図していますChromeCookie絡みの設定画面での表示なのでこのような書き方をしましたが、解り難かったのならごめんなさいね冗長ながらも認識齟齬を招かないように平易な表現で書くと、「ユーザの明示的な承諾なくユーザー端末に保存されるデータデカイんだが」って話です。


で、各自環境で「ユーザの明示的な承諾なくユーザー端末に保存されるデータ」が数GBオーダーにも及ぶという事例が少なからず報告されて、自分環境だけではない事象だということが判りました。

さらtbspresident以外にもいくつかのサイトが同様に肥大化していることも知れました。


結果的にはid:hinaloeさんの解説が解りやすかったです。ありがとうございます

https://blog.hinaloe.net/2023/04/27/chrome-too-large-cache-storage/

CacheStorageがChromeの表示と、実際のディスク消費量と一致していないことが原因である理解しました。

追試してみたところ私の環境ではChrome開発者ツールでの表示が74MBで実際のWindowsファイルシステム上は33.9MB消費されました。

実際のストレージの消費は表示値の半分程度ということになり、id:hinaloeさんの1.4GBに対して5MBのように実際の約0.3%という結果とは大きく乖離がありますので、各環境で大きく違いそうな気がします。

気になる方は↓を各自確認いただくとよいかと思います

%USERPROFILE%\AppData\Local\Google\Chrome\User Data\Default\Service Worker\CacheStorage

配下のどのディレクトリ対象サイトのものなのか一意に特定する情報が無さそうなので、Chrome開発者ツールApplicationタブの左上の方にあるService Workersを選択すると、右側にReceived YYYY/M/D HH:MM:SSみたいな表記が有るので当該時刻に変更されたタイムスタンプを持つディレクトリ特定するような感じになるかと思います


ついでに開発者ツールを触っていて気付いたベースで書いておくと、

といった感じで、ユーザが見たものキャッシュしているのではなくて、先読みしてるような挙動に思えます

ロード時間短縮でUX改善を狙ったものかもしれませんが、個人的にはそれを1か月も保持し続けるのは過剰な感じがしますが世の中的にはどうなんでしょうね?

あと、スマホ場合挙動どうなってんすかね?


(追記2)

hinaloe氏の投稿で紹介されているStackOverflowの投稿やそのリンク先のChromiumバグレポートのやり取りまで目を通してみると、特に理由説明なく平均7MBがパディングされると書かれた投稿があります

https://stackoverflow.com/questions/39109789/what-limitations-apply-to-opaque-responses

https://bugs.chromium.org/p/chromium/issues/detail?id=796060


該当するソースコードは↓のようです。

https://source.chromium.org/chromium/chromium/src/+/main:content/browser/cache_storage/cache_storage_cache.cc

この中で、ComputeRandomResponsePadding()という関数を呼び出しておりその実体は↓のようです。

https://source.chromium.org/chromium/chromium/src/+/refs/heads/main:storage/common/quota/padding_key.cc;drc=332f92aab4a32607f7813ac1a824f6ff0d86c369;l=47


この関数符号無し64bit整数乱数(つまり、0~18446744073709551615のいずれか)を14431 * 1024 = 14777344で割った剰余(つまり、0~14777343≒約14MiB)を返却します。

これがパディング値として採用されることになりますが、乱数正規分布している前提で、平均すると(最大値14MiBの半分で)約7MBになるよねってことだと思われます


故にChromeの設定画面から確認できるCookie等(LocalStorageとかCacheStorageとか諸々含む)のサイズは、概算してCacheStorageに存在するファイル数×平均7MBが過大計上されていることになりそうです。

これでChromeの設定画面から確認できるサイズと、実際のファイルシステム上で消費されているサイズの違いは合理的説明できますが、TBS等の特定サイトだけデカみえ理由説明にはならないのです。

まり、以下のような可能性がありそうです。

  1. Chromeの設定画面から確認できるサイズほど巨大ではないが(他のサイト比較して)相対的デカイ?
  2. ComputeRandomResponsePadding()の結果が顕著にデカくなる乱数が生成される個別要因がある?
  3. それ以外

なんなんすかね?

2023-04-22

ブラのカップ表記C++かにするべき18の理由


1. C++プログラミング言語として有名であり、ブラのカップ数をC++表記することで、テクノロジー精通していることをアピールできる。

2. C++はCよりも高度な機能を持っており、ブラのカップ数をC++表記することで、自分バストの質や機能性を高めることができる。

3. C++オブジェクト指向プログラミングサポートしており、ブラのカップ数をC++表記することで、自分バストオブジェクトとして扱うことができる。オブジェクト指向プログラミングでは、オブジェクト属性メソッドを持たせることができるので、自分バストにも色や形や大きさなどの属性や、揺れるや揉むや吸うなどのメソッドを持たせることができる。

4. C++は多重継承サポートしており、ブラのカップ数をC++表記することで、自分バスト複数クラスから継承することができる。多重継承では、複数クラスの特徴や機能を組み合わせることができるので、自分バストにも様々な特徴や機能を組み合わせることができる。例えば、自分バスト芸能人アニメキャラクターなどのクラスから継承することで、その人物キャラクターバストに似せることができる。

5. C++テンプレートサポートしており、ブラのカップ数をC++表記することで、自分バストテンプレート化することができる。テンプレートでは、型や値などのパラメータ指定することで、汎用的なコードを生成することができるので、自分バストにも型や値などのパラメータ指定することで、汎用的なバストを生成することができる。例えば、自分バストをint型やdouble型などの型に指定することで、整数小数などの値に変換することができる。

6. C++例外処理サポートしており、ブラのカップ数をC++表記することで、自分バストに発生する可能性のある例外対処することができる。例外処理では、エラーや異常などの例外が発生した場合に、適切な処理を行うことができるので、自分バストにもエラーや異常などの例外が発生した場合に、適切な処理を行うことができる。例えば、自分バストが垂れたり痛んだりした場合に、修正したり治療したりする処理を行うことができる。

2023-04-08

グラデーションではなく切り捨て、捨象で自分にラベルを貼りなさい

そう思うそう思わないのスケールは1~5までの整数である

小数もないし条件別に複数選択はありえない

すべての時と場合ありとあらゆる状態で当てはまる数字を選ぶだけ

その数字の枠内で生きる

自己評価は1,2,3,4,5の数字だけで評価される

切り捨てられる小数点以下の数字や気づいていないパターンでならこういう数字だったのにというのはゴミである、余計な攪乱項である考察材料ではないので破棄される

聞かれていないことは0点である

東大受験試験科目以外の点数は問われない

受験だけ考えるならスポーツでの成績が勘定に入らないなら0点で宅浪帰宅部同値である

2023-03-26

関数型プログラミング言語Haskellで、圏論の「対象」「射」「関手」「自然変換」に対応する要素は何ですか?圏論の可換図式を用いて説明してください。

Haskellにおける圏論概念対応する要素は、以下のようになります

 

1.対象

 Haskellにおける対象は、型です。

 

2.射

 Haskellにおける射は、関数です。

 

3.関手

 Haskellにおける関手は、型の変換や関数の変換を表すものであり、データ構造関数型のライブラリでしばしば使用されます

 例えば、リストMaybe型のmap関数関手の例です。

 

4.自然変換

 Haskellにおける自然変換は、関手間の射を表します。

 自然変換は、関手が保持する構造を保ちつつ、ある関手から別の関手へと変換する操作です。

 例えば、リストからMaybeへの変換を行う自然変換は、リストの各要素をMaybe型に変換する関数として表現されます

 

以下は、関手自然変換を可換図式を用いて表した例です。

ここでは、対象としては整数型、射としては+1と×2の関数を考えます

また、関手Fは整数型のリストを受け取り、各要素に+1適用する操作を表します。

関手Gは整数型のリストを受け取り、各要素に×2を適用する操作を表します。

 

 F       G

[1, 2, 3] -----> [2, 4, 6]

 |       |

 |       |

map (+1)   map (*2)

 |       |

 v       v

[2, 3, 4] -----> [2, 4, 6]

 F'       G'

 

上記の図では、FとGはそれぞれリストの要素を変換する関手で、F'とG'はそれぞれFとGの逆関手を表します。

また、map(+1)はFからF'への自然変換を表し、map(*2)はGからG'への自然変換を表します。

このように、自然変換は関手間の変換を表し、可換図式で表すことができます

関数型プログラミング言語Haskellで、圏論の「対象」「射」「モナド」に対応する要素は何ですか?

ChatGPTからの回答

Haskellにおける圏論の「対象」「射」「モナド」に対応する要素は以下の通りです。

 

対象(Objects):

 Haskellにおける対象は、データ型(型)に対応します。

 例えば、整数型や文字列型などのデータ型は、Haskellにおける対象となります

 

・射(Morphisms):

 Haskellにおける射は、関数対応します。

 関数は、入力引数)を取り、出力を返す処理を表すものであり、入力と出力の対応は、圏論の射に対応します。

 関数の合成は、圏論の射の合成に対応します。

 

モナド(Monads):

 モナドは、Haskellにおいて副作用を扱うための概念であり、プログラムの実行において状態管理したり、例外処理を行ったりするために使用されます

 モナドは、関数型プログラミングにおいて重要概念であり、圏論的な構造を持ちます

 Haskellにおけるモナドは、圏論モナドと同様に、単位元結合法則を満たす演算子を持ちます

 Haskellにおけるモナドは、IOモナドMaybeモナドなど、さまざまな種類があります

ログイン ユーザー登録
ようこそ ゲスト さん