【问题标题】:Why Does This Python Function Print Twice?为什么这个 Python 函数会打印两次?
【发布时间】:2016-11-01 14:17:18
【问题描述】:

我无法解释为什么这段代码会打印两次“垃圾邮件”。

def do_twice(f):
    f()
    f()

def print_spam():
    print('spam')

do_twice(print_spam)

【问题讨论】:

  • 呃,因为你在do_twice里面调用了两次函数?
  • ...do_twice 调用输入函数 (print_spam) 两次。每次调用print_spam 时,都会打印'spam' ...
  • 您还期望发生什么?如果你做某事两次,它就会被完成两次。
  • "这个函数完全按照我说的去做了。为什么要这么做?"基本上...

标签: python


【解决方案1】:

让我们拆分您的代码...

第 1 部分:创建函数 do_twice(f),它将运行 f() 两次。

def do_twice(f):
    f()
    f()

第 2 部分:创建一个名为 print_spam() 的函数,它将 print() 单词 "spam"

def print_spam():
    print('spam')

第三部分:在do_twice()函数内调用函数print_spam()

do_twice(print_spam)

这样,您的代码将“思考”如下内容:

“哦,他打电话给do_twice(print_spam)!现在我必须运行print_spam() 两次,因为print_spam() 取代了f() 角色。”

【讨论】:

    【解决方案2】:

    do_twice(print_spam) 调用print_spam 两次,print_spam 打印出'spam',这就是代码打印两次的原因

    【讨论】:

      【解决方案3】:

      print_spam 是在 do_twice 函数中传递的函数对象。你用function_object()调用函数对象

      【讨论】:

        【解决方案4】:

        这只是关于您如何在脑海中排序代码以更好地理解:

        #Intermediate function right here
        
        def do_twice(f):
                       f()
                       f()
        
        #Function Definition Right here
        def print_spam():
                       print('spam')
        
        
        #calling the (actual) function  which in turn calls the intermediate function
        do_twice(print_spam)
        

        因此,当您调用(实际)函数一次时,您的中间函数 反过来,被调用两次,然后打印两次“垃圾邮件”。

        【讨论】:

          猜你喜欢
          • 2013-09-23
          • 1970-01-01
          • 1970-01-01
          • 2015-04-21
          • 1970-01-01
          • 1970-01-01
          • 2018-12-04
          • 1970-01-01
          • 2019-04-16
          相关资源
          最近更新 更多