2013-03-11 12 views
8

Python ist so flexibel, dass ich Funktionen als Elemente von Listen oder Argumenten anderer Funktionen verwenden kann. Zum Beispiel:Wie übergibt man eine zufällige Funktion als Argument?

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

oder

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

Allerdings ist es mir nicht klar, wie das gleiche mit Zufallsfunktionen zu tun. Zum Beispiel möchte ich Gaußsche Verteilungen verwenden: [random.normalvariate(3.0, 2.0), random.normalvariate(1.0, 4.0)]. In diesem Beispiel erhalte ich eine feste Liste mit zwei Elementen. Aber was ich bekommen möchte, ist eine Liste mit zufälligen Elementen. Was ist ein guter Weg, es in Python zu tun?

+0

nicht richtig verstehen konnte, Suchen Sie nach einer variablen Anzahl von Argumenten? http://docs.python.org/2/tutorial/controlflow.html#arbitrary-argument-lists – Pheonix

Antwort

8

Versuchen Sie es mit lambda Funktionen:

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

Sie den Unterschied mit Klammern zu sehen. sin ist eine Funktion, sin(x) ist der Rückgabewert dieser Funktion. Da Sie keine Funktion ohne die Klammern random.normalvariate(1.0, 4.0) erstellen können, müssen Sie sie als Lambda-Funktion definieren.

7

Verwenden functools.partial oder lambda

Das sind im Grunde das gleiche:

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

Sie sind beide gleichwertig:

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

[_function, ...] 

partial ist flexibler, gibt Ihnen eine viel bessere Kontrolle über die Schöpfung von _function und lässt Sie Lambda Syntax Clutter vermeiden.

By the way, gab es einige controversions über Lambda in der Gemeinde Python, aber am Ende gab Guido dass finding a superior alternative to the lambda expression is "an impossible quest."

5

Sie aus functools Teil verwenden sollten:

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]() 
Verwandte Themen