1. ホーム
  2. python

[解決済み] Pythonで'try'と'if'を使い分ける

2022-04-21 02:25:52

質問

のいずれかを決定する根拠はあるのでしょうか? try または if という構文は、変数が値を持つかどうかをテストするときに使用するのでしょうか?

例えば、リストを返すか、値を返さない関数があるとします。処理する前に結果をチェックしたいのですが、どうすればよいでしょうか?次のうち、どちらがより好ましいでしょうか?

result = function();
if (result):
    for r in result:
        #process items

または

result = function();
try:
    for r in result:
        # Process items
except TypeError:
    pass;

関連する議論

Pythonでメンバーの存在を確認する

どのように解決するのですか?

よく、Pythonは EAFP スタイル ("it's easier to ask for forgiveness than permission") を採用しました。 LBYL スタイル("look before you leap")です。私にとっては、効率と読みやすさの問題なのです。

あなたの例では (リストや空文字列を返す代わりに、関数がリストや空文字列を返すとします) None を想定した場合、99%の確率で result が実際に反復可能な何かを含むのであれば、私なら try/except のアプローチです。例外が本当に例外的であれば、その方が速いでしょう。もし resultNone を使用すると、50%以上の確率で 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 実際に発生すると、そのコストははるかに高くなります。

モラルです。

  • を使うのは全く問題ありません("pythonic")。 try/except をフロー制御のために使用します。
  • が、最も理にかなっているのは Exception は、実際には例外的なものです。

Pythonのドキュメントから。

EAFP

許しを乞うのは簡単だ。 許可することです。この一般的なPythonのコーディングは は、有効な キーまたは属性で 例外は、その仮定が証明された場合 を使用します。このクリーンで高速なスタイルは を多用することが特徴です。 tryexcept ステートメントを使用します。この とは対照的な手法です。 LBYL 他の多くの言語で一般的なスタイル C言語など