あなたが投稿したリンクから:
FP はステートメントを思いとどまらせるか、完全に禁止し、代わりに式の評価を処理します。
したがって、ステートメントの代わりに、条件式if
を使用できます。
def function():
return (0 if ((A == 0) or (C != 0) or (A > 4)) else
someOtherFunction())
または、(特に多くの異なる値がある場合に役立ちます):
def function():
return (0 if A == 0 else
0 if C != 0 else
0 if A > 4 else
someOtherFunction())
ちなみに、リンクされた記事は提案しています
(<cond1> and func1()) or (<cond2> and func2()) or (func3())
と同等の短縮形として
if <cond1>: func1()
elif <cond2>: func2()
else: func3()
問題は、それらが同等ではないことです! ブール式は、 が真であるが偽である場合 (例: または または )、正しい値を返すこと<cond1>
がfunc1()
できFalse
ませ0
んNone
。(または同様に、<cond2>
が Truish であるfunc2
が Falsish である場合。)
(<cond1> and func1())
func1()
は、 when is Trueishを評価する意図で書かれています<cond1>
が、 when func1()
is Falsish は に(<cond1> and func1())
評価されるFalse
ため、式全体が渡され、Python は(<cond2> and func2())
ショートサーキットの代わりに評価を続けます。
というわけで、ちょっと興味深い歴史をご紹介します。2005 年に、
Raymond Hettingertype(z)==types.ComplexType and z.real or z
はwhen z = (0+4j)
because z.real
is Falsishで同様の見つけにくいバグを発見しました。同様のバグから私たちを救いたいという願望に動機付けられて、エラーが発生しにくい構文(条件式) を使用するというアイデアが生まれました。