2013-03-14 13 views
10

Ktoś właśnie pokazał mi ten dziwny przykład składni pythona. Dlaczego działa [4]?Co się dzieje z tą składnią pythona? (c == cw s)

Spodziewałbym się, że oceni to albo [5] albo [6], z których żadna nie działa. Czy jest tu jakaś przedwczesna optymalizacja, która nie powinna być?

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 

Odpowiedz

13

To samo cukier składniowym, który umożliwia pytona do wielu operatorów sieci (np <) razem.

Na przykład

>>> 0 < 1 < 2 
True 

Odpowiada to (0<1) and (1<2), z tym wyjątkiem, że środkowa jest wyrażenie tylko raz.

Oświadczenie c == c in s jest podobne do (c == c) and (c in s), co oznacza True.

Aby podkreślić wcześniejszy punkt, środkowy wyraz jest oceniany tylko raz:

>>> def foo(x): 
...  print "Called foo(%d)" % x 
...  return x 
... 
>>> print 0 < foo(1) < 2 
Called foo(1) 
True 

Zobacz Python Language Reference więcej szczegółów.