2013-03-04 9 views
8

今日、コンピュータサイエンスでは、関数を変数として使用することについて尋ねました。たとえば、returnMe(i)などの関数を作成し、それを呼び出すための配列を作成できます。 h = [help、returnMe]と同様に、h1と言うことができ、returnMe( "Bob")を呼び出します。申し訳ありませんが、私はこれについて少し興奮していました。私の質問は、h.append(def関数)のように呼び出し、配列内にのみ存在する関数を定義する方法はありますか?リスト内のPython関数

編集:

ここに私がこれで書いたコードはありますか? 私はちょうどこのソリューションで素晴らしいFizzBu​​zzを終えたので、もう一度ありがとう!
FUNCT = [] の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) 

とほぼ同等です:

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

3

そうでもないPythonで:あなたはそれに機能のリストを作成したい場合は、

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

。 mgilsonが示すように、これは簡単な関数で行うことができますが、式ではなく式のみを含むことができるため、非常に限られています(たとえば、変数に代入することはできません)。

これはもちろん、他の言語でもサポートされています。たとえば、JavaScriptでは、実質的な匿名関数を作成して渡すことは非常に慣用的なことです。

+0

ちょうど完了:これは、(機能的なアプローチを可能にする他の言語の中でも)PythonとJavascriptの特有のものの1つです。これは設計上の選択です - 可読性のためにいくらかの柔軟性を提供します。 – jsbueno

+1

サイドノート。ラムダ用語は必ずしも「些細な」ものではない。それらが文を含むことができないという事実は、それらを全く制限しない限り、それらを非常に制限するものではない(多くの文は、純粋な機能的アプローチを使用して余計なものである)。ラムダ項の変数に代入できないという事実は、それをまったく制限しません。これらの側面が本当に制限されていた場合、純粋な関数型言語は非常に限られています(そうではありません)。私は、たとえPythonプログラムが存在するのであれば、ラムダの用語として書くことができないようにしています(たとえPythonがLCOをしていないのであれば)。 – Hyperboreus

+0

私は@Hyperboreusに同意します。私はlambdaをPythonで多用していて、2行しかなく、もう1つはランダムにインポートする遺伝的アルゴリズムを書いていました。 – Hovestar

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

あなたがそうのように0から9までのすべての数でインクリメントするlambda関数のリストを作成できます。

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)と同等です。