在嵌套打印函数时,Python 3的默认打印序列存在一些问题,可以将其简化为以下示例:
>>> def print2():
... print('print2')
...
>>> print('print1', print2())
print2
print1 None
但是在Python 2中使用等效项:
>>> def print2():
... print 'print2'
...
>>> print 'print1', print2()
print1 print2
None
为什么打印顺序会颠倒?我如何才能在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())
这样,在调用'print1'
之前已被写到屏幕上print2()
。以上将输出
print1 print2
None
但是在交互式解释器中,缺少换行符会使输出结果变得有些混乱:
>>> print('print1', end=' ')
print1 >>> print(print2())
print2
None
但是,你真的不希望使用print()
写出来的返回值print2()
,这是None
在那里。删除多余的部分print()
将使它消失:
print('print1', end=' ')
print2()
如果print2()
负责打印,则不要加倍打印电话。
的最佳选择,但是,是不是里面打印print2()
。保持打印集中,订购不再重要。让您的函数返回要打印的字符串,而不是:
def result2():
return 'print2'
print('print1', result2())
上面的代码将print1 print2
在Python 2(前提是您使用print
语句,so print 'print1', result2()
)和Python 3中输出。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句