我正在尝试定义3个未知变量(k,m,c)的函数,但是假设由于每次频率f不同,我必须将其定义100次。我可以在python中的for循环中执行此操作并将所有函数存储在列表中以便以后可以调用吗?
这是我到目前为止所拥有的
index = -1
f_t = []
for f in inputs[:,0]:
index = index +1
def F_analytic(k, m, c):
F_t = k*m*c*f
return F_t
f_t.append([])
f_t[index].append(F_analytic)
但我得到的是一个不可调用的函数列表:
Out[58]:
[[<function __main__.F_analytic>],
[<function __main__.F_analytic>],
[<function __main__.F_analytic>],
[<function __main__.F_analytic>],
[<function __main__.F_analytic>],
...
...
[<function __main__.F_analytic>],
[<function __main__.F_analytic>],
[<function __main__.F_analytic>]]
,错误是:
TypeError: 'list' object is not callable
有任何帮助吗? 谢谢!
答案 0 :(得分:1)
不,你拥有的是一系列功能列表,每个内部列表都有1个功能。
替换
f_t.append([])
f_t[index].append(F_analytic)
与
f_t.append(F_analytic)
(虽然老实说,这整个方法看起来很可疑;你不希望一个函数有4个参数而不是100个用3个吗?)
答案 1 :(得分:1)
①虽然你只想要一个平面列表(功能),但你是嵌套列表。请参阅@BartoszKP的答案。
②您想要根据局部变量创建函数。您可以使用lambdas执行此操作,正如@Harsh所提议的那样,或者您可以使用默认变量来执行此操作:
def F_analytic(k, m, c, f=f): # notice the f=f here!
F_t = k*m*c*f
return F_t
③您应该考虑是否确实有一个函数列表(正如@Wooble已经指出的那样)。
答案 2 :(得分:0)
这是因为您正在创建列表列表,您可以像这样调用每个函数对象:
f_t[0][0](1,2,3)
或者,只需创建一个功能列表:
f_t = []
for f in inputs[:,0]:
index = index +1
def F_analytic(k, m, c):
F_t = k*m*c*f
return F_t
f_t.append(F_analytic)
正如其他答案和评论所指出的,这一切似乎都是一种相当奇怪的方法。你真的需要这样做吗? :)
答案 3 :(得分:0)
抱歉,我不认为我正确回答了问题,请尝试这种方法:
f_t = []
for f in input[:,0]:
f_t.append(lambda k, m, c: k*m*c*f)
您可以通过以下方式轻松调用这些功能: 我想说你想打电话给第一个:
f_t[0](k,m,c)
其中k,m,c是你的变量
答案 4 :(得分:0)
让我们清理这段代码:
#instead of an index counter, python provide `enumerate`
# so that you can have the counter as part of your loop
#index = -1
f_t = []
for index, f in enumerate(inputs[:,0]):
# index = index +1
def F_analytic(k, m, c):
#these two lines are redundant. You're just returning an expression
# so this whole function can be a lambda
F_t = k*m*c*f
return F_t
#why are you creating an inner list for each index position,
# and then appending the function to it?
#even if you wanted to have the inner list, you could do it in one step
f_t.append([])
f_t[index].append(F_analytic)
如果我们进行了指定的更改,我们最终会:
f_t = [(lambda k, m, c: k*m*c*f) for f in inputs[:,0]]
当然,更简单的方法是简单地计算产品的输入,包括f
,并直接乘法。