0

私はPython2.7.3でさまざまなことを試していましたが、次のコードに出くわしました。

入力:

x = 4
y = 7
x or y

出力:

4

ドキュメントによると、orはブール演算です。譲歩するのではないですか、それともただのことではありませんか?orTrueFalse

だから、私はこのコードでもう少し試しました:

入力:

a = 3
b = 2
a or b

出力:

3

次に、この時点で、コードが式の最初の引数を返すと想定します。

Pythonがこの出力を提供したのはなぜですか?orPython操作の背後で実際に何が起こっているのでしょうか?

4

7 に答える 7

4

ドキュメントから:

xまたはy:xがfalseの場合、y、それ以外の場合x(1)

ゼロ以外のすべての整数に対してx or yx

于 2013-03-14T18:38:26.553 に答える
3

georgesi の回答は、あなたが尋ねた正確な質問に完全に回答していますが、リンク先のドキュメントもそうです。したがって、おそらくあなたはもっと欲しいでしょう。

次の 2 つのことを尋ねている可能性があります。

  1. 私のネイティブの直感/お気に入りの言語がorを返す必要があると言うのに、なぜboolPython はこのように設計されたのでしょうか?
  2. Python はこれをどのように実装しますか?

「Python操作の背後で実際に何が起こってorいるのか」という質問を太字にしたので、後者だと思います。

Python には複数の実装があり、参照ドキュメントで設定された仕様を満たしている限り、自由に実装できます。しかし、通常、人々が「Python はこれをどのように行うのですか?」と尋ねると、彼らは「CPython 実装はこれをどのように行うのか?」という意味です。

まず、いくつかのバイトコードを見てみましょう:

>>> def f():
...     return 1 or 2
>>> import dis
>>> dis.dis(f)
2           0 LOAD_CONST               1 (1) 
            3 JUMP_IF_TRUE_OR_POP      9 
            6 LOAD_CONST               2 (2) 
      >>    9 RETURN_VALUE         

これは何を意味するのでしょうか?Python 風の疑似コードでは、次のようになります。

top = 1
if top:
     goto 9
else:
     del top
top = 2
label 9
return top

よりよく理解したい場合 (CPython が重要な実装である場合)、CPython バイトコード インタープリターが単純なスタック マシンであり、そのスタック マシンのコードが file 内にあることを知っておく必要がありますceval.cしたがって、ここJUMP_IF_TRUE_OR_POPでコードを見つけることができます。(オペコードは定数値をスタックにプッシュするだけなので、それを見つけることができます。どのように機能するかを理解するためにそれを調べる必要はないと思います。)LOAD_CONSTw = TOP()or

もう少し複雑であることがわかります。

これは主に、 に相当する C-API を呼び出す前にif topチェックif top == Falseしてパーツを最適化し、その呼び出しからの例外を処理する必要があるためです。しかし、スタックの使用も最適化しています。方法と作業を説明しないと、正確に理解するのは困難ですが、基本的な考え方は、値をスタックからポップして、値をプッシュバックして返すことを回避することです。if top == Truebool(top)boolDISPATCHFAST_DISPATCH

orしかし、それは「Python操作の背後で実際に何が起こっているのか?」ということです。


あなたはまた、「降伏することは想定されていませんか、それとものみですか?orTrueFalse 」と太字にしたので、質問 1 に戻ります。

まず、ダック タイピングが Python の中心であることを思い出してください。orあたかもそれが重要であるかのようにTrue、またはFalseどこでも使用できる何かを生成することになっています。特に(またはまたはまたは何でも)if foo:ではなくのようなものを書くことになっているので、違いを気にするべきではありません。if foo == True:if foo is True:if foo != False:

第二に、約半数の言語が、「ブール演算」はブール型の値を厳密に返す必要があることに同意しますが、半分の言語は同意しません。C のように、ダック タイピングを中心に構築されていない言語でも。では、言語設計者はどのように決定すればよいのでしょうか。

or演算子を常に返すようにする "C++ スタイル" は、boolコピーを回避し、コンパイラによるより適切な静的型の適用を可能にし、より適切な動的型情報をプログラマーに提供します。最初の 2 つは Python ではまったく関係がなく、最後の 2 つは通常、ダック タイピングではなく型に依存するコードを記述している場合にのみ役立ちます。

最初の真の値 (または最後の偽の値) をそのまま返す「C スタイル」は、実装をわずかに単純化し、プログラマーに 3 項if-else式の一種の省略形を提供します。

Python に 3 項のif-がなかった頃elseは、これは簡単に呼び出すことができました。特に一部の人々はそれa or bを略記として嫌い、 a if a else bPythonic ではないと考えているためです。

しかし、歴史はすでにあるものの側にあります。やむを得ない理由がない限り、何も変更されません。また、好みによっては反対の方向に進む可能性があるという危機的状況は、やむを得ない理由ではありません。

于 2013-03-14T18:59:47.213 に答える
2

あなたが提供したドキュメントリンクから:

式xまたはyは最初にxを評価します。xがtrueの場合、その値が返されます。それ以外の場合は、yが評価され、結果の値が返されます。

于 2013-03-14T18:39:19.230 に答える
1

false のオブジェクトを返すべき唯一の状況orは、両方のオペランドが false の場合であることに注意してください。

この動作を念頭に置くと、最初のオペランドが true である状況では、両方のオペランドが false ではないことが既にわかっていることがわかります。これは、2 番目のオペランドが何であるかに関係なく、式全体が true と評価される必要があることを意味します。最初のオペランド (真) が返されます。

最初のオペランド (x と呼びます) がfalseの場合、x or yは と論理的に同等yです。y が true の場合、x と y の両方が false ではないため、x or ytrue です。y が false の場合、x と y の両方が false であり、x もx or yfalse です。これが、x が false の場合に y が返される理由です。

短絡評価として知られるこのアプローチは、x が false の場合、y を不必要に評価する必要がないため、計算コストが低くなります。

于 2013-03-14T18:40:17.600 に答える
0

Pythonのor演算子は、trueと見なされた場合は最初の値を返し、最初の値がfalseで2番目の値がtrueの場合は2番目の値を返します。両方がfalseの場合、が返されFalseます。この場合、4と3の両方が真の値であるため、それらが返されます。代わりに0を使用した場合、2番目に使用された値が表示されます

x = 0
y = 3
x or y 

これは3を返します

于 2013-03-14T18:38:39.653 に答える
0

この質問にはすでに回答がありますが、なぜこの動作が理にかなっているのだろうかと自問するかもしれません。

簡単な使用例を次に示します。

port = int(raw_input("Port number (default 5000): ") or 5000)

このコンテキストでは、or(and and) の動作は完全に理にかなっています。別のもの:

url_scheme = enable_https and 'https' or 'http'  # although this can be also expressed as:
url_scheme = 'https' if enable_https else 'http'
# but i personally prefer the above, because i can read it
# more easily due to the two possible values being closer together
于 2013-03-14T19:11:01.920 に答える
-1

if ステートメントの省略形のようなものです。私はJSコーディングで常に使用しています。

AND同じように使えます。

var x = 0;

x && console.log('x is not truth-y');
x || console.log('x is false-y');

他の多くの人がすでに言っているように、&&or||演算子はそれらの左側の式を評価&&し、or について話しているかどうか||に応じて、評価が true-y か false-y かによって、次のようになります。それらの右側の式の評価を停止するか、続行します。

于 2013-03-14T18:49:50.330 に答える