今天进入一些有趣的Python行为。我虽然在写作
print("{}".format("some value"))
但我写了
print("{}").format("some value")
并且有趣的是它有效。所以我的问题是,这是如何工作的?
这种行为似乎是特定于python2的。
>>> print("{}").format("testing")
testing
>>> print("{}").format("testing)
File "<stdin>", line 1
print("{}").format("testing)
^
SyntaxError: EOL while scanning string literal
似乎python2的打印功能没有返回值,但Python3呢?这让我更加困惑。
>>> type(print("testing))
File "<stdin>", line 1
type(print("testing))
^
SyntaxError: invalid syntax
>>> a = print("testing")
File "<stdin>", line 1
a = print("testing")
^
SyntaxError: invalid syntax
>>> type(print("{}"))
{}
<class 'NoneType'>
>>> a = print("{}")
{}
>>> a
>>> type(a)
<class 'NoneType'>
答案 0 :(得分:7)
在Python 2中,print
是一个语句,而不是一个函数(除非你在模块的顶部做from __future__ import print_function
)。这意味着您正在打印的事物周围的括号不是函数调用的一部分,而只是被视为分组括号。在您描述的情况下,("{}")
与"{}"
相同(parens不执行任何操作),因此format
调用就像您在编写{{1}时所期望的那样工作}。
在Python 3中,"{}".format(...)
是一个函数,因此括号不是可选的,不能放在错误的位置。 print
会返回print
,因此,如果None
print(something).something_else
None
没有something_else
,您几乎肯定会收到错误属性。
答案 1 :(得分:1)
在Python 2.7中,print
是一个声明;这意味着
print("{}").format("testing")
打印一个表达式,即表达式("{}").format("testing")
的结果。也就是说,在计算print语句之前,在(带括号的)字符串上调用format
方法。如果你使用
from __future__ import print_function
在2.7示例中,您将获得与Python 3相同的行为。
答案 2 :(得分:1)
"testing
)。print()
函数,它有一个print
语句。你的字符串(即使它们被正确关闭)也不是你认为的字符串。答案 3 :(得分:0)
在Python 2中,print
is a statement keyword与raise
类似,而不是函数。括号不用于其参数,因此print("{}").format("testing")
被解析为好像您写的print ("{}").format("testing")
,与print(("{}").format("testing"))
相同。因为print
是一个语句,所以它不能用作表达式,因此它不能有返回值。
如果您希望Python 2中的print
像Python 3的print
函数一样运行,请将此行放在文件的顶部:
from __future__ import print_function