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

在python函数中创建一个新函数作为return?,python,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) 我的意思是,我想创建并存储这个

我想知道在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)

我的意思是,我想创建并存储这个新函数,以备日后使用,也许我想对它求导,或积分或绘图,或者我想做的任何事情,我不想将点x发送到fourier_级数(或func1(..)中进行求值,我只想说fourier_级数创建了一个新函数,它取一个变量x,这个函数以后可以在外部调用,比如y=F(3)。。。如果我说得够清楚的话?

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

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

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


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

def func2(c,d): ... 返回c,d ... >>>def func1(a,b): ... c=a+1 ... d=b+2 ... 返回lambda:func2(c,d) ... >>>结果=func1(1,2) >>>打印结果 >>>打印结果() (2, 4) >>>
您应该能够通过定义一个新的内联函数来实现这一点:

fourier_series(f, N):
    def F(x):
        ...
    return F
您不限于传递给
fourier\u级数的参数:

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

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

我想你想做的是:

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的角度来看,重要的是:

  • 是的,您可以在函数中编写函数
  • 是的,您可以从函数返回函数。只需确保使用
    returnf
    (返回函数对象)返回它,而不是使用调用函数并返回值的
    returnf(x)

  • 虽然我不能给你一个具体的答案,你打算做什么。(看起来我的数学不行。)

    我可以告诉你Python确实支持

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

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

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

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

    我在浏览一些文档时发现了这一点

    这是一个与您的代码类似的代码片段:

    def constant(a,b):
        def pair(f):
            return(f(a,b))
        return pair
    a = constant(1,2) #If You Print variable-> a then it will display "<function constant. 
                                                            #<locals>.pair at 0x02EC94B0>"
    pair(lambda a, b: a) #This will return variable a.
    
    def常数(a,b):
    def对(f):
    报税表(f(a,b))
    返回对
    a=常数(1,2)#如果打印变量->a,则它将显示“”
    pair(lambda,b:a)#这将返回变量a。
    
    现在,constant()函数接受a和b,并返回一个名为“匿名函数”的函数,该函数本身接受f,并用a和b调用f


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

    我想这就是我需要的;)会看到它是否工作,并检查答案如果它对我的问题,我可能仍然需要一些帮助,谢谢大家,这是快速的:请考虑明确定义<代码> lambda < /代码>可能是唯一的方法,如果你不立即返回(例如,
    if..else
    ,其中返回
    f
    作为true和
    g
    else)。这还允许使用
    mypy
    进行类型检查,例如,使用
    可调用的
    >>> def func():
    ...     def func2(x,y):
    ...         return x*y
    ...     return func2
    >>> x = func()
    >>> x(1,2)
    2
    
    def constant(a,b):
        def pair(f):
            return(f(a,b))
        return pair
    a = constant(1,2) #If You Print variable-> a then it will display "<function constant. 
                                                            #<locals>.pair at 0x02EC94B0>"
    pair(lambda a, b: a) #This will return variable a.