簡體   English   中英

意外的Python打印行為

[英]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.

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