如何在for循环中定义函数?

时间:2013-09-20 11:17:31

标签: python list function loops for-loop

我正在尝试定义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

有任何帮助吗? 谢谢!

5 个答案:

答案 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,并直接乘法。