31

我想知道是否可以在 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_series(或func1(..))中进行评估,我只是说fourier_series创建了一个接受变量x的新函数,这个函数可以稍后在外部调用,如y = F(3)......如果我让自己足够清楚?

4

7 回答 7

40

您应该能够通过定义一个新的内联函数来做到这一点:

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
于 2012-10-05T00:53:17.487 回答
4

你可以使用一个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)
>>>
于 2012-10-05T00:52:48.007 回答
4

虽然我不能给你一个具体的你打算做什么的答案。(看起来数学超出了我的范围。)

我可以告诉你,Python 确实支持一流的函数

Python 可以从函数返回函数,将函数存储在列表等集合中,并且通常像对待任何变量一样对待它们。

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

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

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

于 2012-10-05T00:56:05.730 回答
2

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

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
于 2012-10-05T00:50:02.250 回答
1

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

def make_f(a, b):
    def x(a, b):
      return a+b
     return x(a, b)
于 2012-10-05T00:50:15.607 回答
1

我正在浏览一些文档并找到了这个。

这是一个片段,就像您的代码一样:

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.

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

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

于 2019-06-13T13:56:44.813 回答
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. 是的,您可以从函数返回一个函数。只需确保使用return F(返回函数对象)返回它,而不是return F(x)调用函数并返回值
于 2012-10-05T00:53:18.807 回答