2013-03-04 97 views
8

因此,今天在計算機科學中,我問到了如何使用函數作爲變量。例如,我可以創建一個函數,例如returnMe(i)並創建一個將用於調用它的數組。像h = [help,returnMe],然後我可以說h1,它會調用returnMe(「Bob」)。對不起,我對此有點興奮。我的問題是有沒有像h.append(def函數)調用的方式,並定義一個只存在於數組中的函數?列表中的Python函數

編輯:

這是我寫的一些代碼! 所以我剛剛用這個解決方案完成了一個很棒的FizzBu​​zz,非常感謝你!下面是代碼爲例:
本功能= [] S = 「」

def newFunct(str, num): 
    return (lambda x: str if(x%num==0) else "") 

funct.append(newFunct("Fizz",3)) 
funct.append(newFunct("Buzz",5)) 

for x in range(1,101): 
    for oper in funct: 
     s += oper(x) 
    s += ":"+str(x)+"\n" 

print s 

回答

12

您可以使用該lambda關鍵字匿名函數。

def func(x,keyword='bar'): 
    return (x,keyword) 

大致等同於:

func = lambda x,keyword='bar':(x,keyword) 

所以,如果你想在它創建功能列表:

my_list = [lambda x:x**2,lambda x:x**3] 
print my_list[0](2) #4 
print my_list[1](2) #8 
+0

所以這太棒了!非常感謝!我們也在談論fizzBu​​zz,我認爲這將是非常酷的解決它! – Hovestar 2013-03-04 19:55:03

3

在Python不是真的。正如mgilson所表明的那樣,你可以用簡單的函數做到這一點,但它們只能包含表達式,而不是語句,所以非常有限(例如,你不能分配給一個變量)。

這當然也支持其他語言:例如,在Javascript中,創建大量的匿名函數並將它們傳遞給它是非常習慣的事情。

+0

剛剛完成:這是Python和Javascript(允許功能方法的其他語言)的獨特之處之一。這是一個設計選擇 - 爲可讀性交易一些靈活性。 – jsbueno 2013-03-04 21:16:25

+1

附註。 Lambda術語不一定「微不足道」。它們不能包含語句的事實並不會限制它們,如果它確實限制它們的話(大多數語句使用純粹的函數式方法是多餘的)。你不能在lambda表達式中分配變量的事實並不完全限制它。如果這些方面是真正的限制,純粹的功能語言將非常有限(他們不是)。我甚至不確定是否存在一個python程序,以至於它不能寫成lambda表達式(如果它不是因爲python不能執行LCO)。 – Hyperboreus 2013-03-04 22:55:59

+0

我也同意@Hyperboreus我在python中玩過很多lambda,甚至寫了一個只有兩行的遺傳算法,一個是隨機導入的,另一個是2000字左右的長度... – Hovestar 2013-12-24 19:26:17

2

您可以在原始範圍內創建函數,將它們分配給數組,然後從原始範圍中刪除它們。因此,您確實可以從數組中調用它們,但不能將其作爲局部變量。我不確定這是否符合您的要求。

#! /usr/bin/python3.2 

def a (x): print (x * 2) 
def b (x): print (x ** 2) 

l = [a, b] 

del a 
del b 

l [0] (3) #works 
l [1] (3) #works 
a (3) #fails epicly 
2

您可以創建lambda功能清單,每隔數從0增加至9,像這樣:

increment = [(lambda arg: (lambda x: arg + x))(i) for i in range(10)] 
increment[0](1) #returns 1 
increment[9](10) #returns 19 

側面說明:

我認爲這也是非常重要的注意,這(函數指針不是lambda表達式)有點像python在大多數類中保存方法,除了列表之外,它是一個函數名稱指向函數的字典。在許多但並非全部情況下,instance.func(args)相當於instance.__dict__['func'](args)type(class).__dict__['func'](args)