Wie eine Funktion als Argument nehmen? (Python)
Frage
Ich schreibe ein Programm das Volumen eines festen Dreh zu berechnen. Der erste Schritt dieses ist ein integraler zu berechnen. Ich verwende scipy.integrate
für diese, aber ich kann nicht den besten Weg, herauszufinden, eine Gleichung zu haben (wie x=x**2
Eingabe in der Befehlszeile ich ursprünglich über das Hinzufügen von einem Argumente wurde Planung ‚in Bezug auf: x | y‘ und dann. die Funktion als Lambda nehmen. Leider argparse
nicht Lambda als Argument Typen nehmen, und versucht, eine Zeichenfolge zu verwenden, um einen Lambda (f = lambda x: args.equation
) nur gibt eine Zeichenfolge (verständlicherweise wirklich).
Hier ist, was ich bisher habe:
import sys
import argparse
import math
from scipy import integrate
parser = argparse.ArgumentParser(description='Find the volume of the solid of rotation defined')
parser.add_argument('equation', help='continous function')
parser.add_argument('a', type=float, help='bound \'a\'')
parser.add_argument('b', type=float, help='bound \'b\'')
parser.add_argument('-axis', metavar='x|y', help='axis of revolution')
args = parser.parse_args()
def volume(func, a, b, axis=None):
integral = integrate.quad(func, a, b)
return scipy.py * integral
print volume(args.equation, args.a, args.b)
Jede Beratung sei darauf hingewiesen, Dank
Lösung
Wenn es absolut keine Bedenken hinsichtlich der Sicherheit von Risiken der Benutzer laufen beliebige Python-Code lassen , dann können Sie eval
verwenden ein aufrufbare Objekt zu erstellen:
volume(eval('lambda x: %s' % args.equation), args.a, args.b)
Andere Tipps
Es soll möglich sein, eval()
auf der Saite Sie bekommen Argumente:
>>> f = eval("lambda x: x**2")
>>> f(5)
25