作者micangela (嘟)
看板Python
标题Re: [问题]一个 递回的 return问题
时间Fri Apr 8 10:34:33 2016
有趣的问题。 从Python bytecode来看有细微的差别。
以下是用Python2.7跑的实验。
结果是第一个写法多了一些东西,
但我猜很难对效能产生大影响。
===
实验一
import dis
def f(i):
if i == 0: return
print(i)
f(i-1)
dis.dis(f)
实验二
import dis
def f(i):
if i == 0: return
print(i)
return f(i-1)
dis.dis(f)
结果一
4 0 LOAD_FAST 0 (i)
3 LOAD_CONST 1 (0)
6 COMPARE_OP 2 (==)
9 POP_JUMP_IF_FALSE 16
12 LOAD_CONST 0 (None)
15 RETURN_VALUE
5 >> 16 LOAD_FAST 0 (i)
19 PRINT_ITEM
20 PRINT_NEWLINE
6 21 LOAD_GLOBAL 0 (f)
24 LOAD_FAST 0 (i)
27 LOAD_CONST 2 (1)
30 BINARY_SUBTRACT
31 CALL_FUNCTION 1
34 POP_TOP
35 LOAD_CONST 0 (None)
38 RETURN_VALUE
结果二
4 0 LOAD_FAST 0 (i)
3 LOAD_CONST 1 (0)
6 COMPARE_OP 2 (==)
9 POP_JUMP_IF_FALSE 16
12 LOAD_CONST 0 (None)
15 RETURN_VALUE
5 >> 16 LOAD_FAST 0 (i)
19 PRINT_ITEM
20 PRINT_NEWLINE
6 21 LOAD_GLOBAL 0 (f)
24 LOAD_FAST 0 (i)
27 LOAD_CONST 2 (1)
30 BINARY_SUBTRACT
31 CALL_FUNCTION 1
34 RETURN_VALUE
※ 引述《sunnoset (skj)》之铭言:
: f(10)
: 和
: def f(i):
: if i == 0: return
: print(i)
: return f(i-1)#加上return
: f(10)
: 执行结果一样
: 10
: 9
: 8
: 7
: 6
: 5
: 4
: 3
: 2
: 1
: 但我好奇在背景是否有差别呢?
: 谢谢指教
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 70.114.251.20
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1460082875.A.53F.html
1F:推 Yshuan: 因为没return的情况 是当作return None 04/08 10:55
2F:→ Yshuan: 诚实说 我不太理解为何要把这问题和递回并一起讨论 04/08 10:56