对嵌套打印用法中的打印顺序感到困惑

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中相同),而不是逆转

Mar*_*ers 6

不同之处在于,在Python 2中print是一条语句。特殊之处在于,从左到右对多个表达式求值,并立即写出它们的结果。

print参考文档中

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中输出。