如何将函数作为参数?(Python)

3 投票
2 回答
890 浏览
提问于 2025-04-16 08:15

我正在写一个程序,用来计算旋转体的体积。这个过程的第一步是计算一个积分。为此,我使用了 scipy.integrate 这个库,但我不知道怎么才能在命令行输入一个方程式(比如 x=x**2)。我最开始打算添加一个参数 'with respect to: 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)

任何建议都非常感谢!

2 个回答

2

你可以使用 eval() 这个函数来处理你从参数中得到的字符串:

>>> f = eval("lambda x: x**2")
>>> f(5)
25
6

如果完全没有任何关于让用户运行任意Python代码的安全风险,那么你可以使用 eval 来创建一个可以调用的对象:

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

撰写回答