在python函数中创建一个新函数作为返回?

时间:2012-10-05 00:45:19

标签: python

我想知道在python中是否可以执行以下操作:

def func1(a,b):
   return func2(c,d)

我的意思是假设我用a,b做某事导致一些系数可以定义一个新函数,我想创建这个函数如果a,b的操作确实可行并且能够访问这个在func1之外。

一个例子是给定函数f的简单傅立叶级数F(x):

def fourier_series(f,N):
   ...... math here......
    return F(x)

我的意思是我想创建和存储这个新功能供以后使用,也许我想推导它,或者整合或绘图或者我想做什么,我不想发送点(s )x用于在fourier_series(或func1(..))中进行评估,我只是说fourier_series创建一个带有变量x的新函数,这个函数可以在y = F(3)之后调用...如果我做的话我自己清楚了吗?

7 个答案:

答案 0 :(得分:12)

您应该可以通过定义内联新函数来实现此目的:

fourier_series(f, N):
    def F(x):
        ...
    return F

您不仅限于传递给fourier_series的参数:

def f(a):
    def F(b):
        return b + 5
    return F

>>> fun = f(10)
>>> fun(3)
8

答案 1 :(得分:3)

虽然我不能给你一个特定于你打算做什么的答案。 (看起来像我的联盟中的数学。)

我可以告诉你Python支持first-class functions

Python可以从函数返回函数,将函数存储在集合(如列表)中,并且通常将它们视为任何变量。

很酷的事情,比如在其他函数中定义函数和返回函数都是可能的。

>>> def func():
...     def func2(x,y):
...         return x*y
...     return func2
>>> x = func()
>>> x(1,2)
2

函数可以分配给变量并存储在列表中,它们可以用作其他函数的参数,并且可以像任何其他对象一样灵活。

答案 2 :(得分:1)

您可以在函数内定义函数并返回它们(我认为这些是技术上的闭包):

def make_f(a, b):
    def x(a, b):
      return a+b
     return x(a, b)

答案 3 :(得分:1)

您可以使用lambda(虽然我更喜欢其他解决方案,但我认为:)):

>>> def func2(c, d):
...   return c, d
...
>>> def func1(a, b):
...   c = a + 1
...   d = b + 2
...   return lambda: func2(c,d)
...
>>> result = func1(1, 2)
>>> print result
<function <lambda> at 0x7f3b80a3d848>
>>> print result()
(2, 4)
>>>

答案 4 :(得分:1)

我正在浏览一些文档,发现了这一点。

这是类似于您的代码的代码段:

tableView

现在,constant()函数同时接受a和b并返回一个名为“ Anonymous Function”的函数,该函数本身接受f,并使用a和b调用f。

这称为“ closures”。闭包基本上是一个函数的实例。

答案 5 :(得分:0)

如果在外部函数中定义一个函数,则可以使用在内部函数定义中传递给外部函数的参数,并将该内部函数作为外部函数的结果返回。

def outer_function(*args, **kwargs):
    def some_function_based_on_args_and_kwargs(new_func_param, new_func_other_param):
        # do stuff here
        pass
    return some_function_based_on_args_and_kwargs

答案 6 :(得分:0)

我认为你想要做的是:

def fourier_series(f,N):
    #...... math here......
    def F(x):
        #... more math here ...
        import math #blahblah, pseudo code
        return math.pi #whatever you want to return from F
    if f+N == 2: #pseudo, replace with condition where f,N turn out to be useful
        return F
    else:
        return None

在外面,你可以这样称呼:

F = fourier_series(a,b)
if F:
    ans = F(x)
else:
    print 'Fourier is not possible :('

从Python的角度来看,重要的是:

  1. 是的,您可以在函数
  2. 中编写函数
  3. 是的,您可以从函数返回一个函数。只需确保使用return F(返回函数对象)返回它,而不是调用函数并返回值的return F(x)