FrontPage / Learning Programming / 2015 / 2nd Semester

Learning Programming

概要

  • 自然言語処理100本ノックを,Python の言語仕様,good parts,best practice,よくハマる罠などを確認しながらじっくり解く.

2015年 後期

日時
月曜日 13:00-14:30
参加者
折田 (naho),横井 (yokoi),上村 (may-u),ダワ (dava),ゼン,Diana (dianags)
TA
山口,佐々木 (aki-s),高橋(諒) (ryo-t),五十嵐 (igarashi)
問題
http://www.cl.ecei.tohoku.ac.jp/nlp100/
http://www.cl.ecei.tohoku.ac.jp/local/?nlp100-%CE%B2 (内部ページ)
回答
http://www.cl.ecei.tohoku.ac.jp/~igarashi/yuru_nlp/index.py
/home/igarashi/yuru_nlp/{username}/ に「問題番号を0埋め3桁.py」(e.g. 000.py) を up
前期分: http://www.cl.ecei.tohoku.ac.jp/~takase/nlp100/index.py

参考資料

  • 分からないことがあったら…
    • Python の言語仕様や「Python っぽい書き方」が知りたければ Python 関係の資料にあたる.
    • 「オブジェクト指向って何?」「型って何?」「スコープって何?」という疑問は,プログラミング全般に書かれている書籍や,別言語の参考書で解決できるかもしれない.
    • Linux コマンドの使い方や,バージョン管理ソフト(e.g. git), ターミナルマルチプレクサ(e.g. tmux), パッケージ管理ソフト(e.g. homebrew), エディタ(e.g. vim)などの使い方で困っているならそれ専用の資料に当たる.
    • 何について困っているのか考えましょう.

Python

リファレンス・リンク集

導入・全体像など

Good Parts

  • 『Python Cookbook』
    • 日本語版は, 版が古く, かついくつかの章が省略されている
  • 『エキスパートPythonプログラミング』
    • Good Parts および Python ちっくなソフトウェア工学

コーディング規約・スタイルガイド

Tools

  • Jupyter
    • GUI インタラクティブインタプリタ, 兼 markdown メモ, 兼 図表ビューア
    • スピーディにプログラムの第1稿を作る際の必須ツール
    • matplotlib (seaborn) との相性も良く, 実験でも大変便利
  • Online Python Tutor
    • プログラムの動き (メモリが書きかわる様子) を視覚化

プログラミング全般,各種パラダイム

  • 『プログラマの考え方がおもしろいほど身につく本』(目次)
  • 『コーディングを支える技術』(目次)
  • 『リーダブルコード』

Linux,各種ツール

  • 全般
    • 『新しい Linux の教科書』
  • シェル
    • 『zsh の本』
  • バージョン管理
    • 『GitHub 実践入門』

予定・記録

#02 2015/10/26(Mon) 13:00-14:45

参加者

  • 折田,横井,上村,ダワ,Diana
  • (TA) 佐々木,高橋,五十嵐

解いた問題

  • 002-004

Tips

  • 文字列のクォーテーション
  • docstring
    • `"""` に続く1行目が関数の要約解説
    • 空行をひとつ挟んで,残りで詳細を書く
  • zip
    • 複数のシーケンスからタプルのリストを作る: zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]
    • 引数のシーケンス長が異なる場合は,一番短いものに合わせられる zip([1,2,3],[4,5]) -> [(1, 4), (2, 5)]
  • str.join の引数は,string が返ってくる iterable なオブジェクトならなんでも良い S.join(iterable) -> string
    • '_'.join('hoge') -> 'h_o_g_e'
    • ''.join( ('a', 'b', 'c') ) -> 'abc'
  • 文字列は immutable なので、`s += ...` の連発は、都度メモリ確保が発生して遅い&無駄.list に append → join にすべし.
  • 計算量関連
    • set は x in s が早い (average: O(1)) (ハッシュが張られている?)
    • list は(一般的なプログラミング言語で使う意味での)配列.連続したメモリ領域に書き込まれ,get が高速 (O(1))
    • TimeComplexity - Python Wiki
  • a, b, c は基本的に (a, b, c) の意 (syntax sugar?)
  • クラスのメソッドの第一引数に self をつけられるのは,クラスそのものの public method として呼び出した場合とインスタンスのメソッドを呼び出した場合の挙動を一致させたい(ないし一度に定義したい)という設計思想も入っている
    • `set.union(X,Y)` == `X.union(Y)` (第一引数が省略されている)
  • 文字列処理
    • str.split(): 任意のセパレータ文字列(初期値は ' ')で分割→リストに保存
    • 正規表現はスピードのボトルネックになるので極力使わない
      • `r'[]'` の中の「ピリオドにマッチ」を表す `.` はエスケープ不要
    • str.strip() 引数に入れた文字列を文字の集合と見て、文字列の両端に存在する該当文字を削除 '.,.ho..ge,,'.strip(',.') -> 'ho..ge'
      • 一方からだけ削りたい場合は rstlip, lstrip
      • 内側も削る場合は replace
  • 内包表記 (comprehensions)
  • dictionary を value でソート: sorted(d.iteritems(), key=(lambda x: x[1]))
    • 全体としてリストを返す
    • iteritems(): (k,v) のリストの iterator を返す
  • fold, reduce
    • sum([('a','b'),('c','d')], ()) は,おそらく,`()`(空タプル)を初期値として `+` で left fold

#01 2015/10/19(Mon) 14:40-17:00

参加者

  • 横井,上村,ダワ,Diana,ゼン
  • (TA) 山口,佐々木,高橋,五十嵐

Tutorial (佐々木)

  • 環境構築(environmental construction) slide(ja), slide(en)
    • 研究室の計算機環境,サーバへのログイン,Python の実行,virtualenv,Jupyter
    • (付録) tmux, linux コマンド
  • コードのアップロード方法(how to upload your source codes) slide(ja), slide(en)

解いた問題

  • 000, 001

Tips

  • インデントは4スペース (ソフトタブ)
    • エディタで Tab キーを押したときに '\t' ではなく半角スペース×4によるインデントが挿入されるように各自設定
  • 変数名関数名を,キーワードや組み込みの関数名とぶつけない
  • 組み込みのメソッドや関数の仕様の確認方法
    • Python 2.7.10 documentation を読む
      • 困ったことがあったらまず公式ドキュメントを確認
    • Dash for OS X (documentation をローカルで読む.有償ソフト.)
    • interactive shell (ipython) 上で `help(command)`, `command?` (e.g. `str.join?`)
    • Jupyter 上でメソッドにカーソルを合わせて Shift+Tab
  • tuple は immutable
    • オブジェクト自体が mutable/immutable なことと,そのオブジェクトを入れた変数が再代入可能/不可能なことを混同しない.
      In [1]: a = (1,2)
      In [2]: b = (3,4)
      In [3]: c = a
      In [4]: a += b # a に新しいオブジェクト (1,2)+(3,4) = (1,2,3,4) を再代入
      In [5]: a
      Out[5]: (1, 2, 3, 4)
      In [6]: c
      Out[6]: (1, 2) # c が指すメモリ領域は [1] で確保されたもの
  • enumerate(): list を添え字付きで走査するときに便利
  • range はリストそのもの, xrange はイテレータ (のようなもの, xrange 型オブジェクト) を返す.
    • リストそのものが欲しい場合以外, xrange を使えば良い.
    • 3系では range の挙動が 2系の xrange と同様?
  • 代入は文. 式ではない. (値を返さない)
    • `y = x = 1` は valid だが, C言語のように 右結合的に順に評価 (`y = (x = 1)`) しているわけではなく, `y = x = a` という気泡が用意されている (実際, Python で `y = (x = 1)` はエラーする)
    • なお比較演算子も同様の記法がサポートされている e.g. `0 < x < 5` (これは `0 < x and x < 5` と等価. ただし `x` の評価回数で損)
  • ソースファイルのエンコード宣言 (マジックコメント?): `# -*- coding: utf-8 -*-`
    • `-*-` をつけておくと Emacs フレンドリー?
  • ドキュメンテーション文字列 (docstring) は reStructuredText 形式で書く

© Inui-Suzuki Laboratory 2010-2018 All rights reserved.
Recent Changes
2020-06-25 2020-06-17 2020-06-16 2020-06-10 2020-06-08 2020-06-01 2020-04-10 2020-04-02 2020-02-22 2019-06-07 2019-06-06 2019-05-23 2019-04-19 2019-04-08 2019-04-07 2019-04-03 2019-04-01 2019-03-08 2019-03-07 2019-03-01 2019-02-28 2019-02-15 2019-02-14 2019-02-13 2019-02-12 2019-02-08 2019-02-07 2019-02-06 2019-02-05 2019-02-04 2019-02-01 2019-01-31 2019-01-30 2019-01-29 2019-01-28 2019-01-26 2019-01-25 2019-01-24 2019-01-23 2019-01-22 2019-01-19 2019-01-18 2019-01-17 2019-01-16 2019-01-15 2019-01-10 2019-01-09 2019-01-08 2019-01-07 2019-01-06 2019-01-04 2019-01-03 2018-12-27 2018-12-26 2018-12-25 2018-12-21 2018-12-20 2018-12-19 2018-12-18 2018-12-17 2018-12-16 2018-12-13 2018-12-12 2018-12-11 2018-12-10 2018-12-07 2018-12-06 2018-12-05 2018-12-04 2018-12-03 2018-12-02 2018-11-29 2018-11-28