2013-04-17 42 views
7

在Python中,我們可以這樣做:Python的 - 在「如果」邏輯計算順序聲明

if True or blah: 
    print("it's ok") # will be executed 

if blah or True: # will raise a NameError 
    print("it's not ok") 

class Blah: 
    pass 
blah = Blah() 

if blah or blah.notexist: 
    print("it's ok") # also will be executed 
  • 有人可以指出我的文檔,這個功能?
  • 它是該語言的詳細實施信息?
  • 利用此功能是不錯的編碼風格?
+1

的'等等或TRUE'一個不引發異常對我來說,它打印。 –

+0

也許這是運氣? –

+3

@TimS .:只有當你定義'blah' * first *。請注意,示例頂部的'blah' *尚未定義,所以會引發'NameError'。 –

回答

21

orand短路,請參閱Boolean operations文檔:

表達x and y首先評估x;如果x爲假,則返回其值;否則,將評估y並返回結果值。

表達式x or y首先評估x;如果x爲真,則返回其值;否則,將評估y並返回結果值。

注意如何,爲andy只有評估,如果評估x的真正價值。相反,對於or,y僅在x評估爲False值時才被評估。

對於第一個表達式True or blah,這意味着blah永遠不會被評估,因爲第一部分已經是True

此外,您的自定義Blah類被認爲是真實的:

在布爾運算的情況下,以及當表達式通過控制流語句中,以下值解釋爲假:FalseNone,所有類型的數字零,空字符串和容器(包括字符串,元組,列表,字典,集合和frozensets)。所有其他值都被解釋爲true。 (換一種方式來改變這種見__nonzero__()特殊的方法。)

由於類不實現__nonzero__()方法(也沒有__len__法),它儘可能的布爾表達式關注考慮True

在表達式blah or blah.notexist中,blah因此爲真,並且blah.notexist從不被評估。

此功能是通過有經驗的開發相當定期和有效使用,最常指定默認值:

some_setting = user_supplied_value or 'default literal' 
object_test = is_it_defined and is_it_defined.some_attribute 

千萬要小心這些鏈接,並在適用情況下使用conditional expression代替。

5

這就是所謂的短路,並且是語言的一個特徵:

http://docs.python.org/2/tutorial/datastructures.html#more-on-conditions

的布爾運算符andor是所謂的短路操作符:它們的參數被評估從左到右,並在結果確定後立即停止評估。例如,如果A和C爲真,但B爲假,則A和B和C不會評估表達式C.當用作通用值而不是布爾值時,短路運算符的返回值是最後一個評估論證。

2

這是運營商邏輯運營商,特別是or在Python中的工作方式:短路評估。

爲了更好地解釋,考慮以下因素:

if True or False: 
    print('True') # never reaches the evaluation of False, because it sees True first. 

if False or True: 
    print('True') # print's True, but it reaches the evaluation of True after False has been evaluated. 

欲瞭解更多信息,請參閱以下內容:

1

對於or運算符,值從左到右進行評估。在一個值評估爲True後,整個語句評估爲True(因此不會評估更多值)。