Python中print周围的括号意义是什么?

5

我在Python中有这行代码。

print 'hello world'

反对
print ('hello world')

能有人告诉我这两者之间的区别吗?

我在一个简单的代码中使用了它们。

var = 3
if var > 2: 
    print 'hello'

对于变量的所有值进行严格检查时,它会失败。但是,如果我将代码定义为

var = 3
if var > 2: 
    print ('hello')

它起作用了!


1
你的最后两个代码片段不是有效的Python代码。请不要发布这样的代码,因为很难确定出了什么问题。 - Fred Foo
请返回翻译文本: http://ramblings.timgolden.me.uk/2010/07/02/python-3-print-or-print/ 和 http://docs.python.org/3.0/whatsnew/3.0.html#what-s-new-in-python-3-0 - Matt Seymour
@larsmans 不确定你的意思; 它们是完全有效的(除了在Python 3中不存在print语句这一事实)。 - poke
@poke 两个代码片段都缺少 if 后面的冒号。这意味着代码是在 SO 上匆忙输入的,原始代码的结构可能完全不同。if 的缩进也是无效的 - 必须在打开块的语句后遵循缩进规则。因此,这些代码示例甚至都不接近有效。 - millimoose
@millimoose 我能看到冒号...? - poke
2
@poke 啊,那就是编辑了。 (SO会将发布问题后快速进行的编辑隐藏在历史记录中。)原始代码相当混乱。 - millimoose
3个回答

16

对于Python 2来说,这没有任何区别。在那里,print 是一个语句,'hello'('hello') 是它的参数。后者被简化为 'hello',因此它们是相同的。

在Python 3中,为了取代print语句,引入了一个print函数。函数需要用括号调用,所以实际上需要使用括号。在这种情况下,print 'hello' 是语法错误,而print('hello') 调用了带有 'hello' 作为第一个参数的函数。

您可以通过显式导入来将打印函数退回到Python 2中。要执行此操作,请将以下内容添加为模块的第一个导入:

from __future__ import print_function

那么在Python 2中,您将获得与Python 3相同的行为,再次需要使用括号。


9

您应该阅读Python 3.0的新特性

print语句已被替换为print()函数,使用关键字参数来替换旧版print语句的大部分特殊语法(PEP 3105)。

向后兼容性

本PEP提出的更改将使大多数现有的print语句无效。只有那些偶然在所有参数周围带有括号的语句才会在3.0版本中继续是有效的Python语法,并且其中只有打印单个括号值的语句将继续执行相同的操作。例如,在2.x中:

>>> print ("Hello", "world")  # without import
('Hello', 'world')

>>> from __future__ import print_function  

>>> print ("Hello", "world")       # after import 
Hello world

@hayden:除非你从future中导入print_function,否则它不会起作用。 - Abhijit
@Abhijit 不是真的;在Python 2中,print语句的括号会被忽略。就像在 print ((((('test'))))) 中一样被忽略。 - poke
@hayden:在Python中,括号可选,除非你正在调用一个可调用对象(函数或类)。在Python 2中,“print”是一个语句,因此跟在“print”语句后面的任何内容都是表达式,这使得那里的括号是可选的。 - Martijn Pieters
@MartijnPieters 在 Python 2.7.3 中 print('test') 可以正常工作... 抱歉这是我唯一提到的事情。 - Andy Hayden
@hayden 但是在2.x版本中,print('test', 'test')会返回一个元组。 - Ashwini Chaudhary
1
@hayden:没错,这就是我想说的。括号是print语句后面表达式的一部分。它们不会被解释为对python函数的调用。Ashwini非常正确地指出,添加逗号会将其变成一个元组,而不是print函数的多个参数。 - Martijn Pieters

1

我在寻找正则表达式以转换这些语法时到这里了。这是我为他人提供的解决方案:

适用于旧版Python2示例脚本。否则,使用2to3.py进行其他转换。

在Regexr.com上尝试一下(因某种原因在NP++中无法工作):

find:     (?<=print)( ')(.*)(')
replace: ('$2')

对于变量:

(?<=print)( )(.*)(\n)
('$2')\n

对于标签和变量:

(?<=print)( ')(.*)(',)(.*)(\n)
('$2',$4)\n

如何在Python2中用print("string")替换所有的print "string",以适应Python3?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接