ドキュメントの内容について、あなたはどういうわけか混乱していると思います。次の 2 つのドキュメント セクションをご覧ください: Truth Value Testing と Boolean Operators。最初のセクションの最後の段落を引用するには:
ブール値の結果を持つ演算と組み込み関数は 、特に明記されていない限り、 false と true の場合は常に or を 返し 0
ます 。(重要な例外: ブール演算 と は常にオペランドの 1 つを返します。)False
1
True
or
and
ご覧のとおり、操作と組み込み関数については正しいですが、重要な例外の部分を参照してください。ブール演算子がオペランドの 1 つを返すことが十分に述べられています。
現在、それらが返すことができるものは、オペレーターの短絡ロジックにほとんど依存しません。演算子の場合、式or
の最初の真の値が返されます。これは、1 つが見つかると式全体が真になるためです。すべてのオペランドがfalseyである場合、or
は最後のオペランドを返します。つまり、すべてのオペランドを反復処理して、真のオペランドを見つけることができませんでした。
演算子の場合、式が true の場合and
は最後のオペランドを返し、式が false の場合は最初の falsey オペランドを返します。ウィキペディアのページ で、短絡評価の詳細を読むことができます。
質問には多くの例があります。それらのいくつかを分析しましょう。
>>> False and 1 # return false (short circuited at first falsey value)
False
>>> True and 1 # return 1 (never short circuited and return the last truthy value)
1
>>> 1 and False # return false (short circuited at first falsey value, in this case the last operand)
False
>>> 1 and True # return True (never short circuited and return the last truthy value)
True
>>> True and 121 # return 121 (never short circuited and return the last truthy value)
121
>>> False or 1 # return 1 (since the first operand was falsey, or kept looking for a first truthy value which happened to be the last operator)
1
>>> False or 112 # return 112 for same reason as above
112
>>> False or "Khadijah" # return "Khadijah" for same reason as above
'Khadijah'
>>> True and 'Khadijah' # return "Khadijah" because same reason as second example
'Khadijah'
これは一理あると思います。これが役立つ理由をさらに理解するために、次の例を検討してください。
名前をランダムに生成する関数があります
import random
def generate_name():
return random.choice(['John', 'Carl', 'Tiffany'])
名前が割り当てられているかどうかわからない変数があるので、次のようにします。
if var is None:
var = generate_name()
ワンライナーを実行できます:
var = var or generate_name()
None
は偽の値であるためor
、検索を続行し、2 番目のオペランドを評価します。これは、最終的に生成された名前を返す関数を呼び出します。これは非常にばかげた例です。この種のスタイルのより良い使用法 (Python ではありませんが) を見てきました。私は今、より良い例を出すことができませんでした。この質問を見ることもできます。トピックに関する非常に役立つ回答があります: Python は短絡をサポートしていますか?
大事なことを言い忘れましたが、これは静的型付け、ダック型付け、動的、インタープリター、コンパイルなど、どの言語とも関係ありません。これは単なる言語機能であり、便利になる可能性があり、私が考えることができるほとんどすべてのプログラミング言語がこの機能を提供しているため、非常に一般的です。
お役に立てれば!