Python:如何将函数作为参数传递给另一个函数?

Python:如何将函数作为参数传递给另一个函数?,python,function,arguments,Python,Function,Arguments,我有两个自定义函数: f(), g() 我想将所有月份传递给他们,并传递另一个函数,如下所示: x(f("Jan"), g("Jan"), f("Feb"), g("Feb"), f("Mar"), g("Mar"), ...) 如何在短时间内完成 首先,我们要对列表中的每一项调用f()和g()。我们可以通过以下方式实现: 这将生成一个元组列表,但我们需要一个平面列表,因此我们使用它来平面化(或者在本例中,只是一个生成器表达式): 然后,我们将此变量放入x()的参数中: 编辑:如果您希望传递

我有两个自定义函数:

f(), g()
我想将所有月份传递给他们,并传递另一个函数,如下所示:

x(f("Jan"), g("Jan"), f("Feb"), g("Feb"), f("Mar"), g("Mar"), ...)
如何在短时间内完成


首先,我们要对列表中的每一项调用
f()
g()
。我们可以通过以下方式实现:

这将生成一个元组列表,但我们需要一个平面列表,因此我们使用它来平面化(或者在本例中,只是一个生成器表达式):

然后,我们将此变量放入
x()
的参数中:

编辑:如果您希望传递准备使用该参数执行的函数,而不执行它们,则需要进行以下操作:

from functools import partial

[(partial(f, month), partial(g, month)) for month in months]

这意味着
x()
的参数将是调用时运行
f()
g()。当然,这可以像以前一样进行扩展。

因此,首先,我们要对列表的每个项目调用
f()
g()
。我们可以通过以下方式实现:

这将生成一个元组列表,但我们需要一个平面列表,因此我们使用它来平面化(或者在本例中,只是一个生成器表达式):

然后,我们将此变量放入
x()
的参数中:

编辑:如果您希望传递准备使用该参数执行的函数,而不执行它们,则需要进行以下操作:

from functools import partial

[(partial(f, month), partial(g, month)) for month in months]


这意味着
x()
的参数将是调用时运行
f()
g()。当然,这可以像以前一样进行扩展。

要明确的是:您希望将所有月份执行
f()
g()
的返回值传递到
x()
,而不是实际的
f
g
函数本身,它们不一样吗?@alwbtc传递函数、执行函数和传递返回值之间有区别。我想你想要后者。(前者可以通过使用来实现)。@alwbtc:一点也不。在Python中,函数本身就是值(正如Hiroto下面的回答所指出的)。事实上,有一种完整的编程方法,函数式编程,它依赖于能够传递函数,拥有返回其他函数的函数,等等。嗯,如果我想要前一个呢?很清楚:你想要传递执行
f()
g()的返回值
在到
x()
的所有月份,不是实际的
f
g
函数本身?它们不是一样吗?@alwbtc传递函数、执行该函数和传递返回值之间有区别。我想你想要后者。(前者可以通过使用来实现)。@alwbtc:一点也不。在Python中,函数本身就是值(正如Hiroto下面的回答所指出的)。事实上,有一种完整的编程方法,函数式编程,它依赖于能够传递函数,拥有返回其他函数的函数,等等。嗯,如果我想要前一个呢?@alwbtc这一切都是有经验的,你做的越多,你需要的东西越多,你学到的东西越多。标准Python文档也很棒,值得一读。@alwbtc:关于如何了解所有这些东西,我强烈推荐Peter Norvig的文章。@alwbtc:Lattyware说了什么。知道如何编程的很大一部分是知道你能知道的东西。如果你知道某个东西存在,但只是不记得它叫什么或如何使用它,你通常可以很快找到答案。但是如果你甚至不知道你在找什么,你可能永远也找不到。如果你了解什么是一阶函数和部分应用程序,那么理解
functools.partial()
做什么并不难——但是如果你不知道这些概念,你甚至不会想到去看一个名为
partial()
的函数来寻找解决方案。@alwbtc它变化很大,我20岁,从大约8年到12年,我一直在编程,但在我年轻的时候,大部分都是写些简单的垃圾。如果你想获得经验,就去做你自己的项目、开源软件等等。。。进入并不难。@alwbtc哦,大概在旧版本的Python中,
*
对iterables不起作用,只需将对
itertools.chain.from_iterable(…)
的调用包装在
list()
调用中。我不认为2.6.5是一个非常旧的版本,如果你需要2.x,建议使用2.7,如果不需要,建议使用3.3。@alwbtc这一切都是有经验的,你做的越多,你需要的东西就越多,所以你学到的东西就越多。标准Python文档也很棒,值得一读。@alwbtc:关于如何了解所有这些东西,我强烈推荐Peter Norvig的文章。@alwbtc:Lattyware说了什么。知道如何编程的很大一部分是知道你能知道的东西。如果你知道某个东西存在,但只是不记得它叫什么或如何使用它,你通常可以很快找到答案。但是如果你甚至不知道你在找什么,你可能永远也找不到。如果你了解什么是一阶函数和部分应用程序,那么理解
functools.partial()
做什么并不难——但是如果你不知道这些概念,你甚至不会想到去看一个名为
partial()
的函数来寻找解决方案。@alwbtc它变化很大,我20岁,从大约8年到12年,我一直在编程,但在我年轻的时候,大部分都是写些简单的垃圾。如果你想获得经验,就去做你自己的项目、开源软件等等。。。进入并不难。@alwbtc哦,大概在旧版本的Python中,
*
对iterables不起作用,只需将对
itertools.chain.from_iterable(…)
的调用包装在
list()
调用中。我不认为2.6.5是一个非常旧的版本,2.7
x(*chain.from_iterable((f(month), g(month)) for month in months))
from functools import partial

[(partial(f, month), partial(g, month)) for month in months]