web-dev-qa-db-ja.com

Python "if X == Y and Z"構文

これを行います:

if key == "name" and item:

これと同じ意味:

if key == "name" and if key == "item":

もしそうなら、私は Dive Into Pythonの例5.14 について完全に混乱しています。キーはどのようにして「名前」とアイテムの両方に等しくなりますか?一方、「and item」は単にitemが変数として存在するかどうかを尋ねるだけですか?

14
bsamek

_if key == "name" and item:_はif (key == "name") and (item evaluates to True)を意味します。

_(item evaluates to True)_はいくつかの方法で可能であることを覚えておいてください。たとえば、if (key == "name") and []Falseと評価されます。

33
Manoj Govindan

マノジはそれをうまく説明した。ここで補足的なメモをいくつか示します。

疑似コード

if key == "name" or if key == "item":

このようにする必要があります:

if key == "name" or key == "item":

それを行うための興味深いイディオムは次のとおりです。

if key in ("name", "item"):

しかし、ある値がリストの他の値と等しいかどうかを知りたいだけの非常に大きな条件の場合には、より便利です。

10
brandizzi

いいえ、表現を繰り返す必要があります。 2つの個別の条件として評価され、両方が真であるかどうかをチェックします-

  1. x == y
  2. z

PythonでFalseと見なされるもののリストについては、 Pythonドキュメント を確認してください

(ただし、他の言語とは異なり、次の点に注意してください:

if 3 < x < 6

に相当

if x > 3 and x < 6

4
froadie

仮に、あなたが欲しかったなら

if key == "name" and if key == item:

あなたはこれを行うことができます

if key == "name" == item:
3

他の人はあなたが尋ねている表現がどのように評価されるかを説明しました。知っておくべき重要なことは、「and」演算子の最初のオペランドがfalseと評価された場合、2番目のオペランドは評価されないことです。1つのオペランドがfalseの場合、「and」の結果は常にfalseになるため、オペランドがfalseの場合、「and」全体がfalseになるため、2番目を評価する必要はありません。これは「短絡」と呼ばれ、「または」と「および」に適用されます(ただし、どちらかのオペランドがtrueの場合、「or」は常にtrueであるため、2番目のオペランドは最初のオペランドがfalseの場合にのみ評価されます)。

もう1つ知っておく必要があるのは、「and」演算全体の結果が、最後に評価されたオペランドの値であることです。リテラル定数TrueおよびFalse以外のものは論理的にtrueまたはfalseと見なされるため、この事実は(短絡と組み合わせて)状況によっては「if」ステートメントの代わりに使用でき、時々そのように使用されることがわかります。 。

たとえば、「xまたはy」は、xがtrueの場合はxに評価され、xがfalseの場合はyに評価されます。時々これは欠損値のデフォルトを提供するために使用されます:

name = raw_input("Enter your name: ") or "dude"
print "Hello, %s!" % name

プロンプトで何も入力しない場合は、Enterキーを押すだけです。raw_inputの戻り値は空の​​文字列 ""で、これはfalseと見なされます。 「or」の左側の分岐はfalseであるため、短絡せず、右側の分岐が評価されるため、「or」の結果は「dude」になります。プロンプトで値を入力した場合、短絡のために右側の分岐は評価されないため、「または」の値は入力したものになります。

Pythonには "x if y else z"があるため、この方法でブール演算子をこのように悪用することを多くの人が考えていますが、この特定の使用は十分に読みやすいと思います(しかし、これは唯一のものです!)「値はthis、または空の場合はそれです。」次と比較してください。

name = raw_input("Enter your name: ")
name = name if name else "dude"
print "Hello, %s!" % name
1
kindall

@Victor Neo:また、個別のブール値は必要ありません。

for happy in (False, "Peter", '', "Susan" , []):
    print(happy + ' is happy.' if happy else 'Everybody is bored.')

orおよびandを非ブール値で使用するよりもステートメントが優先される場合、Pythonでvalue if condition else valueが利用可能になる前に効果をエミュレートします。

0

例5.14のコードを見ると:

def __setitem__(self, key, item):         
    if key == "name" and item:            
        self.__parse(item)                
    FileInfo.__setitem__(self, key, item)

itemは変数であり、キーと同じです。

ifまたはtrueに評価される場合、falseステートメントで使用できます。

例えば。

happy = True
name = "Peter"
if name == "Peter" and happy:
    print name + " is happy!"
0
Victor Neo