2020-05-17_hw オンライン プログラミング勉強会

この記事は6分で読めます

このサイトは学部では早稲田で物理を, 修士では東大で数学を専攻し, 今も非アカデミックの立場で数学や物理と向き合っている一市民の奮闘の記録です. 運営者情報および運営理念についてはこちらをご覧ください.

中高の数学の復習から専門的な数学・物理までいろいろな情報を発信しています.
中高数学に関しては自然を再現しよう役に立つ中高数学 中高数学お散歩コース
大学数学に関しては現代数学観光ツアーなどの無料の通信講座があります.
その他にも無料の通信講座はこちらのページにまとまっています.
ご興味のある方はぜひお気軽にご登録ください!


2020-05-10 課題

  • コンテンツの案内ページ
  • GitHub へのリンク
  • 前回使った ipynb のプログラムを実際に実行してみて、実数の数値計算上で起こる問題を実感してみてください。
  • 「自分でお絵かきできるようになろう」講座なので、お絵描き用ライブラリに慣れ親しむのが大事です。そこで matplotlib の公式ドキュメントを見ていろいろ遊んでみてください。例えば次のようなことを試してみてください。
    • 線の色を変えてみる。
    • 点にマーカーをつける。
    • 公式のサンプルやチュートリアルを試してみる。
    • 公式サンプル
    • これも公式:サンプルコードもある。
  • 引き続き TeX でいろいろな式を書いてみましょう。式が書けると数学系のコミュニケーションがだいぶ楽になります。

自分用メモ

  • 常微分方程式で漸化式から微分方程式に流れる部分の書き直し
  • 勉強のおすすめ:AtCoder はどうか?C++の解説もあるし、仕事・評価にも割と直結するし、具体的な問題つきで勉強できる。
    • https://atcoder.jp/contests/apg4b
      • C++のコードをPythonで書き直してみるだけでもかなりの勉強になるはず
    • Python によるアルゴリズム https://qiita.com/cabernet_rock/items/cdd12b07d213b67d0530
  • 数値計算に関わるクラス・オブジェクトの説明
    • まずは辞書・構造体の拡大版として導入するか?
    • 変な誤解を生まないような書き方を考える
  • 遅延型方程式に対するコメント追加
  • 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 つの整数を都度作ってくればいい
xs = range(0, 10)
print(type(xs))
for x in xs:
    print(x)
<class 'range'>
0
1
2
3
4
5
6
7
8
9
  • イテレータ(リスト)の要素数が $10^{1000000}$ くらいになるとそもそもリストが作れない
  • 一気に作らずに 1 つずつ要素を生成すれば問題なく処理は回る
    • $10^{1000000}$ 個の要素を処理しないといけない点で時間自体はどうしてもかかる
    • これは本質的な問題で、ジェネレーターを使う・使わないに関係ない
    • メモリに載るか載らないかではなく処理の所要時間の問題

Python のジェネレーターの簡単な例

  • yield を使ってみる
def my_generator():
    yield 1
    yield 2
    yield 3

gen = my_generator()
print(type(gen))
<class 'generator'>
def my_generator():
    yield 1
    yield 2
    yield 3

gen = my_generator()
print(gen.__next__())  # 1
print(gen.__next__())  # 2
print(gen.__next__())  # 3
1
2
3
  • 4 回呼ぶと怒られる
  • for で呼び出すと怒られるところでループを止めてくれる
"""4 回呼ぶと怒られる"""
def my_generator():
    yield 1
    yield 2
    yield 3

gen = my_generator()
gen.__next__()  # 1
gen.__next__()  # 2
gen.__next__()  # 3
gen.__next__()  # StopIteration
---------------------------------------------------------------------------

StopIteration                             Traceback (most recent call last)

<ipython-input-1-f379ec6e011a> in <module>()
      8 gen.__next__()  # 2
      9 gen.__next__()  # 3
---> 10 gen.__next__()  # StopIteration


StopIteration: 
def my_generator():
    yield 1
    yield 2
    yield 3

gen = my_generator()
for a in gen:
    print(a)
1
2
3

クラス

  • 念頭に置くのは Python のクラス・オブジェクト(オブジェクト指向の意味のオブジェクト)
  • データとそれを処理する「関数」のペア
  • まずは「辞書」または「リスト」の拡張だと思おう

  • ある学生 s のテストの点に関していろいろ統計的な処理をしたい
  • 学生 s のテストの点を次のようにリストで持つ
    • 国語・数学・英・理科・社会の順に点数を並べるとする
    • 平均点を計算したい
s_scores = [10, 20, 30, 40, 50] # 国語・数学・英・理科・社会の順
def calc_mean(s_scores):
    return sum(s_scores) / len(s_scores)
s_mean = calc_mean(s_scores)
print(s_mean)
30.0
  • リストだと何も情報がなくて、何番目が何の科目だったか覚えていられない
  • コメントもあるが、何かの都合で仕様が変わったりしたらどうする?
  • 具体的に名前で持たせればいい:辞書を使おう
s_scores = {
    "ja": 10,
    "math": 20,
    "eng": 30,
    "science": 40,
    "society": 50
}

def calc_mean(s_scores):
    s_sum = sum([v for v in s_scores.values()])
    return s_sum / len(s_scores)

s_mean = calc_mean(s_scores)
print(s_mean)
30.0
  • 関数 calc_mean は(本質的には)成績の持たせ方と連動した関数である
  • 値と処理をバラバラにしないでワンセットにしたい:クラス化
    • いまは単なる平均だからご利益が何も感じられない
    • もっと複雑なことを考えると「ワンセット」にご利益が出てくる
    • それこそ「辞書のクラス・メソッド」などを考えてみよう
class Score():
    def __init__(self, ja, math, eng, sci, soc):
        self.ja = ja
        self.math = math
        self.eng = eng
        self.sci = sci
        self.soc = soc

    def calc_mean(self):
        return (self.ja + self.math + self.eng + self.sci + self.soc) / 5

s = Score(10, 20, 30, 40, 50)
print(s.calc_mean())
30.0
  • ほかの生徒の成績も考えたいとき、簡単に各生徒用のオブジェクトが作れる
    • オブジェクトは s1s2
class Score():
    def __init__(self, ja, math, eng, sci, soc):
        self.ja = ja
        self.math = math
        self.eng = eng
        self.sci = sci
        self.soc = soc

    def calc_mean(self):
        return (self.ja + self.math + self.eng + self.sci + self.soc) / 5

s1 = Score(10, 20, 30, 40, 50)
print(s1.calc_mean())

s2 = Score(1, 2, 3, 4, 5)
print(s2.calc_mean())
30.0
3.0

アルゴリズムとデータ構造

アルゴリズムとデータ構造でプログラミングを勉強する

  • https://atcoder.jp/?lang=ja
    • プログラミングのコンテストサイト
    • 競技プログラミング
  • C++ の勉強も兼ねた勉強用ページ https://atcoder.jp/contests/APG4b
  • 初心者向け練習問題 https://atcoder.jp/contests/abs
    • 探せば他にも練習問題特集はある

いいところ

  • 簡単な問題なら 10 行もあれば書ききれる
  • 自分で何か作ったりしなくても問題演習という形でプログラミングに触れられる
  • 基本的には実際のプログラミングに即役立つタイプの問題
  • ランキング上位者は本当にプログラミングで食っていけるレベルの腕でもある
  • 良くも悪くも、コンピューターの基礎みたいな部分に触れざるを得ない面がある
    • リストと配列は何が違うのか?
    • どういうときにどちらを使えばいいのか?
    • メモリ上のデータの配置が違う
    • 「低レイヤー」の話とも向き合う必要が出る可能性

自分に合った勉強法・勉強内容を探そう

  • 最終的な目的・目標と勉強に対する最善のアプローチが一致するとは限らない
  • 私の場合は物理・数学系だと勉強しやすかったが、皆が皆そうというわけでもない
  • 課題を競プロから出してみて様子を見るか?

中高の数学の復習から専門的な数学・物理までいろいろな情報を発信しています.
中高数学に関しては自然を再現しよう役に立つ中高数学 中高数学お散歩コース
大学数学に関しては現代数学観光ツアーなどの無料の通信講座があります.
その他にも無料の通信講座はこちらのページにまとまっています.
ご興味のある方はぜひお気軽にご登録ください!

  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  • コメント (0)

  • トラックバックは利用できません。

  1. この記事へのコメントはありません。

このサイトについて

数学・物理の情報を中心にアカデミックな話題を発信しています。詳しいプロフィールはこちらから。通信講座を中心に数学や物理を独学しやすい環境づくりを目指して日々活動しています。
  • このエントリーをはてなブックマークに追加
  • LINEで送る

YouTube チャンネル登録

講義など動画を使った形式の方が良いコンテンツは動画にしています。ぜひチャンネル登録を!

メルマガ登録

メルマガ登録ページからご登録ください。 数学・物理の専門的な情報と大学受験向けのメルマガの 2 種類があります。

役に立つ・面白い記事があればクリックを!

記事の編集ページから「おすすめ記事」を複数選択してください。