Hua*_*uan 3 python python-2.7 python-3.x
在嵌套打印函数时,Python 3的默认打印序列存在一些问题,可以将其简化为以下示例:
>>> def print2():
... print('print2')
...
>>> print('print1', print2())
print2
print1 None
Run Code Online (Sandbox Code Playgroud)
但是在Python 2中使用等效项:
>>> def print2():
... print 'print2'
...
>>> print 'print1', print2()
print1 print2
None
Run Code Online (Sandbox Code Playgroud)
为什么打印顺序颠倒了?以及如何在Python 3中产生自然顺序(与Python 2中相同),而不是逆转?
不同之处在于,在Python 2中print是一条语句。特殊之处在于,从左到右对多个表达式求值,并立即写出它们的结果。
因此,在Python 2中,该语句print 'print1', print2()首先求值'print1',将其写出,然后求值print2(),其本身用于print写出'print2',然后在末尾写一个换行符。然后,Python交互式解释器将回显最后一个表达式的返回值None。
在Python 3中,print()是一个内置函数。函数只是更多的表达。您必须先评估所有参数表达式,然后才能执行函数。这意味着print(...)在评估完所有参数之后才真正执行该操作,因此在print2()函数完成并返回其值之前,无法将任何内容写到屏幕上。
因此,print('print1', print2())要正常工作,Python必须先执行评估'print1'(产生一个字符串对象),然后进行评估print2()(调用print('print2')并返回None),然后才能执行该函数并将其写出print1 None。
如果使用print('print1', print2()),您将在Python 2中获得相同的结果,因为实际上您将首先创建一个包含两个元素的元组,然后将其打印出来。print仍然是一个语句,并且在该元组转换为字符串并写出之前('print1', print2())被实例化('print1', None)(并print2写入屏幕)。或者,您可以from __future__ import print_function在Python 2中使用,此时编译器将禁用该print语句,并且您也可以print()在Python 2中使用该函数。
解决方案是使用两个单独的 print()函数调用,并用空格替换通常写的换行符:
print('print1', end=' ')
print(print2())
Run Code Online (Sandbox Code Playgroud)
这样,在调用'print1'之前已被写到屏幕上print2()。以上将输出
print('print1', end=' ')
print(print2())
Run Code Online (Sandbox Code Playgroud)
但是在交互式解释器中,缺少换行符会使输出变得有些混乱:
>>> print('print1', end=' ')
print1 >>> print(print2())
print2
None
Run Code Online (Sandbox Code Playgroud)
但是,你真的不希望使用print()写出来的返回值print2(),这是None在那里。删除多余的部分print()将使它消失:
print('print1', end=' ')
print2()
Run Code Online (Sandbox Code Playgroud)
如果print2()负责打印,则不要加倍打印电话。
的最佳选择,但是,是不是里面打印print2()。保持打印集中,订购不再重要。让您的函数返回要打印的字符串,而不是:
def result2():
return 'print2'
print('print1', result2())
Run Code Online (Sandbox Code Playgroud)
上面的代码将print1 print2在Python 2(前提是您使用print语句print 'print1', result2())和Python 3中输出。