Domanda

Sto scrivendo un programma per calcolare il volume di un solido di rotazione. Il primo passo di questo consiste nel calcolare un integrale. Sto usando scipy.integrate per questo, ma non riesco a capire il modo migliore per avere un'equazione (come ingresso x=x**2 nella riga di comando Mi è stato originariamente pensando di aggiungere un argomento 'per quanto riguarda: x | y' e poi. prendendo la funzione di lambda. Purtroppo, argparse non prenderà lambda come un tipo di argomento, e cercando di utilizzare una stringa per costruire un lambda (f = lambda x: args.equation) solo restituisce una stringa (comprensibilmente davvero).

Ecco quello che ho finora:

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)

Qualsiasi consiglio sarà apprezzato grazie

È stato utile?

Soluzione

Se non ci sono assolutamente problemi su rischi per la sicurezza dal lasciando in funzione utente arbitrario codice Python , quindi è possibile utilizzare eval per creare un oggetto callable:

volume(eval('lambda x: %s' % args.equation), args.a, args.b)

Altri suggerimenti

Si dovrebbe essere in grado di utilizzare eval() sulla stringa si ottiene dal vostro argomenti:

>>> f = eval("lambda x: x**2")
>>> f(5)
25
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top