【问题标题】:Function that call n time another function with arguments调用 n 次带参数的另一个函数的函数
【发布时间】:2017-05-10 20:32:10
【问题描述】:

为什么这段代码打印一次“土豆”而不是 5 次?

def print_word(word):
    print word
    return


def do_n(function , n):
    for i in range(n):
       function
    return

do_n( print_word("potato") , 5 )

【问题讨论】:

  • 因为你没有传递函数,或者在do_n 内部调用它。您调用它一次并传入结果(即None)。
  • 您的函数do_n 实际上并没有调用 function 参数。要调用对象,请使用function(),注意括号。只是做function 会计算出函数对象,它不会被分配给任何东西,只是被丢弃,本质上是一条无用的行。

标签: python function arguments parameter-passing


【解决方案1】:

您的代码实际上并未将print_word("potato")(“对print_word 的'调用'”)传递给do_n,而是将None 传递给print_word,因为print_word 返回None。这意味着print_word 运行的唯一时间是do_n( print_word("potato") , 5 )。你可以做的是使用functools.partial,它返回一个应用了参数的函数:

from functools import partial

def print_word(word):
    print(word)
    return # side note: the "return" isn't necessary 


def do_n(function , n):
    for i in range(n):
       function() # call the function
    return

do_n( partial(print_word,"potato") , 5)

functools.partial:

返回一个新的部分对象,当它被调用时,它的行为类似于 func 使用位置参数 args 和关键字参数调用 关键字。如果向调用提供更多参数,则它们是 附加到 args。

另一种方法是使用lambda 语句或单独传递参数:

def print_word(word):
    print(word)
    return # side note: the "return" isn't necessary 

def do_n(function , n):
    for i in range(n):
       function() # call the function
    return

do_n(lambda: print_word("potato"), 5) # use the lambda

或者:

def print_word(word):
    print(word)
    return # side note: the "return" isn't necessary 


def do_n(function , n, *args):
    for i in range(n):
       function(*args) # call the function
    return

do_n(print_word, 5, "potato") # pass the argument of print_word as a separate arg

【讨论】:

  • 啊,完全相同的解决方案。 :-)
【解决方案2】:

要传递带参数的函数,您可以单独传递参数,也可以对函数进行“部分”应用,在其中锁定多个变量。这是您的问题的解决方案,我已经“部分”应用了所有变量。但是,在function() 语句之前,该函数仍然没有调用

from functools import partial

def print_word(word):
    print word
    return

def do_n(function, n):
    for i in range(n):
        function()
    return

print_potato = partial(print_word, potato)

do_n(print_potato, 5)

【讨论】:

    猜你喜欢
    • 2017-02-17
    • 2019-06-28
    • 1970-01-01
    • 2014-01-12
    • 2016-08-06
    • 2020-03-09
    • 1970-01-01
    • 2013-07-05
    相关资源
    最近更新 更多