【问题标题】:Can you store functions with parameters in a list and call them later in Python?您可以将带有参数的函数存储在列表中,然后在 Python 中调用它们吗?
【发布时间】:2020-03-31 22:33:27
【问题描述】:

例如,当我有:

def function(text):
  print(text)

mylist = [function('yes'),function('no')]

mylist[0]

它只打印 yes 和 no 并且不对 mylist[0] 做任何事情。

我希望它能够使用列表中的参数调用函数,并且在程序启动时不运行函数。这可能吗?

【问题讨论】:

标签: python python-3.x list function


【解决方案1】:

您可以将函数存储为参数,因为 python 中的函数被视为一等公民,这意味着您可以有效地使用它们/将它们视为变量。

在您的情况下,它不起作用,因为您正在调用该函数,而不是引用该函数。

mylist = [functionA,functionB]

mylist[0]('yes')

在这里,我将函数的引用存储到一个列表中,而不是调用它们。

当您使用 () 时,您实际上是在现场调用该函数。

【讨论】:

  • 有没有其他方法可以不用做多个函数来存储参数?我即将使用字符串和 eval()。我正在尝试获得更像这样的东西:mylist = [functionA('hi'),functionA('bye'),functionB('hi'),functionB('bye')] mylist[0]
【解决方案2】:

如果您打印mylist,您将看到它包含None,这是没有return 语句的函数的默认返回值。事实上,您只是简单地调用您的函数并将返回值保存在一个列表中。

【讨论】:

    【解决方案3】:

    听起来您想存储预先绑定参数的函数。您可以使用functools.partial 为您提供一个已定义部分或全部参数的函数:

    from functools import partial
    
    def f(text):
        print(text)
    
    mylist = [partial(f, 'yes'), partial(f,'no')]
    
    mylist[0]()
    # yes
    
    mylist[1]()
    # no 
    

    【讨论】:

    • 您也可以使用lambdamylist = [lambda: f('yes'), lambda: f('no')]
    猜你喜欢
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 2010-10-23
    • 2013-11-20
    相关资源
    最近更新 更多