python printing python-3.x python-2.7

¿Por qué el paréntesis en la impresión es voluntario en Python 2.7?



printing python-3.x (4)

En Python 2.7 ambos lo siguiente harán lo mismo

print("Hello, World!") # Prints "Hello, World!" print "Hello, World!" # Prints "Hello, World!"

Sin embargo, lo siguiente no

print("Hello,", "World!") # Prints the tuple: ("Hello,", "World!") print "Hello,", "World!" # Prints the words "Hello, World!"

En Python 3.x, el paréntesis en la print es obligatorio, esencialmente haciendo que sea una función, pero en 2.7 ambas funcionarán con resultados diferentes. ¿Qué más debería saber sobre print en Python 2.7?


Aquí tenemos un efecto secundario interesante cuando se trata de UTF-8.

>> greek = dict( dog="σκύλος", cat="γάτα" ) >> print greek[''dog''], greek[''cat''] σκύλος γάτα >> print (greek[''dog''], greek[''cat'']) (''/xcf/x83/xce/xba/xcf/x8d/xce/xbb/xce/xbf/xcf/x82'', ''/xce/xb3/xce/xac/xcf/x84/xce/xb1'')

La última impresión es una tupla con valores de bytes hexadecimales.


Básicamente en Python antes de Python 3, print era una declaración especial que imprimía todas las cadenas si se obtenían como argumentos. Así que print "foo","bar" simplemente significa "imprimir" foo "seguido de" barra "". El problema con eso era que era tentador actuar como si imprimir fuera una función, y la gramática de Python es ambigua en eso, ya que (a,b) es una tupla que contiene a y b pero foo(a,b) es una llamada a una función de dos argumentos.

Entonces hicieron el cambio incompatible para 3 para hacer que los programas sean menos ambiguos y más regulares.

(En realidad, creo que 2.7 se comporta como lo hizo 2.6 en esto, pero no estoy seguro).


En Python 2.x print es realmente una declaración especial y no una función *.

Esta es también la razón por la cual no se puede usar como: lambda x: print x

Tenga en cuenta que (expr) no crea una Tupla (resulta en expr ), pero sí lo hace. Esto probablemente resulte en la confusión entre print (x) e print (x, y) en Python 2.7

(1) # 1 -- no tuple Mister! (1,) # (1) (1,2) # (1,2) 1,2 # 1 2 -- no tuple and no parenthesis :) [See below for print caveat.]

Sin embargo, dado que print es una construcción de declaración / gramática de sintaxis especial en Python 2.x, entonces, sin el paréntesis, trata el , de una manera especial, y no crea un Tuple. Este tratamiento especial de la declaración de print permite actuar de manera diferente si hay un final o no.

Feliz codificación.

* Este comportamiento de print en Python 2 se puede cambiar al de Python 3:

from __future__ import print_function


Todo es muy simple y no tiene nada que ver con la compatibilidad hacia adelante o hacia atrás.

La forma general de la declaración de print en todas las versiones de Python anteriores a la versión 3 es:

print expr1, expr2, ... exprn

(Cada expresión a su vez se evalúa, se convierte en una cadena y se muestra con un espacio entre ellas).

Pero recuerde que poner paréntesis alrededor de una expresión sigue siendo la misma expresión.

Entonces también puedes escribir esto como:

print (expr1), (expr2), ... (expr3)

Esto no tiene nada que ver con llamar a una función.