1

次のようなコードが与えられた場合:

if f(a) == 1:
    # do sth A
elif f(a) == 2:
    # do sth B
elif f(a) == 3:
    # do sth C
else:
    # do sth D

式はf(a)一度だけ実行/評価されますか? または、またはのすべてのケースで実行/評価されますifelif? さらに、複合ステートメントは違いを生むでしょうか: 例:

if f(a) == 1:
    # do sth A
elif f(a) == 2 and a > 0:
    # do sth B
elif f(a) == 3 and a < 0:
    # do sth C
else:
    # do sth D

この場合、 はどのようf(a)に評価されますか? すべてに 1 回か、それともケースごとに個別に?

4

3 に答える 3

5

テストしてみましょう:

In [7]: %paste
def f(a):
    print(a)

a = 4

if f(a) == 1:
    pass
elif f(a) == 2:
    pass
elif f(a) == 3:
    pass
else:
    pass

## -- End pasted text --
4
4
4

f(a)f(a)が毎回同じ結果を返す保証がないため、評価され続けます。でキャッシュして、代わりにresult = f(a)使用できます。resultf(a)

これらのifブロックのいずれかがたまたま である場合True、それ以降のブロックはテストされません。

于 2013-04-27T01:05:37.337 に答える
2

if複数のステートメントを含むステートメントは、入れ子になったandブロックelifのセットとして表現できることを理解することが重要です。つまり、単なる「シンタックス シュガー」です(ただし、インデントのレベルを節約できるため、非常に便利です!)。次のブロックは、コードの最初のおよび と同等です。ifelseelifelse: ififelif

if f(a) == 1:
    pass
else:
    if f(a) == 2:
        pass

elseこれを念頭に置いて、前のテストが失敗した場合にのみ部分に進むため、式が評価される回数はその結果によって異なります。への最初の呼び出しが をf(a)返す場合1、他の呼び出しは行われません。ただし、すべてのテストが失敗した場合 (おそらく最後のテストを除く)、それらすべてを評価する必要があります。

and同様に、 andを使用する論理式内ではor、Python は短絡し、最終的な値を決定するために必要のない式の部分を評価しません。

if f(a) == 1: # f(a) always gets evaluated here
     pass
elif f(a) == 2: # f(a) gets called a second time here if the "if" was failed
     pass
elif a<1 and f(a): # f(a) runs again only if both previous tests failed and a<1
     pass

f(a)つまり、結果が事前にわからない限り、関数が何回実行されるかはわかりません。が冪等でない場合f(a)(つまり、副作用がある場合)、おそらくコードをそのように構成したくないでしょう!

于 2013-04-27T01:20:08.747 に答える
1

呼び出されるたびに実行されると確信しています。(私はpython 2.7を使用していますが、3.xで変更されたとは思わないでしょう)

確認するために印刷ステートメントを入れることができます。

そのため、一度だけ呼び出して条件の戻り値を取得する方がよい場合があります

関数の戻り値をキャッシュできますか? ただし、関数 1x を呼び出すだけの方が簡単な場合があります。

f_value = f(a)
if f_value == 1:
    # do sth A
elif f_value == 2:
    # do sth B
elif f_value == 3:
    # do sth C
else:
    # do sth D
于 2013-04-27T00:58:15.903 に答える