簡體   English   中英

Python,括號對print語句中布爾值的影響

[英]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中使用任何額外的插件或包,只有程序的構建函數,並且除非將其傳遞給打印聲明,否則它不會打印任何內容。)

小gif演示

在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM