[英]Unexpected Python print behavior
只是遇到了以下Pythonic行為,我無法理解:
names = ["Paul", "Mary", "Susan"]
names.sort()
def valuate(string):
print ord('A')
return sum(ord(s) for s in string)
i = 1
for name in names:
print i, name, valuate(name)
i += 1
我希望輸出:
65
1 Mary 409
65
2 Paul 402
65
3 Susan 522
但改為輸出:
1 Mary 65
409
2 Paul 65
402
3 Susan 65
522
看來print語句已經嘗試輸出3個元素,並且當調用print ord('A')時,將其作為第三個語句嗎?
我沒有找到有關此行為的任何參考,也沒有任何線索我該如何使用Google。 順便說一句,我在這里使用Python 2.7.3。 Anyhoo,我在這里很困惑。
這不僅僅是print
語句,而是函數調用。
print i, name, valuate(name)
先打印i
,然后是name
,然后調用valuate
,先打印65(和換行),然后在返回時, print
語句繼續打印返回值(和換行)。
事件的順序如下:
print i,
print name,
val = valuate(name) # prints ord('A')
print val
通過查看為print i, name, valuate(name)
生成的字節碼print i, name, valuate(name)
可以確認這一點:
11 19 LOAD_FAST 0 (i)
22 PRINT_ITEM
23 LOAD_FAST 1 (name)
26 PRINT_ITEM
27 LOAD_GLOBAL 1 (valuate)
30 LOAD_FAST 1 (name)
33 CALL_FUNCTION 1
36 PRINT_ITEM
37 PRINT_NEWLINE
我不知道此評估順序是否得到保證(快速搜索沒有發現任何內容)。 我絕對不會依賴它,因此不會編寫這樣的代碼。
非常簡單 您的打印語句懶惰地評估參數。 它先打印i,然后打印名稱,然后調用valuate。 評估結果打印65。然后,您的印刷報表打印評估結果。
您遇到的驚喜是print
語句在計算下一個表達式之前先打印出它給出的每個表達式。 也就是說,類似於print A, B, C
的語句等效於:
print A, # note, the trailing comma suppresses the newline
print B,
print C
正如您從單獨的語句中所期望的那樣,A在B或C求值之前就被寫出。
令人驚訝的原因可能是Python 3放棄了print
語句而改用內置的print
函數的原因的一部分,該print
函數的行為更像您期望的那樣(其所有參數在函數運行之前進行評估)。
在Python 2中,如果要使用future
導入,則可以獲取Python 3樣式的print
:
from __future__ import print_function
我認為一個小的“,”將使事情變得更容易掌握。
names = ["Paul", "Mary", "Susan"]
names.sort()
def valuate(string):
print ord('A'),
return sum(ord(s) for s in string)
i = 1
for name in names:
print i, name, valuate(name)
i += 1
現在輸出:
1 Mary 65 409
2 Paul 65 402
3 Susan 65 522
print
后的逗號使其不能在末尾打印換行符。 因此,現在您可以看到valuate
首先打印ord('A')
,然后返回外部打印的輸出。 (我也縮進了i += 1
行)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.