web-dev-qa-db-fra.com

Pourquoi les parenthèses imprimées sont-elles volontaires dans Python 2.7?)?

Dans Python 2.7 les deux suivants feront la même chose

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

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

Cependant ce qui suit ne sera pas

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

print "Hello,", "World!" # Prints the words "Hello, World!"

Dans Python, la parenthèse 3.x sur print est obligatoire, ce qui en fait essentiellement une fonction, mais dans la version 2.7, les deux fonctionnent avec des résultats différents. Que dois-je savoir de plus sur print in Python 2.7?

94
Hubro

In Python 2.x print est en fait une instruction spéciale et non une fonction *.

C'est aussi pourquoi il ne peut pas être utilisé comme: lambda x: print x

Notez que (expr) Ne crée pas de tuple (il en résulte expr), mais , Le fait. Cela entraîne probablement la confusion entre print (x) et print (x, y) in 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.]

Cependant, puisque print est un instruction de syntaxe spéciale/construction grammaticale dans Python 2.x, sans la parenthèse, il traite le , De manière spéciale - et ne le fait pas créer un tuple. Ce traitement spécial de l'instruction print lui permet d'agir différemment s'il existe un , ou pas.

Bonne codage.


* Ce print comportement dans Python 2 peut être remplacé par celui de Python 3:

from __future__ import print_function
102
user166390

Nous avons ici un effet secondaire intéressant en ce qui concerne 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 dernière impression est Tuple avec des valeurs d'octets hexadécimales.

5
Karlo Smid

C'est très simple et n'a rien à voir avec la compatibilité ascendante ou descendante.

La forme générale de l’instruction print dans tous les Python antérieures à la version 3 est la suivante:

print expr1, expr2, ... exprn

(Chaque expression est à son tour évaluée, convertie en chaîne et affichée avec un espace entre elles.)

Mais rappelez-vous que mettre des parenthèses autour d'une expression reste la même.

Donc, vous pouvez aussi écrire ceci comme:

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

Cela n'a rien à voir avec l'appel d'une fonction.

3
Don O'Donnell

Fondamentalement dans Python avant Python 3, print était une instruction spéciale qui imprimait toutes les chaînes si elles étaient obtenues en tant qu'arguments. Donc print "foo","bar" Signifiait simplement " print 'foo' suivi de 'bar' ". Le problème était qu'il était tentant de faire comme si print était une fonction et que la grammaire de Python est ambiguë, car (a,b) Est un tuple contenant a et b mais foo(a,b) est un appel à une fonction de deux arguments.

Ils ont donc fait le changement incompatible pour 3 pour rendre les programmes moins ambigus et plus réguliers.

(En fait, je pense que 2.7 se comporte comme 2.6, mais je n'en suis pas certain.)

2
Charlie Martin