Почему скобка напечатана в Python 2.7?
В Python 2.7 оба действия будут делать то же самое
print("Hello, World!") # Prints "Hello, World!"
print "Hello, World!" # Prints "Hello, World!"
Однако следующее не будет
print("Hello,", "World!") # Prints the tuple: ("Hello,", "World!")
print "Hello,", "World!" # Prints the words "Hello, World!"
В скобках Python 3.x при print
обязательно, что делает его функцией, но в 2.7 обе будут работать с разными результатами. Что еще я должен знать о print
в Python 2.7?
Ответы
Ответ 1
В Python 2.x print
на самом деле есть специальный оператор, а не функция *.
Вот почему он не может использоваться как: lambda x: print x
Обратите внимание, что (expr)
не создает Tuple (это приводит к expr
), но ,
делает. Вероятно, это приводит к путанице между print (x)
и print (x, y)
в 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.]
Однако, поскольку print
представляет собой специальный синтаксический оператор/грамматическую конструкцию в Python 2.x, то без скобки он обрабатывает ,
особым образом - и не создает Tuple. Эта специальная обработка оператора print
позволяет ему действовать по-разному, если существует конечный ,
или нет.
Счастливое кодирование.
* Это поведение print
в Python 2 может быть изменено на поведение Python 3:
from __future__ import print_function
Ответ 2
Здесь у нас есть интересный побочный эффект, когда дело доходит до 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')
Последняя печать - это кортеж с шестнадцатеричными байтовыми значениями.
Ответ 3
В основном в Python перед Python 3, печать была специальным выражением, в котором были напечатаны все строки, если они были получены как аргументы. Итак, print "foo","bar"
просто означало "print 'foo", за которым следует "bar". Проблема заключалась в том, что было заманчиво действовать так, как если бы печать была функцией, а грамматика Python неоднозначна, поскольку (a,b)
- это кортеж, содержащий a
и b
, но foo(a,b)
- это вызов функция двух аргументов.
Таким образом, они сделали несовместимое изменение для 3, чтобы сделать программы менее двусмысленными и более регулярными.
(На самом деле, я думаю, что 2.7 ведет себя как 2.6, но я не уверен.)
Ответ 4
Все это очень просто и не имеет ничего общего с обратной или обратной совместимостью.
Общий вид для оператора print
во всех версиях Python до версии 3:
print expr1, expr2, ... exprn
(Каждое выражение в свою очередь оценивается, преобразуется в строку и отображается с пробелом между ними.)
Но помните, что ставить круглые скобки вокруг выражения остается тем же самым выражением.
Таким образом, вы также можете написать это как:
print (expr1), (expr2), ... (expr3)
Это не имеет никакого отношения к вызову функции.