2012-08-28 15 views
37

我理解語句和表達式之間的區別,並且我明白Python3會將print()轉換爲函數。在Python2.x中使用print()(函數版本)

但是我在各種Python2.x解釋器上運行了一個包含括號的print()語句,它運行得非常完美,我甚至不需要導入任何模塊。

我的問題:下面的代碼print("Hello SO!")被評估爲Python2.x中的語句或表達式嗎?

回答

38

考慮下面的表達式:

a = ("Hello SO!") 
a = "Hello SO!" 

他們是等價的。以同樣的方式,聲明:

statement_keyword("foo") 
statement_keyword "foo" 

也是等同的。

請注意,如果你改變你的打印功能:

print("Hello","SO!") 

你會發現蟒蛇2和Python 3之間的區別與Python 2,(...,...)被interpteted以來打印一個元組是一個語句而在python 3中,這是一個帶有多個參數的函數調用。

因此,要回答手頭上的問題,print被評價爲在Python 2.x的一份聲明中,除非你from __future__ import print_function

+0

......除非你從__future__ import print_function'或者其他所謂的東西。 – delnan

+0

在Python3中會使用__future__導入print_function傷害嗎?它不會導致導入錯誤。 – sgoblin

+1

@sgoblin - 沒有。 '__future__'模塊保證沒有任何東西會被刪除。它實際上是一個沒有運行python3.x – mgilson

2

它仍然作爲一個聲明進行評估,您只是簡單地打印("Hello SO!"),它簡單地計算爲"Hello SO!",因爲它不是一個元組(如delnan所述)。

+3

要說清楚,'( 「你好SO!」)'是完全等同於'' - 它不是一個元組 「你好麼!」。 – delnan

+0

感謝@delnan,在發佈關於1元組元組的一個很好的答案之前,我看到了你的評論。 –

+2

爲了擴展delnan的註釋,創建一個1元組,你需要一個逗號(例如'(「Hello SO!」,)') – mgilson

12

print("Hello SO!")(在Python 2.6中引入)被評爲聲明print ("Hello SO!"),這裏的參數來print聲明是表達式("Hello SO!")

如果您打印多個值,這可以有所作爲;例如print("Hello", "world")將打印2元素元組('Hello', 'world')而不是兩個字符串"Hello""world"

對於Python 3中使用from __future__ import print_function兼容性:

>>> print("Hello", "world") 
('Hello', 'world') 
>>> from __future__ import print_function 
>>> print("Hello", "world") 
Hello world 
+0

如果你想與python2.5和python3.x兼容,你可以使用字符串插值(儘管我不認爲太多人主張這些天......) – mgilson

+4

這也很有趣。請注意,如果將它放到腳本中,它會失敗,因爲'__future__'導入必須發生在文件的開頭,但通過一些深入的python magic,它可以在交互式解釋器中使用。 – mgilson

相關問題