Почему скобки в печати являются добровольными в 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.х скобок на print является обязательным, по существу делая его функция, но в 2.7 оба будут работать с разными результатами. Что еще я должен знать о print в Python 2.7?

652   4  

4 ответов:

В Python 2.x print на самом деле это специальный оператор, а не функция*.

это также, почему он не может быть использован как: lambda x: print x

отметим, что (expr) не создает Кортеж (это приводит к 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 тогда, без скобки, он лечит ,в особом порядке - и не создать Кортеж. Это особое отношение к print заявление позволяет ему действовать по-другому, если есть трейлинг , или нет.

удачи в кодировании.


*этот print поведение в Python 2 может быть изменено на поведение Python 3:

from __future__ import print_function

здесь у нас есть интересный побочный эффект, когда дело доходит до 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')

последняя печать-это кортеж с шестнадцатеричными байтовыми значениями.

Это все очень просто и не имеет ничего общего с прямой или обратной совместимости.

общая форма для print оператор во всех версиях Python до версии 3:

print expr1, expr2, ... exprn

(каждое выражение по очереди вычисляется, преобразуется в строку и отображается с пробелом между ними.)

но помните, что скобки вокруг выражения-это все то же выражение.

Так что вы также можете написать это как:

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

Это не имеет ничего общего с вызова функции.

в основном в Python до Python 3 print был специальным оператором, который печатал все строки, если они были получены в качестве аргументов. Так что print "foo","bar" просто означало "print ' foo', а затем 'bar'". Проблема с этим заключалась в том, что было заманчиво действовать так, как будто печать была функцией, и грамматика Python неоднозначна на этом, так как (a,b) - кортеж, содержащий a и b но foo(a,b) - это вызов функции из двух аргументов.

поэтому они сделали несовместимое изменение для 3, чтобы сделать программы менее неоднозначные и более регулярные.

(на самом деле, я думаю, что 2.7 ведет себя так же, как 2.6, но я не уверен.)

Comments

    Ничего не найдено.