V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Pzdmultiverse
V2EX  ›  问与答

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

  •  
  •   Pzdmultiverse · 2016-07-11 11:22:33 +08:00 · 1543 次点击
    这是一个创建于 3090 天前的主题,其中的信息可能已经有所发展或是发生改变。
    # -*- coding utf-8 -*-
    
    def do_twice(s):
        s()
        s()
    
    def print_spam():
        print('spam')
    
    do_twice(print_spam())
    

    执行结果如图:

    执行结果

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

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

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

    注意 print_spam 和 print_spam() 的区别。
    Pzdmultiverse
        9
    Pzdmultiverse  
    OP
       2016-07-11 11:56:43 +08:00
    @SuperMild
    @lxy
    @kier
    @ShiHou
    非常感谢,明白了 !
    fengxiang
        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)
    264768502
        11
    264768502  
       2016-07-11 21:38:52 +08:00 via Android
    如果 print_spam 有参数的话呢?
    除了分开作为 2 个参数传给 do_twice
    Pzdmultiverse
        12
    Pzdmultiverse  
    OP
       2016-07-12 09:08:04 +08:00
    @264768502 只能分开传两个参数吧,直接放参数进去是传函数的返回结果了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1846 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:19 · PVG 00:19 · LAX 08:19 · JFK 11:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.