列挙
以前はこのように操作していました:
i = 0
for item in iterable:
print i, item
i += 1
今回はこのように操作します:
for i, item in enumerate(iterable):
print i, item
enumerate関数は第2引数も受け取ることができます。次のようになります:
>>> list(enumerate('abc'))
[(0, 'a'), (1, 'b'), (2, 'c')]
>>> list(enumerate('abc', 1))
[(1, 'a'), (2, 'b'), (3, 'c')]
辞書/セットの内包表記
リスト内包表記は知っているかもしれませんが、辞書/セットの内包表記は知らないかもしれません。それらは簡単で使いやすく、効率的です。例えば次のようになります:
my_dict = {i: i * i for i in xrange(100)}
my_set = {i * 15 for i in xrange(100)}
# There is only a difference of ':' in both
# 两者的区别在于字典推导中有冒号
浮動小数点除算の強制
整数を割る場合、結果が浮動小数点数であっても、Python 2(編注:ここでバージョン番号を追加しました)では整数として返されます。この問題を回避するには、次のようにする必要があります:
result = 1.0/2
しかし、この問題を解決する別の方法があります。以前はこの方法が存在することに気づいていませんでした。次のように操作できます:
from __future__ import division result = 1/2 # print(result) # 0.5
見てください。正確な答えを得るためにデータに「.0」を付ける必要はもうありません。このコツはPython 2でのみ有効であることに注意してください。Python 3ではデフォルトでインポートされているため、import操作は不要です。
簡易サーバー
あるディレクトリ内のファイルを手軽に共有したいですか?次のようにできます:
# Python2 python -m SimpleHTTPServer # Python 3 python3 -m http.server
これでサーバーが起動します。
Python式の評価
eval関数は誰もが知っていますが、literal_eval関数は知っていますか?多くの人は知らないかもしれません。このような操作ができます:
import ast my_list = ast.literal_eval(expr)
次のような操作の代わりに:
expr = "[1, 2, 3]" my_list = eval(expr)
多くの人にとってこの形式は初めて見るものだと思いますが、実際にはPythonで長い間存在しています。
スクリプト分析
次のコードを実行することで、簡単にスクリプト分析ができます:
python -m cProfile my_script.py
オブジェクトの自己検査
Pythonではdir()関数を使ってオブジェクトを検査できます。次の例のとおりです:
>>> foo = [1, 2, 3, 4] >>> dir(foo) ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', ... , 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
スクリプトのデバッグ
pdbモジュールを使ってスクリプトにブレークポイントを簡単に設定できます。次の例のとおりです:
import pdb pdb.set_trace()
スクリプトのどこにでもpdb.set_trace()を追加でき、その関数はその位置にブレークポイントを設定します。
if 構造の簡略化
いくつかの値をチェックする必要がある場合は、次の方法を使用できます:
if n in [1,4,5,6]:
次の方法の代わりに:
if n==1 or n==4 or n==5 or n==6:
文字列/シーケンスの逆順
次の方法でシーケンスをすばやく逆順に並べ替えることができます:
>>> a = [1,2,3,4] >>> a[::-1] [4, 3, 2, 1] # This creates a new reversed list. # If you want to reverse a list in place you can do: a.reverse()
この方法は文字列の逆順にも適用できます:
>>> foo = "yasoob" >>> foo[::-1] 'boosay'
プリティプリント
次の方法で辞書やシーケンスをプリティプリントできます:
from pprint import pprint pprint(my_dict)
この方法は辞書の出力にさらに効果的です。また、ファイル内のjsonドキュメントを美しく出力したい場合は、次の方法を使用できます:
cat file.json | python -m json.tool
三項演算
三項演算はif-else文のショートカットであり、条件演算とも呼ばれます。参考になる例をいくつか示します。これらにより、コードをよりコンパクトで美しくすることができます。
[on_true] if [expression] else [on_false] x, y = 50, 25 small = x if x < y else y