我在 Python :
中编写以下代码def fib(n):
a, b = 0, 1
while b < n:
print(b, end=' ')
a, b = b, a + b
print(fib, fib(10))
我认为正确的输出应该是:
<function fib at 0x000001DF4BB13E18> 1 1 2 3 5 8
但输出是:
1 1 2 3 5 8 <function fib at 0x000001C60F823E18> None
代码打印无,其行为是奇数。
为什么print
函数的行为是奇数?
答案 0 :(得分:3)
在print()
实际调用之前,print()
的两个参数都已完全评估。由于主print()
的第二个参数为fib(10)
,因此在此过程中使用参数fib
调用10
。由于它打印的东西,这些都在评估过程中打印出来。函数本身不包含return
语句,因此返回None
,这就是打印的原因。
答案 1 :(得分:3)
行为是正确的。只是在您致电fib(10)
之前执行了print
。这是因为函数调用的参数必须在传递给函数之前执行。
所以实际上你确实计算了fib(10)
(包括函数中的所有print
),然后打印fib
和fib(10)
调用的结果(这是None
因为您的fib
函数不包含明确的return
)。
您也可以调用dis.dis
查看评估顺序:
def f():
print(fib, fib(10))
import dis
dis.dis(f)
结果:
10 0 LOAD_GLOBAL 0 (print) 2 LOAD_GLOBAL 1 (fib) 4 LOAD_GLOBAL 1 (fib) 6 LOAD_CONST 1 (10) 8 CALL_FUNCTION 1 ----> the fib(10) call 10 CALL_FUNCTION 2 ----> the print call ^------- number of arguments! 12 POP_TOP 14 LOAD_CONST 0 (None) 16 RETURN_VALUE
答案 2 :(得分:1)
让我们打破这个。
首先我们来看看排序:
print(fib, fib(10))
首先评估对fib的调用,并将其返回值传递给print函数。
fib(10)将自己进行一些打印,然后退出。在这种情况下,它不会显式返回值,因此被视为None
因此,上述打印调用可视为
print(fib, None)
这将导致打印功能地址,然后打印None