8

Python は非常に柔軟なので、関数をリストの要素として、または他の関数の引数として使用できます。例えば:

x = [sin, cos]
y = s[0](3.14) # It returns sin(3.14)

また

def func(f1, f2):
   return f1(2.0) + f2(3.0)

ただし、ランダム関数で同じことを行う方法は明確ではありません。たとえば、ガウス分布を使用したい: [random.normalvariate(3.0, 2.0), random.normalvariate(1.0, 4.0)]. この例では、2 つの要素を含む固定リストを取得します。しかし、私が取得したいのは、ランダムな要素を持つリストです。Pythonでそれを行う良い方法は何ですか?

4

3 に答える 3

8

関数で試してくださいlambda

[lambda: random.normalvariate(3.0, 2.0), lambda: random.normalvariate(1.0, 4.0)]

括弧で違いがわかります。sinsin(x)関数です。 はこの関数の戻り値です。を表す括弧なしでは関数を作成できないためrandom.normalvariate(1.0, 4.0)、ラムダ関数として定義する必要があります。

于 2013-03-11T09:23:03.677 に答える
7

functools.partialまたは_lambda

それらは基本的に同じです:

[lambda: normalvariate(3, 2), ...]
# or
[partial(normalvariate, 3, 2), ...]

どちらも次と同等です。

def _function():
    return normalvariate(3, 2)

[_function, ...]

partialより柔軟で、作成をより適切に制御_functionでき、ラムダ構文の乱雑さを回避できます。

ところで、Python コミュニティではラムダについていくつかの論争がありましたが、最終的に Guido は、ラムダ式の優れた代替手段を見つけることは「不可能な探求」であると認めました。

于 2013-03-11T09:23:46.797 に答える
5

functoolsのpartialを使用する必要があります。

import functools
arg_sets = [(3.0, 2.0), (1.0, 4.0)]
myfuncs = [functools.partial(random.normalvariate, *args) for args in arg_sets]
myfuncs[0]()
于 2013-03-11T09:33:38.123 に答える