为什么在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括号中是强制性的,本质上是一个函数,但是在2.7中,两者都会有不同的结果。 还有什么我应该知道在Python 2.7 print
?
在Python 2.x print
实际上是一个特殊的声明,而不是一个函数*。
这也是为什么它不能像使用: lambda x: print x
请注意(expr)
不会创build一个元组(它会导致expr
),但是。 这可能会导致Python 2.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.]
但是,由于print
是Python 2.x中一个特殊的语法语句/语法结构 ,所以没有括号,它以特殊的方式处理, 并且不会创buildTuple。 print
语句的这种特殊处理使其能够以不同的方式行事,如果存在尾随的话。
快乐的编码。
* Python 2中的print
行为可以更改为Python 3的print
行为:
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')
最后一次打印是具有hex字节值的元组。
基本上在Python 3之前的Python中,print是一个特殊的语句,打印所有的string,如果得到的参数。 所以print "foo","bar"
只是意味着“打印”foo“后跟”bar“”。 问题在于它很容易就像打印是一个函数一样行事,而且Python语法是不明确的,因为(a,b)
是包含a
和b
的元组,但是foo(a,b)
是对两个参数的函数。
所以他们做了不相容的变化,使节目更加模糊,更加规范。
(实际上,我认为2.7的performance是2.6,但我不确定)
这一切都很简单,与向前或向后的兼容性无关。
在版本3之前的所有Python版本中, print
语句的一般forms是:
print expr1, expr2, ... exprn
(依次评估每个expression式,将其转换为一个string,并在它们之间显示一个空格。)
但是请记住,把一个表情放在一边还是一样的表情。
所以你也可以这样写:
print (expr1), (expr2), ... (expr3)
这与调用函数无关。