# -*- coding utf-8 -*-
def do_twice(s):
s()
s()
def print_spam():
print('spam')
do_twice(print_spam())
执行结果如图:
为什么执行结果会打出一个 spam 再提示空类型无法调用呢?
1
kier 2016-07-11 11:28:21 +08:00
do_twice(print_spam())
等价于 do_twice(None) |
2
Pzdmultiverse OP @kier 明白,但是打印出来了一个 spam 是为什么呢?
|
3
ShiHou 2016-07-11 11:31:03 +08:00
传入 print_spame()的时候,先进行了一次 print_spam()。
|
4
kier 2016-07-11 11:36:35 +08:00
@Pzdmultiverse
刚才回答得比较简略,完整应该是 do_twice(print_spam()) 等价于 ret = print_spam() do_twice(ret) 其中 print_spam 的定义里没有显式的返回值,则默认返回 None |
5
Pzdmultiverse OP @ShiHou 就是说先执行了 print_spam(),把结果打印出来了,再去执行的 do_twice(none)吗?
为什么先打印出来了 print_spam()呢可是? |
6
Pzdmultiverse OP @kier 为什么把 ret 给打印出来了呢,我把那个
do_twice(print_spam()) 改成了: do_twice(print_spam) 只打印了 2 个,如果还是要吧 set 打印出来的话,应该是 3 个呀? |
7
lxy 2016-07-11 11:49:50 +08:00
do_twice(print_spam) 相当于传了个 print_spam 函数指针进去。
do_twice(print_spam()) 相当于先调用执行 print_spam 函数后再把其返回的结果 None 传进去。 |
8
SuperMild 2016-07-11 11:54:26 +08:00
lz ,你要做的是这样 do_twice(print_spam)
注意 print_spam 和 print_spam() 的区别。 |
9
Pzdmultiverse OP |
10
fengxiang 2016-07-11 12:01:19 +08:00
# -*- coding utf-8 -*-
def do_twice(s): s() s() def print_spam(): print('spam') do_twice(print_spam) |
11
264768502 2016-07-11 21:38:52 +08:00 via Android
如果 print_spam 有参数的话呢?
除了分开作为 2 个参数传给 do_twice |
12
Pzdmultiverse OP @264768502 只能分开传两个参数吧,直接放参数进去是传函数的返回结果了
|