10

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

編集:

ここに私がこれで書いたいくつかのコードがあります! だから私はこのソリューションで素晴らしい 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
4

4 に答える 4

17

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
于 2013-03-04T19:32:04.230 に答える
5

実際にはPythonではありません。mgilsonが示すように、これは簡単な関数で実行できますが、ステートメントを含めることはできず、式のみを含めることができるため、非常に制限されています(たとえば、変数に割り当てることはできません)。

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

于 2013-03-04T19:34:43.970 に答える
4

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

サイドノート:

これ (ラムダではなく関数ポインター) は、Python がほとんどのクラスでメソッドを保持する方法に多少似ていることに注意することも重要だと思いますが、リストではなく、関数を指す関数名を持つ辞書です。多くの場合、すべてではありませんinstance.func(args)が、同等instance.__dict__['func'](args)またはtype(class).__dict__['func'](args)

于 2013-03-04T19:55:58.803 に答える
4

元のスコープで関数を作成し、それらを配列に割り当ててから、元のスコープから削除できます。したがって、配列から呼び出すことはできますが、ローカル変数として呼び出すことはできません。これがあなたの要件を満たしているかどうかはわかりません。

#! /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
于 2013-03-04T19:40:25.297 に答える