2020-05-10 課題¶
はじめに¶
- コンテンツの案内ページ
- GitHub へのリンク
- 前回使った ipynb のプログラムを実際に実行してみて、実数の数値計算上で起こる問題を実感してみてください。
- 「自分でお絵かきできるようになろう」講座なので、お絵描き用ライブラリに慣れ親しむのが大事です。そこで matplotlib の公式ドキュメントを見ていろいろ遊んでみてください。例えば次のようなことを試してみてください。
- 引き続き TeX でいろいろな式を書いてみましょう。式が書けると数学系のコミュニケーションがだいぶ楽になります。
自分用メモ¶
- 常微分方程式で漸化式から微分方程式に流れる部分の書き直し
- 勉強のおすすめ:AtCoder はどうか?C++の解説もあるし、仕事・評価にも割と直結するし、具体的な問題つきで勉強できる。
- https://atcoder.jp/contests/apg4b
- C++のコードをPythonで書き直してみるだけでもかなりの勉強になるはず
- Python によるアルゴリズム https://qiita.com/cabernet_rock/items/cdd12b07d213b67d0530
- https://atcoder.jp/contests/apg4b
- 数値計算に関わるクラス・オブジェクトの説明
- まずは辞書・構造体の拡大版として導入するか?
- 変な誤解を生まないような書き方を考える
- 遅延型方程式に対するコメント追加
- import に関する実演
- matplotlib のチュートリアルを読もうの会
- matplotlib 回では実際に matplotlib のチュートリアルを読もう
- 公式情報に触れる重要性
- 古い情報が古いと書いてあったりする:たとえば
pylab
- Gallery
- 見ていて面白い
- 「どこをいじるとどう変わるか」が視覚的にわかる
- 公式情報なのできちんとアップデートしてくれている(はず)
- 公式情報にソースがあるので自分でいろいろ書き換えていて破滅したとき、必ずオリジナルを復元できる
- Jupyter (IPython)でのはまりどころ解説を作ろう
- いったん変数を作ると他のセルでも読み込める(読み込めてしまう)
- 「セルを上から順に読み込まないと動かない」問題の原因
- カーネル再起動まで変数は残り続ける
プログラミングの一般論¶
イテレーターとジェネレーター¶
- 参考
- この間イテレーターとジェネレーターを勘違いして話してしまったのでやり直し
基本¶
- イテレータ: 要素を反復して取り出すことのできるインタフェース
- 例:リスト、配列、タプル、辞書など
- 「要素をたくさん持っているデータ構造」
- ジェネレータ: イテレータの一種であり、1要素を取り出そうとする度に処理を行い、要素を生成する。Pythonではyield文を使った実装を指すことが多い
- ジェネレーターが必要になる理由
- とりあえずリストを想定する
- 要素すべてをあらかじめ計算しておく/取得してくるのが大変
- 例:何十GBもある巨大なイテレータはメモリにのせられない
- HDD・SSD に載せるのも大変(速度なり何なりいろいろ)
- ふつう 1 つ 1 つの要素自体は小さい
- 要素を 1 つ 1 つ生成すればメモリをそんなに食わない
- 1 つ 1 つ作ろう
1 つ 1 つ作る?¶
range
がイメージしやすそうな気がする- 一度にドカッとリストを作る必要はなく、1 つ 1 つの整数を都度作ってくればいい
1 2 3 4 |
|
1 2 3 4 5 6 7 8 9 10 11 |
|
- イテレータ(リスト)の要素数が $10^{1000000}$ くらいになるとそもそもリストが作れない
- 一気に作らずに 1 つずつ要素を生成すれば問題なく処理は回る
- $10^{1000000}$ 個の要素を処理しないといけない点で時間自体はどうしてもかかる
- これは本質的な問題で、ジェネレーターを使う・使わないに関係ない
- メモリに載るか載らないかではなく処理の所要時間の問題
Python のジェネレーターの簡単な例¶
yield
を使ってみる
1 2 3 4 5 6 7 |
|
1 |
|
1 2 3 4 5 6 7 8 9 |
|
1 2 3 |
|
- 4 回呼ぶと怒られる
for
で呼び出すと怒られるところでループを止めてくれる
1 2 3 4 5 6 7 8 9 10 11 |
|
1 2 3 4 5 6 7 8 9 10 11 |
|
1 2 3 4 5 6 7 8 |
|
1 2 3 |
|
クラス¶
- 念頭に置くのは Python のクラス・オブジェクト(オブジェクト指向の意味のオブジェクト)
- データとそれを処理する「関数」のペア
- まずは「辞書」または「リスト」の拡張だと思おう
例¶
- ある学生
s
のテストの点に関していろいろ統計的な処理をしたい - 学生
s
のテストの点を次のようにリストで持つ- 国語・数学・英・理科・社会の順に点数を並べるとする
- 平均点を計算したい
1 2 3 4 5 |
|
1 |
|
- リストだと何も情報がなくて、何番目が何の科目だったか覚えていられない
- コメントもあるが、何かの都合で仕様が変わったりしたらどうする?
- 具体的に名前で持たせればいい:辞書を使おう
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
1 |
|
- 関数
calc_mean
は(本質的には)成績の持たせ方と連動した関数である - 値と処理をバラバラにしないでワンセットにしたい:クラス化
- いまは単なる平均だからご利益が何も感じられない
- もっと複雑なことを考えると「ワンセット」にご利益が出てくる
- それこそ「辞書のクラス・メソッド」などを考えてみよう
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
1 |
|
- ほかの生徒の成績も考えたいとき、簡単に各生徒用のオブジェクトが作れる
- オブジェクトは
s1
やs2
- オブジェクトは
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
1 2 |
|
アルゴリズムとデータ構造¶
アルゴリズムとデータ構造でプログラミングを勉強する¶
- https://atcoder.jp/?lang=ja
- プログラミングのコンテストサイト
- 競技プログラミング
- C++ の勉強も兼ねた勉強用ページ https://atcoder.jp/contests/APG4b
- 初心者向け練習問題 https://atcoder.jp/contests/abs
- 探せば他にも練習問題特集はある
いいところ¶
- 簡単な問題なら 10 行もあれば書ききれる
- 自分で何か作ったりしなくても問題演習という形でプログラミングに触れられる
- 基本的には実際のプログラミングに即役立つタイプの問題
- ランキング上位者は本当にプログラミングで食っていけるレベルの腕でもある
- 良くも悪くも、コンピューターの基礎みたいな部分に触れざるを得ない面がある
- リストと配列は何が違うのか?
- どういうときにどちらを使えばいいのか?
- メモリ上のデータの配置が違う
- 「低レイヤー」の話とも向き合う必要が出る可能性
自分に合った勉強法・勉強内容を探そう¶
- 最終的な目的・目標と勉強に対する最善のアプローチが一致するとは限らない
- 私の場合は物理・数学系だと勉強しやすかったが、皆が皆そうというわけでもない
- 課題を競プロから出してみて様子を見るか?