2011-08-11 15 views
61

Entiendo lo que print hace, pero ¿de qué "tipo" es ese elemento de idioma? Creo que es una función, pero ¿por qué no funciona?¿Qué es 'imprimir' en Python?

>>> print print 
SyntaxError: invalid syntax 

¿No es print una función? ¿No debería imprimir algo como esto?

>>> print print 
<function print at ...> 
+0

'print' puede ser una función o una declaración (construcción del lenguaje), dependiendo de la versión principal de Python que esté utilizando, pero definitivamente no es un operador. –

Respuesta

63

En 2.7 y hacia abajo, print es una afirmación. En python 3, print es una función. Para utilizar la función de impresión en Python 2.6 o 2.7, puede hacerlo

>>> from __future__ import print_function 
>>> print(print) 
<built-in function print> 

Ver this section de la Referencia del lenguaje Python, así como PEP 3105 de por qué cambió.

+15

Tenga en cuenta que "Nota" en el comentario anterior está mal escrito como "No";) – msw

+0

Acerca del tiempo que arreglaron eso. La declaración de impresión rota es la razón # 1 por la que no se usó Python en el pasado. –

+8

No es que el primer comentario anteriormente se refería a un comentario ahora eliminado. – wim

21

print es un error que se ha rectificado en Python 3. En Python 3 es una función. En Python 1.xy 2.x no es una función, es una forma especial como if o while, pero a diferencia de esas dos no es una estructura de control.

Por lo tanto, creo que lo más exacto para llamarlo es una afirmación.

7

En Python todas las instrucciones (excepto la asignación) se expresan con palabras reservadas, objetos no direccionables. Es por eso que no puede simplemente print print y obtiene un SyntaxError por intentarlo. Es una palabra reservada, no un objeto.

Confusamente, usted puede tiene una variable llamada print. No puede abordarlo de la manera normal, pero puede setattr(locals(), 'print', somevalue) y luego print locals()['print'].

Otras palabras reservadas que podrían ser deseables como nombres de variables, pero sin embargo son verboten:

class 
import 
return 
raise 
except 
try 
pass 
lambda 
+0

"verboten" se utiliza en inglés? gracioso. – Jacob

+0

@cularis: la palabra probablemente se usó más comúnmente como préstamo debido a las películas estadounidenses sobre la Segunda Guerra Mundial. –

+0

Nada confuso acerca de eso; en Python 2.6+ hay una función 'print 'incorporada todo el tiempo. 'from __future__ import print_function' elimina el análisis' print-the-statement' del módulo, para que no interfiera con la función incorporada. –

34

En Python 3, print() es una función incorporada (objeto)

Antes de esto, print era una declaración. Demostración ...

Python 2. x:

% pydoc2.6 print 

The ``print`` statement 
*********************** 

    print_stmt ::= "print" ([expression ("," expression)* [","]] 
        | ">>" expression [("," expression)+ [","]]) 

``print`` evaluates each expression in turn and writes the resulting 
object to standard output (see below). If an object is not a string, 
it is first converted to a string using the rules for string 
conversions. The (resulting or original) string is then written. A 
space is written before each object is (converted and) written, unless 
the output system believes it is positioned at the beginning of a 
line. This is the case (1) when no characters have yet been written 
to standard output, (2) when the last character written to standard 
output is a whitespace character except ``' '``, or (3) when the last 
write operation on standard output was not a ``print`` statement. (In 
some cases it may be functional to write an empty string to standard 
output for this reason.) 

-----8<----- 

Python 3. x:

% pydoc3.1 print 

Help on built-in function print in module builtins: 

print(...) 
    print(value, ..., sep=' ', end='\n', file=sys.stdout) 

    Prints the values to a stream, or to sys.stdout by default. 
    Optional keyword arguments: 
    file: a file-like object (stream); defaults to the current sys.stdout. 
    sep: string inserted between values, default a space. 
    end: string appended after the last value, default a newline. 
+8

+1: por mencionar pydoc – Kracekumar

+0

En Python 3 OP obtendrá el mismo resultado, aunque por un motivo diferente; 'print print' es mala sintaxis en ambos. – geoffspear

+0

@Wooble: Absolutamente. Al ser una función, 'print()' requiere corchetes. Incluí estos en mi respuesta. – Johnsyweb

2

En Python 2, print es una declaración, que es un conjunto diferente tipo de cosa de una variable o función. Las declaraciones no son objetos de Python que se pueden pasar al type(); son solo parte del lenguaje en sí mismo, incluso más que las funciones integradas. Por ejemplo, puede hacer sum = 5 (aunque no debería), pero no puede hacer print = 5 o if = 7 porque print y if son enunciados.

En Python 3, la instrucción print se reemplazó con la función print(). Entonces, si haces type(print), devolverá <class 'builtin_function_or_method'>.

PRIMA:

En Python 2.6+, puede poner from __future__ import print_function en la parte superior de su script (como la primera línea de código), y la declaración print será reemplazada con la función print().

>>> # Python 2 
>>> from __future__ import print_function 
>>> type(print) 
<type 'builtin_function_or_method'>