求解! python 基础求答疑,非常感谢!

2016-07-11 11:22:33 +08:00
 Pzdmultiverse
# -*- coding utf-8 -*-

def do_twice(s):
    s()
    s()

def print_spam():
    print('spam')

do_twice(print_spam())

执行结果如图:

为什么执行结果会打出一个 spam 再提示空类型无法调用呢?

1557 次点击
所在节点    问与答
12 条回复
kier
2016-07-11 11:28:21 +08:00
do_twice(print_spam())
等价于
do_twice(None)
Pzdmultiverse
2016-07-11 11:29:39 +08:00
@kier 明白,但是打印出来了一个 spam 是为什么呢?
ShiHou
2016-07-11 11:31:03 +08:00
传入 print_spame()的时候,先进行了一次 print_spam()。
kier
2016-07-11 11:36:35 +08:00
@Pzdmultiverse
刚才回答得比较简略,完整应该是
do_twice(print_spam())
等价于
ret = print_spam()
do_twice(ret)

其中 print_spam 的定义里没有显式的返回值,则默认返回 None
Pzdmultiverse
2016-07-11 11:36:59 +08:00
@ShiHou 就是说先执行了 print_spam(),把结果打印出来了,再去执行的 do_twice(none)吗?
为什么先打印出来了 print_spam()呢可是?
Pzdmultiverse
2016-07-11 11:39:25 +08:00
@kier 为什么把 ret 给打印出来了呢,我把那个
do_twice(print_spam())
改成了:
do_twice(print_spam)
只打印了 2 个,如果还是要吧 set 打印出来的话,应该是 3 个呀?
lxy
2016-07-11 11:49:50 +08:00
do_twice(print_spam) 相当于传了个 print_spam 函数指针进去。
do_twice(print_spam()) 相当于先调用执行 print_spam 函数后再把其返回的结果 None 传进去。
SuperMild
2016-07-11 11:54:26 +08:00
lz ,你要做的是这样 do_twice(print_spam)

注意 print_spam 和 print_spam() 的区别。
Pzdmultiverse
2016-07-11 11:56:43 +08:00
@SuperMild
@lxy
@kier
@ShiHou
非常感谢,明白了 !
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)
264768502
2016-07-11 21:38:52 +08:00
如果 print_spam 有参数的话呢?
除了分开作为 2 个参数传给 do_twice
Pzdmultiverse
2016-07-12 09:08:04 +08:00
@264768502 只能分开传两个参数吧,直接放参数进去是传函数的返回结果了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/291656

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX