Dans Python 2.7, les deux éléments 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!"
En Python 3.x, les parenthèses print
sont obligatoires, ce qui en fait essentiellement une fonction, mais dans 2.7 les deux fonctionneront avec des résultats différents. Que dois-je savoir d'autre sur print
Python 2.7?
print
est en fait une instruction spéciale, pas une fonction. C'est aussi pourquoi il ne peut pas être utilisé comme:lambda x: print x
Notez que(expr)
cela ne crée pas de Tuple (il en résulteexpr
), mais le,
fait.from __future__ import print_function
Réponses:
En 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)
cela ne crée pas de Tuple (il en résulteexpr
), mais le,
fait. Cela entraîne probablement la confusion entreprint (x)
etprint (x, y)
dans Python 2.7Cependant, comme il
print
s'agit d'une instruction de syntaxe / construction grammaticale spéciale en Python 2.x, sans les parenthèses, il traite les,
's d'une manière spéciale - et ne crée pas de tuple. Ce traitement particulier de l'print
instruction lui permet d'agir différemment s'il y a un suivi,
ou non.Bon codage.
* Ce
print
comportement dans Python 2 peut être changé pour celui de Python 3:la source
(expr) != tuple
explication :-)Tout cela est très simple et n'a rien à voir avec la compatibilité ascendante ou descendante.
La forme générale de l'
print
instruction dans toutes les versions de Python avant la version 3 est:(Chaque expression est à son tour évaluée, convertie en chaîne et affichée avec un espace entre elles.)
Mais rappelez-vous que placer des parenthèses autour d'une expression est toujours la même expression.
Vous pouvez donc également écrire ceci comme suit:
Cela n'a rien à voir avec l'appel d'une fonction.
la source
print (expr1), (expr2), ... (expr3)
, il s'agit de savoir pourquoiprint (expr1, expr2, ... , expr3)
est légal en python 2.x alors que cela ne devrait pas être conforme aux normes 2.x.Ici, nous avons un effet secondaire intéressant en ce qui concerne UTF-8.
La dernière impression est un tuple avec des valeurs d'octets hexadécimaux.
la source
repr
dessus, auquel point il encode probablement toutes les chaînes du dict en ASCII.#encoding=utf-8
, linux envLANG=en_US.UTF-8
. Donc repr encode sans utiliser l'ASCII par défaut, mais avec l'encodage utf-8.str
avec lestring_escape
codage spécial . La chaîne était déjà codée en Unicode en UTF-8.repr
prend probablement des mesures pour s'assurer que le texte peut être représenté par ASCII (au moyen d'échappements de symboles non ASCII), pas nécessairement que la chaîne soit codée en ASCII. Je ne sais toujours pas si c'est tout à fait exact.repr()
sortie lorsqu'ils sont convertis en chaîne (ils ne sont pas implémentés__str__
, uniquement__repr__
). Ce que vous voyez n'est pas spécial pour UTF-8; lerepr()
of a string vous donne des littéraux de chaîne Python valides qui sont ASCII-safe.Fondamentalement, dans Python avant Python 3, print était une instruction spéciale qui imprimait toutes les chaînes si elles étaient obtenues en arguments. Donc
print "foo","bar"
simplement signifiait "imprimer 'foo' suivi de 'bar'". Le problème avec cela était qu'il était tentant d'agir comme si print était une fonction, et la grammaire Python est ambiguë à ce sujet, car(a,b)
est un tuple contenanta
etb
maisfoo(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 à ce sujet, mais je ne suis pas certain.)
la source