为什么Python2.7中的括号是自愿性的?

为什么Python2.7中的括号是自愿性的?,python,printing,python-3.x,python-2.7,Python,Printing,Python 3.x,Python 2.7,在Python2.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 "

在Python2.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!"

在Python3.x中,
print
上的括号是必需的,本质上使它成为一个函数,但在2.7中,两者都会产生不同的结果。关于Python2.7中的
print
,我还应该知道什么呢?

在Python2.x中
print
实际上是一个特殊的语句,而不是一个函数*

这也是为什么它不能像这样使用:
lambda x:print x

请注意,
(expr)
不会创建元组(它会导致
expr
),但
会创建元组。这可能导致Python2.7中的
print(x)
print(x,y)
之间的混淆

(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.]
但是,由于在Python2.x中,
print
是一个特殊的语法语句/语法结构,因此,在没有括号的情况下,它以特殊的方式处理
,并且不创建元组。对
print
语句的这种特殊处理使它能够在是否有尾随
时采取不同的操作

快乐编码


*Python 2中的
print
行为可以更改为Python 3的行为:

from __future__ import print_function

基本上在Python3之前的Python中,print是一个特殊的语句,它将所有字符串作为参数打印出来。所以,
打印“foo”,“bar”
的意思就是“打印‘foo’,后面跟着‘bar’”。问题在于,这很容易让人觉得print是一个函数,而Python语法在这方面是不明确的,因为
(a,b)
是一个元组,包含
a
b
,但是
foo(a,b)
是对两个参数函数的调用

因此,他们对3进行了不兼容的更改,使程序不那么模棱两可,更加规范


(实际上,我认为2.7在这方面的表现与2.6相同,但我不确定。)

这一切都非常简单,与前向或后向兼容性无关

在版本3之前的所有Python版本中,
print
语句的一般形式为:

print expr1, expr2, ... exprn
(依次计算每个表达式,将其转换为字符串,并在它们之间显示一个空格。)

但请记住,在表达式周围加括号仍然是同一个表达式

所以你也可以这样写:

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

这与调用函数无关。

在这里,当涉及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')

最后一次打印是具有十六进制字节值的元组。

在Python2.x中
print
实际上是一个特殊语句,而不是一个函数。这也是为什么不能像这样使用它:
lambda x:print x
注意
(expr)
不会创建元组(它会导致
expr
),而是
确实如此。我假设对函数打印和语句打印的支持是为了保持与旧版本python的向后兼容性,同时鼓励人们使用新语法迁移到python 3.p.s,以启用2.7中的打印功能(而不具有打印语句行为),您必须在将来进行导入:
从uuu future\uuuuu导入print\u函数
第二个示例将实际打印“Hello,World!”(不带空格)还是将打印“Hello,World!”(带空格)如示例所示。谢谢
(expr)!=元组
解释:-)不,将其用作函数并不“诱人”。)但是,不可能将其用作函数,因此您不能执行[print x for x in alist]例如。我假设这是因为print正确地打印UTF-8,但当它收到一个元组时,就像上次打印一样,它会在其上运行
repr
,此时它可能会将dict中的所有字符串编码为ASCII。@Codemonkey,关于repr,你是对的。你错了。ASCII是Python的默认编码。但是在Python脚本的开头,我有一个脚本,linux env
LANG=en_US.utf-8
。所以repr编码不是使用默认的ASCII,而是utf-8编码。repr编码
str
,使用特殊的
string\u escape
编码。字符串已经用unicode编码为UTF-8。@KarloSmid:我的意思是,
repr
可能会采取措施确保文本可以用ASCII表示(通过转义非ASCII符号),而不一定要将字符串编码为ASCII。但我仍然不知道这是否完全准确。所有Python容器(list、dict、tuple、set)在转换为字符串时都将其内容作为
repr()
输出(它们不实现
\uuuuu str\uuuu
,只实现
\uu repr\uu
)。你所看到的并不是UTF-8所特有的;字符串的
repr()
为您提供了ASCII安全的有效Python字符串文本。这是一个完全正确的答案,我也不知道为什么它会被否决这么多。这与
print(expr1)、(expr2)无关。。。(expr3)
,这是关于为什么
打印(expr1,expr2,…,expr3)
在Python2.x中是合法的,而它不应该符合2.x标准。