2013-04-24 85 views
8

如果您有一個if語句,其中評估了幾個變量或函數,它們的評估順序是什麼?以Python語言評估的if語句的順序

if foo > 5 or bar > 6: 
    print 'foobar' 

在此特定情況下,將針對FOO的五個進行評估,然後禁止針對6(左到右),或者將其進行評估從右到左?我假設orand按照相同的順序進行評估。

+3

這有什麼做用'if'語句的計算順序,但有一個'或'表達式的計算順序。對於'x =(foo> 5或bar> 6)',或者就此而言,您可以得到完全相同的規則,只是'foo> 5或bar> 6'作爲一個聲明。 – abarnert 2013-04-24 20:22:00

+2

嘗試玩耍,看看會發生什麼。就像這會產生什麼樣的結果;「如果是或否和假和假或假:' – 2013-04-24 20:25:47

回答

18

左邊的條款將被評估,然後右邊的條款只有第一個是False

這就是爲什麼你可以不喜歡的東西:

if not person or person.name == 'Bob': 
    print "You have to select a person and it can't be Bob" 

沒有它打破。

相反,與and條款,正確的條款將僅第一個是True評價:

if person and person.name: 
    # ... 

否則,當personNone一個異常會被拋出。

7

它將從左到右進行評估。

>>> def a(): 
...  print 'a' 
...  return False 
... 
>>> def b(): 
...  print 'b' 
...  return False 
... 
>>> print a() or b() 
a 
b 
False 
>>> def c(): 
...  print 'c' 
...  return True 
... 
>>> print c() or a() 
c 
True 
1

Python的or運營商短路,並進行評估從左到右:

if (foo > 5) or (bar > 6): 
    print 'foobar' 

如果foo > 5,然後bar > 6甚至不會被測試,因爲True or <anything>True。如果foo不是> 5,則將測試bar > 6

3

擴大Blender的解釋有點此外,or運營商有別的事情內置:

<expression A> or <expression B> 

這將評估expression A第一;如果它評估爲True則由運營商返回expression A。因此5 or <something>將返回5,因爲5評估爲True

如果expression A評估爲False,則返回expression B。因此0 or 5將返回5,因爲0評估爲False

當然你也可以鏈你想這是很多:

<expr 1> or <expr 2> or <expr 3> or ... or <expr n> 

一般來說,or將返回第一表達式計算結果爲True,但保留其原始值。如果沒有表達式的計算結果爲True,則只會返回最後一個表達式(計算結果爲False)。

and操作員以類似但相反的方式工作。它將返回第一個表達式,其確實評估爲False,但保持其原始值。如果沒有表達式評估爲False,它將簡單地返回最後一個表達式(將評估爲True)。

舉個例子,既0 and 55 and 0將返回0因爲0計算結果爲False,但2 and 3將返回3因爲3是最後的表達,一切都計算爲True

以任何方式(回到問題):所有表達式都是從左到右計算的,如果上面的規則允許它,則不會觸及進一步的表達式。