PythonはLBYLスタイル(「ジャンプする前に見る」)よりもEAFPスタイル(「許可よりも許しを求める方が簡単」)を奨励しているとよく耳にします。私にとって、それは効率と読みやすさの問題です。
あなたの例では(リストまたは空の文字列を返す代わりに、関数がリストまたはを返すことになったとしますNone
)、99%の時間result
に実際に反復可能な何かが含まれることが予想される場合は、このtry/except
アプローチを使用します。例外が本当に例外的である場合、それはより速くなります。が時間の50%を超える場合result
はNone
、使用することif
をお勧めします。
いくつかの測定でこれをサポートするには:
>>> import timeit
>>> timeit.timeit(setup="a=1;b=1", stmt="a/b") # no error checking
0.06379691968322732
>>> timeit.timeit(setup="a=1;b=1", stmt="try:\n a/b\nexcept ZeroDivisionError:\n pass")
0.0829463709378615
>>> timeit.timeit(setup="a=1;b=0", stmt="try:\n a/b\nexcept ZeroDivisionError:\n pass")
0.5070195056614466
>>> timeit.timeit(setup="a=1;b=1", stmt="if b!=0:\n a/b")
0.11940114974277094
>>> timeit.timeit(setup="a=1;b=0", stmt="if b!=0:\n a/b")
0.051202772912802175
したがって、if
ステートメントは常にコストがかかりますが、try/except
ブロックを設定することはほぼ無料です。しかし、Exception
実際に発生すると、コストははるかに高くなります。
道徳の:
try/except
フロー制御に使用することは完全に(そして「pythonic」)、
- しかし、
Exception
sが実際に例外的である場合、それは最も理にかなっています。
Pythonのドキュメントから:
EAFP
許可より許しを求める方が簡単です。この一般的なPythonコーディングスタイルは、有効なキーまたは属性の存在を想定しており、想定が誤っていることが判明した場合は例外をキャッチします。このクリーンで速いスタイルは、多数のtry
and except
ステートメントの存在によって特徴付けられ
ます。この技法は、
Cなどの他の多くの言語に共通のLBYLスタイルとは対照的です。