Что происходит с этим синтаксисом python? (c == c in s)
Кто-то просто показал мне этот странный пример синтаксиса python. Почему [4] работает?
Я бы ожидал, что он будет оценивать как [5], так и [6], ни одна из которых не работает. Есть ли какая-то преждевременная оптимизация, которая не должна быть?
In [1]: s = 'abcd'
In [2]: c = 'b'
In [3]: c in s
Out[3]: True
In [4]: c == c in s
Out[4]: True
In [5]: True in s
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-5-e00149345694> in <module>()
----> 1 True in s
TypeError: 'in <string>' requires string as left operand, not bool
In [6]: c == True
Out[6]: False
Ответы
Ответ 1
Это тот же синтаксический сахар, который позволяет питону связывать несколько операторов (например, <
) вместе.
Например:
>>> 0 < 1 < 2
True
Это эквивалентно (0<1) and (1<2)
, за исключением того, что среднее выражение оценивается только один раз.
Оператор c == c in s
аналогичен эквиваленту (c == c) and (c in s)
, который оценивается как True
.
Чтобы выделить более раннюю точку, среднее выражение оценивается только один раз:
>>> def foo(x):
... print "Called foo(%d)" % x
... return x
...
>>> print 0 < foo(1) < 2
Called foo(1)
True
Подробнее см. Справочник по языку Python.