2012-08-28 12 views
37

Capisco la differenza tra un'istruzione e un'espressione e capisco che Python3 ha trasformato print() in una funzione.Uso di print() (la versione della funzione) in Python2.x

Tuttavia ho eseguito un'istruzione print() circondata da parentesi su vari interpreti Python2.x e funzionava perfettamente, non avevo nemmeno bisogno di importare alcun modulo.

La mia domanda: il seguente codice print("Hello SO!") è stato valutato come istruzione o un'espressione in Python2.x?

risposta

38

Considerate le seguenti espressioni:

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

Sono equivalenti. Allo stesso modo, con una dichiarazione:

statement_keyword("foo") 
statement_keyword "foo" 

sono equivalenti.

Si noti che se si cambia la funzione di stampa per:

print("Hello","SO!") 

Si noterà una differenza tra Python 2 e Python 3. con Python 2, il (...,...) è interpteted come una tupla in quanto di stampa è una dichiarazione mentre in python 3, è una chiamata di funzione con più argomenti.

Quindi, per rispondere alla domanda a portata di mano, print viene valutata come una dichiarazione in python 2.x meno che non si from __future__ import print_function (introdotto in Python 2,6)

+0

... a meno che tu non abbia "da __future__ import print_function" o come si chiama. – delnan

+0

Utilizzerebbe da __future__ l'importazione di print_function in Python3? Non dà un errore di importazione. – sgoblin

+1

@sgoblin - No. il modulo '__future__' garantisce che nulla verrà mai rimosso da esso. È effettivamente un no-op su python3.x – mgilson

2

È ancora valutato come una dichiarazione, si stampa semplicemente ("Hello SO!"), che semplicemente valuta "Hello SO!" poiché non è una tupla (come menzionato da delnan).

+3

E per essere chiari, '("Ciao SO!")' È esattamente equivalente a '' - non è una tupla "Ciao COSÌ!". – delnan

+0

Grazie a @delnan, ho visto il tuo commento prima di pubblicare una bella risposta sulle tuple a 1 elemento. –

+2

E per espandere il commento di delnan, per creare una tupla 1, è necessaria una virgola (ad es. '(" Ciao COSÌ! ",)') – mgilson

12

print("Hello SO!") viene valutato come l'affermazione print ("Hello SO!"), dove l'argomento al La dichiarazione print è l'espressione ("Hello SO!").

Questo può fare la differenza se si stampa più di un valore; ad esempio print("Hello", "world") stamperà la tupla a 2 elementi ('Hello', 'world') invece delle due stringhe "Hello" e "world".

Per la compatibilità con Python 3 uso from __future__ import print_function:

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

Se vuoi essere compatibile con python2.5 e python3.x puoi usare l'interpolazione delle stringhe (anche se non credo che molte persone stiano sostenendo che oggigiorno ...) – mgilson

+4

Anche questo è abbastanza interessante. Notate che se lo inserite in uno script, fallirà perché le importazioni di "__future__' devono essere eseguite all'inizio del file, ma con qualche magia profonda di Python, funziona nell'interprete interattivo. – mgilson

Problemi correlati