@Dina です。
本記事は「Invent Your Own Computer Games with Python 2nd Edition」by Al Sweigartの短絡評価についてを書きます。
##バックグラウンド
今まで、私がこのようなのifステートメントを使っています:
if($condition) {
// do something
}
// or something like this
// Shorthand If Statement Using Ternary Operators (?:)
$score = 10;
echo 'Based on your score, you got ',($score > 8 ? 'A' : 'F');
Invent Your Own Computer Games with Pythonの本を読んだあと、ifステートメントはそれ以上のものがあります。だから、将来の参考為、本記事に残したいです。
##短絡評価
短絡評価、英語でShort-Circuit Evaluationとは結果が決定されるとすぐに式の評価が停止されます。次は直接本からPythonで書いてある短絡の例と説明です。
1. def TrueFizz(message):
2. print(message)
3. return True
4. def FalseFizz(message):
5. print(message)
6. return False
7.
8. if FalseFizz('Cats') or TrueFizz('Dogs'):
9. print('Step 1')
10. if TrueFizz('Hello') or TrueFizz('Goodbye'):
11. print('Step 2')
12. if TrueFizz('Spam') and TrueFizz('Cheese'):
13. print('Step 3')
14. if FalseFizz('Red') and TrueFizz('Blue'):
15. print('Step 4')
A. Cats
B. Dogs
C. Step 1
D. Hello
E. Step 2
F. Spam
G. Cheese
H. Step 3
I. Red
この例は2つの関数があります:TrueFizz()とFalseFizz()。TrueFizz()はメッセージを表示、Trueを返します。FalseFizz()はメッセージを表示、Falseを返します。これは、これらの関数がいつ呼び出されているのか、またはこれらの関数が短絡によりスキップされているのかを判断するのに役立ちます。
1番目のif : CatsとDogs
8行目のifステートメントに短絡はありません。FalseFizz('Cats')の呼び出しはTrueを返しますが、or キーワードの右側の式がTrueの場合、式全体がTrueになることがあります。 そのため、8行目のTrueFizz('Dogs')呼び出しが評価され、Dogsが画面に出力され(出力のB行目)、Trueが返されます。 8行目では、ifステートメントの条件はFalse or Trueに評価され、次にTrueが評価されます。 その後、Step 1が画面に出力されます。
2番目のif : HelloとGoodbye
10行目の2番目のifステートメントには短絡があります。 これは、10行目でTrueFizz('Hello')を呼び出すと、Helloを出力し(出力のD行を参照)、Trueを返します。orキーワードの右側に何があるかは関係ないので、PythonインタープリタはTrueFizz('Goodbye')を呼び出しません。Goodbye画面に表示されていないので、呼び出されないのがわかります。ifステートメントの条件はTrueなので、Step 2はE行の画面に表示されます。
3番目のif : SpamとCheese
12行目の3番目のifステートメントは、短絡はありません。TrueFizz('Spam')の呼び出しはTrueを返しますが、and演算子のために条件全体がTrueかFalseかはわかりません。そのため、PythonはTrueFizz('Cheese')を呼び出します。これは、Cheeseを出力してTrueを返します。 ifステートメントの条件はTrue and Trueに評価され、それが次にTrueに評価されます。 条件が真なので、Step 3がH行に画面に出力されています。
4番目のif : RedとBlue
14行目の4番目のifステートメントは、短絡があります。FalseFizz('Red')を呼び出しは、出力のI行にRedを出力し、Falseを返します。andキーワードの左側はFalseなので、右側がTrue or False構いません。条件はFalseに評価されます。 そのため、TrueFizz('Blue')は呼び出されず、Blueは画面に表示されません。 ifステートメントの条件がFalseと評価されたから、Step 4も画面に表示されません。
##最後
短絡評価は一般的に第二因数の望ましくない不作用を避けるためです。短絡はブール演算子のand及びorに、いつでも何式でも発生することができます。けれど、ある関数がお呼び出されないのがわからなくなてしまうときもありますが、使う気を付けが必要です。
最初はこのようなのコードを理解しにくいと思いますが、けれど短絡評価を使うとき、ランタイムエラーを減らすの可能性があるかも知れませんか?短絡評価がシンプルと小さいプロジェットに適用されるほうがいいと思います。
以上は短絡評価の内容です。足りない所や間違えた所若しくは不明点があったら、コメントやフィードバックをお願い致します。