3

我正在编写一个程序来计算旋转固体的体积。第一步是计算积分。我正在使用scipy.integrate它,但我无法找出获得方程式的最佳方法(如x=x**2命令行中的输入。我最初计划添加一个参数“相对于:x|y”,然后采用作为 lambda 函数。不幸的是,argparse不会将 lambda 作为参数类型,并且尝试使用字符串构造 lambda ( f = lambda x: args.equation) 只会返回一个字符串(可以理解)。

这是我到目前为止所得到的:

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)

任何建议将不胜感激谢谢

4

2 回答 2

6

如果完全不担心让用户运行任意 Python 代码带来的安全风险,那么您可以使用它eval来创建一个可调用对象:

volume(eval('lambda x: %s' % args.equation), args.a, args.b)
于 2010-12-08T18:11:57.203 回答
2

您应该能够eval()在从参数中获得的字符串上使用:

>>> f = eval("lambda x: x**2")
>>> f(5)
25
于 2010-12-08T18:08:01.200 回答