[英]Python, effect of parentheses on booleans in print statement
你能告訴我為什么括號會影響傳遞給print語句的布爾值的輸出嗎?
例:
print(True and False) or (True or False)
# False or True
# Python 2.7 >>> True
# Python 3.6 >>> False
但是當我使用括號時:
print((True and False) or (True or False))
# False or True
# Python 2.7 >>> True
# Python 3.6 >>> True
Python 3中的解釋器是否只看到第一部分(第一個括號內的部分)? 如果是這樣,為什么它不會為該行的其余部分拋出錯誤?
其他例子:
print(True and True) and (True and False)
# True and False
# Python 2.7 >>> False
# Python 3.6 >>> True
print((True and True) and (True and False))
# True and False
# Python 2.7 >>> False
# Python 3.6 >>> False
print(True and True) and not (False or True)
# True and not True
# Python 2.7 >>> False
# Python 3.6 >>> True
print((True and True) and not (False or True))
# True and not True
# Python 2.7 >>> False
# Python 3.6 >>> False
print(False or True) and not (True and True)
# True and not True
# Python 2.7 >>> False
# Python 3.6 >>> True
print((False or True) and not (True and True))
# True and not True
# Python 2.7 >>> False
# Python 3.6 >>> False
答案更新和評論:
我在BOLD的問題:
在Python3中,print是一個函數。 print(True and False)
是None
,和
print(True and False) or (True or False)
是相同的
None and (True or False)
這是False
,因為在布爾上下文中None是false-y。
是不是要告訴口譯員打印某些東西或評估其他東西? 這怎么可能是一個有效的語法?
因為第一部分被評估為None
然后第二次評估: None and (True or False)
不應該打印任何東西,除非我在shell中運行它。 例如:運行None and (True or False)
如果在SublimeText3等代碼編輯器中運行,則不會將結果打印給用戶(我沒有在sublime中使用任何額外的插件或包,只有程序的構建函數,並且除非將其傳遞給打印聲明,否則它不會打印任何內容。)
在Python3中, print
是一個函數。 作為沒有特定返回值的所有函數,它返回None
。
因此,執行print(True and False) or (True or False)
會發生以下情況:
評估True and False
,給出False
。
函數print()
以False
作為參數調用。 此print(False)
首先將“False”打印到終端,然后返回值None
。
現在,
None or (True or False)
得到評估為真。
如果您將此作為腳本的一部分執行,則會打印“False”,整個表達式將被計算為True
,並且由於您沒有將此True
分配給任何內容,因此它將被丟棄。
如果在REPL中執行此操作,則會打印“False”,整個表達式將被計算為False
,並且REPL將打印評估結果,如果您輸入了2 + 2,則打印4,因此您將獲得
>>> print(True and False) or (True or False)
False # <-- from print
True # <-- from the REPL, result of the evaluation of the whole expression
如果執行print(True and False) and (True or False)
會有一點區別。 這次,在打印之后,表達式是
None and (True or False)
由於None
在布爾上下文中是假的,所以Python知道結果and
將是假的(甚至不需要評估(True or False)
部分),並返回None
,因為它是允許它決定真實性的第一個值的表達。
如果你像以前一樣將它作為腳本的一部分執行,則會打印“False”,整個表達式將被計算為None
,並且由於您沒有將此None
分配給任何內容,因此它將被丟棄。
如果在REPL中執行此操作,則會打印“False”,整個表達式將被計算為None
。 由於這是所有不返回任何函數的普通返回值,因此REPL不會打印它,除非您明確要求它:
>>> print(True and False) and (True or False)
False # <-- from print, None doesn't get printed
>>> print(print(True and False) and (True or False))
False # <-- from the inner print
None # <-- None gets printed by the outer print
>>>
Print是Python2中的一個語句,所以它不需要括號,而它是Python3中的一個函數,所以它確實需要它們。
因此Python2將print(True and False) or (True or False)
視為單個語句,而Python3將print(True and False)
視為有效語句本身並計算它。
在python 2中, print
是一個聲明。 結果, print
后的所有內容都被評估為單個表達式。
例如,
print(True and False) or (True or False)
被評估為
result = (True and False) or (True or False)
print result
但是在python 3中, print
是一個函數,只打印括號內的表達式:
result = True and False
print(result) or (True or False)
這看起來很奇怪,但是有效的語法,因為print
是一個函數。 它基本上等同於:
result = True and False
result2 = print(result)
final_result = result2 or (True or False)
簡而言之,它就像python 2在print
后的所有內容中添加了一對額外的括號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.