Pythonっぽい書き方なコードをPythonicなコードと呼ぶ.
Pythonの言語思想は import this
するとわかる.
http://qiita.com/IshitaTakeshi/items/e4145921c8dbf7ba57ef
Python2 と Python3 は非互換である.自分が使っているPythonのバージョンは常に意識する. 確認用のコマンドは以下.
$ python --version
Python 2のコードをPython 3に移行するには,2to3
や six
を使うと楽.
- 補足
3to2
もある (pip
でインストール出来る).- Pythonのバージョン管理には
pyenv
を使うと良い
Pythonはコーディングスタイルが定義されているの可能な限りそれに従う.
PEP 8日本語訳:https://pep8-ja.readthedocs.org/ja/latest/
- 補足
- 各行は120文字としている人が多い (79文字はあまり守られていない)
- プロテクテッドやプライベートはあくまでコーディングスタイルであり厳密ではない
- 更にいうとプロテクテッド使ってるケースあまり見たことない
pip install pep8
してpep8
コマンドを使えば自動で規約チェックしてくれる.更にpip install autopep8
すれば自動的にPEP 8に準拠したコードに直してくれる
Python 3では文字列を表すのに byte
と str
がある.
Python 2では文字列を表すのに str
と unicode
がある.ここではPython 3の話しかしない.
byte -- decode('文字コード (e.g. UTF-8)') --> str
str -- encode('文字コード (e.g. UTF-8)') --> byte
-
補足
gzip
モジュールを使った読み書きはbyte
型になるためstr
への変更が必要
from gzip import GzipFile for line in GzipFile('パス'): if 'テスト' == line: print('こういうことするとエラーが発生する') if 'テスト' == line.decode('utf-8'): print('こういう風に変換が必要')
例えばこう書くのではなく
red = int(my_values.get('red', [''])[0] or 0)
こう書こうという話
red = my_values.get('red', [''])
red = int(red[0]) if red[0] else 0
or
とか使うと非常に短く書けるけど,基本的には条件式 (if/else) を用いて明示的にわかりやすく書いてあげるのがPythonic
スライス便利
-
補足
- よく見る初心者がやりがちなミス
>>> a = [1, 2, 3] >>> b = a >>> b.append(4) >>> b [1, 2, 3, 4] # a の中身も書き換えてる >>> a [1, 2, 3, 4] # aのコピーを作成 >>> b = a[:] >>> b.append(5) >>> b [1, 2, 3, 4, 5] >>> a [1, 2, 3, 4]
stride
は便利だけどバグの元になりがち
よくある便利な使い方
# 奇数番目の要素を取り出す
>>> a = ['red', 'orange', 'yellow', 'green', 'blue', 'purple']
>>> odds = a[::2]
>>> odds
['red', 'yellow', 'blue']
# バイト列の逆転
>>> x = b'mongoose'
>>> y = x[::-1]
>>> print(y)
b'esoognom'
map
と filter
両方使うような式もリスト内包表記を使うとよりシンプルに分かりやすく書ける.
リスト内包表記に複数のループや式を含めると分かりにくいのでやめる.
でかいデータをうっかりリスト内包表記で展開するとメモリ問題で死ぬ.
データが大きな場合は,こう書くよりも
value = [len(x) for x in open('my_file.txt')] print(value)
ジェネレータを利用してこう書こう.
it = (len(x) for x in open('my_file.txt'))
print(it)
リスト中の要素に添字を使ってアクセスしたい場合があれば,range
ではなく enumerate
を使う
zip
を利用すると2つ以上のイテレータを遅延評価ジェネレータでラップできる.
for
と while
のループ後の else
は必ず実行されてしまう.ループが break
したら実行されない.これは直感と動作が違うので使うのはやめよう.
便利