"
有谁能解释一下(print()和sys.stdout.write的区别以及在哪种情况下应该使用每个函数并解释这些惯例的理由吗?"
我想你听到的关于Python3的print()函数的沉默,实际上只有一个区别:用法。让我引用PEP-3105 [1]:
print()
的签名是:
def print(*args, sep=' ', end='\n', file=None)
像下面这样的调用:
print(a, b, c, file=sys.stderr)
将等同于今天的写法:
print >>sys.stderr, a, b, c
sep和end可选参数指定了它们之间和之后打印的内容。
softspace特性(文件上的半保密属性,目前用于告诉print是否在第一项前插入空格)将被删除。因此,今天这个语句的直接翻译:
print "a", print
将不会在"a"和换行符之间打印空格。
因此,引用Guido van Rossum在2005年关于这个问题的讨论 [1]:
一旦你决定不想在项目之间放置空格,print易用性上存在明显的非线性;你要么必须切换到使用sys.stdout.write()
,要么必须将所有项目收集到一个字符串中。这不是一个简单的转换,考虑一下在这个简单的例子中消除逗号前的空格需要做什么:
print "x =", x, ", y =", y, ", z =", z
如果它是一个内置函数,那么有一个内置的伴随函数来做类似的事情而没有插入空格和添加换行符将是合乎逻辑的(或者添加关键字参数来控制这种行为;但我更喜欢第二个函数);但是只有现有的print函数,你需要切换到类似于下面的东西。print "x = " + str(x) + ", y = " + str(x) + ", z = " + str(z)
print "x = %s, y = %s, z = %s" % (x, y, z)
两者都不是很吸引人。(而且不要告诉我空格不重要——它们在其他情况下确实很重要。)
这是一个值得回忆的周日早晨好问题;为什么有这种表面上的冗余?因为更符合Python风格的编写高级代码:
Python第七禅则:“可读性很重要”。