39032

[code]

    point=['c', 'b', 'd']
    if 'a' and 'b' and 'c' and 'd' in point:
        print(True)
    else:
        print(False)
    
[/code]

リスト内にaがないのにTrueが出力されます。andの書き方について教えていただきたいです。


CC BY-SA 3.0
2017-10-25T16:45:08.053
39031
2017-10-27T08:00:31.873
25909
question
python
python でのandの使い方について


`point`にa, b, c, dが全て含まれるかを評価するにはset（集合）型を使った比較を行います。  
次のようなif文になります。

[code]

    if set(['a', 'b', 'c', 'd']) <= set(point):
        print(True)
    else:
        print(False)
    
[/code]

<https://docs.python.jp/3.6/library/stdtypes.html?highlight=set#set-types-set-
frozenset>

x in y の場合 y に x が含まれるかの演算となり、質問の例の場合 `point` に 'd' が含まれるかの演算になります。  
<https://docs.python.jp/3/reference/expressions.html#in>

また演算子の優先順位が in, and の順ですので in が先に評価されます。  
<https://docs.python.jp/3/reference/expressions.html#operator-precedence>

[code]

    if 'a' and 'b' and 'c' and ('d' in point):
    -> if True and True and True and True:
    
[/code]

と評価されるためTrueになっています。  
'a', 'b', 'c', ('d' in point) は全てTrueと評価されます。

if ('a' and 'b' and 'c' and 'd') in point: とした場合、('a' and 'b' and 'c' and 'd')
が先に評価され 'd' in point となり True になります。

[code]

    >>> ('a' and 'b' and 'c' and 'd')
    'd'
    
[/code]


CC BY-SA 3.0
2017-10-25T18:44:56.660
39032
2017-10-27T08:00:31.873
2017-10-27T08:00:31.873
5375
5375
39031
answer


pythonの`and`演算子は左辺が`bool(左辺)`でTrueと評価されるとき右辺の値を、Falseのとき左辺の値を返します。

たとえば、`'a'`はTrueと評価されるため、`'a' and 'b'`は`'b'`となります。  
`''`はFalseと評価されるため、`'' and 'b'`は`''`となります。

質問の例ですと、

[code]

     'a' and 'b' and 'c' and 'd' in point
     -> 'a' and 'b' and 'c' and True
     -> 'b' and 'c' and True
     -> 'c' and True
     -> True
    
[/code]


CC BY-SA 3.0
2017-10-26T01:13:51.890
39035
2017-10-26T01:13:51.890
25911
39031
answer