2016-07-30 15 views
-3

Ich versuche, eine Funktion "a21" erstellen, die einen Parameter x und fügt 4 zu ihm.Definieren Sie eine Funktion mit String-Variable

eq = 'x+4' 
b=21 
new='a'+str(b)+'(x)' 
def eval(new): 
    return eval(eq) 

c=5 
print(a21(c)) 

Der gewünschte Ausgang ist 9, erkennt aber a21 nicht als Funktion. Wie schreibe ich dies, um die Funktion a21 zu erstellen, die auch einen Parameter x annimmt?

+1

'def eval (neu): return eval (eq)' führt zu unendlicher Rekursion – ForceBru

+5

'eval' kann gefährlich sein und sollte generell nur als letzter Ausweg verwendet werden, wenn es keine anderen Optionen gibt. [Was versuchst du _really_?] (Http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) –

+0

Sieht so aus, als würdest du generell nach etwas wie SymPy fragen –

Antwort

2

Schreibe eine voll funktionsfähige Funktionsdefinition:

new = ''' 
def a21(x): 
    return x + 4 
''' 

Und dann exec ute es: exec(new) und laufen: a21(678).

Wenn Sie während der Laufzeit eine Funktion erstellen möchten, verwenden Sie die Zeichenfolgenformatierung.

new = ''' 
def {}({}): 
    return {} 
''' 

exec(new.format('test', 'x', 'x+4')) 

test(123) 
+0

Du brauchst ' exec' eine Anweisung wie 'def' auszuführen; 'eval' wertet nur Ausdrücke aus. – chepner

+0

@chepner, yeah, du hast recht, ich werde meine Antwort bearbeiten – ForceBru

0

Die folgende möglich und macht fast die gleiche Sache: Sie können die Funktion in einer Funktion binden wie unten.

b=21 
new='a'+str(b) #your function name 
c=5 
print(bindfunc(new)(c)) 

Was die letzte Zeile tut, ist, dass es erste bindfunc läuft, die gibt eine Funktion mit dem angegebenen Namen:

eq = 'x+4' 
def bindfunc(name): 
    def dynamicfunc(x): 
    return eval(eq) 
    dynamicfunc.__name__ = name 
    return dynamicfunc 

Die Art und Weise dies ein wenig anders wäre verwenden würde. Es führt dann diese Funktion mit dem Eingang c nach Bedarf aus und druckt die Ausgabe.

Hoffe, das hilft!

Verwandte Themen