2012-10-05 23 views
3

我在想,如果它是在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) 

我的意思是我想創造和存儲這個新的功能以備後用,也許我想推導它,或整合或繪圖或任何我想做的事情,我不想發送在fourier_series(或func1(..))中評估的點x,我只是說,fourier_series創建一個新函數需要一個變量x,這個函數可以稍後在外部調用,如y = F(3)...如果我讓自己足夠清楚了嗎?

回答

4

您應該能夠通過定義一個新的內聯函數來做到這一點:

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 
+0

我認爲這是我需要的;)會看看它是否有效,並檢查答案是否對我的問題,我可能仍然需要一些幫助,謝謝大家,這是快速的:D – arynaq

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 
1

你可以在裏面函數定義函數,並返回這些(我覺得這些都是技術上的閉包):

def make_f(a, b): 
    def x(a, b): 
     return a+b 
    return x(a, b) 
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) 
>>> 
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)它調用函數,並返回值
2

雖然我不能給你具體到你打算做什麼的答案返回。 (貌似數學我配不上。)

我可以告訴你,Python做支持first-class functions

Python可能會從函數返回函數,將函數存儲在列表等集合中,並且一般會像處理任何變量一樣對待它們。

諸如在其他函數中定義函數和返回函數都是可能的。

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

功能可以分配給變量和存儲在列表,它們可以被用作其他函數的參數並作爲任何其他對象作爲柔性的。

相關問題