Pzdmultiverse
V2EX  ›  问与答

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

  •  
  •   Pzdmultiverse · Jul 11, 2016 · 1991 views
    This topic created in 3680 days ago, the information mentioned may be changed or developed.
    # -*- coding utf-8 -*-
    
    def do_twice(s):
        s()
        s()
    
    def print_spam():
        print('spam')
    
    do_twice(print_spam())
    

    执行结果如图:

    执行结果

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

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

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

    注意 print_spam 和 print_spam() 的区别。
    Pzdmultiverse
        9
    Pzdmultiverse  
    OP
       Jul 11, 2016
    @SuperMild
    @lxy
    @kier
    @ShiHou
    非常感谢,明白了 !
    fengxiang
        10
    fengxiang  
       Jul 11, 2016
    # -*- coding utf-8 -*-

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

    def print_spam():
    print('spam')

    do_twice(print_spam)
    264768502
        11
    264768502  
       Jul 11, 2016 via Android
    如果 print_spam 有参数的话呢?
    除了分开作为 2 个参数传给 do_twice
    Pzdmultiverse
        12
    Pzdmultiverse  
    OP
       Jul 12, 2016
    @264768502 只能分开传两个参数吧,直接放参数进去是传函数的返回结果了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2840 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 09:35 · PVG 17:35 · LAX 02:35 · JFK 05:35
    ♥ Do have faith in what you're doing.