如何在Python中定义循环中的函数

时间:2014-11-20 19:14:59

标签: python lambda

如果有人可以帮我解决这个问题(在Python中),我会很感激。我有功能

f(x) = r*x*(1-x)

并且我想重复定义它的大约26个不同的r值,范围从3.8到3.85(我想最终绘制这些函数的蜘蛛网图并比较它们,我不想将r作为我的函数的参数)。所以我想将这26个函数存储在一个列表中,然后再访问它们。我有以下代码,但它不存储不同的函数定义,而是仅存储列表中所有26个点中具有第一个值r = 3.8的函数。

r_list = []
r = 3.8
r_list.append(r)
for n in range(25):
    new_r = round(r + 0.002, 3)
    r_list.append(new_r)
    r = new_r

f_t = []
for r in r_list:
   f_t.append(lambda x: r*x*(1-x))

print r_list
print f_t
print f_t[0](3)
print f_t[2](3)

所以这些打印语句的输出是:

[3.8, 3.802, 3.804, 3.806, 3.808, 3.81, 3.812, 3.814, 3.816, 3.818, 3.82, 3.822, 3.824, 3.826, 3.828, 3.83, 3.832, 3.834, 3.836, 3.838, 3.84, 3.842, 3.844, 3.846, 3.848, 3.85]

[<function <lambda> at 0x0000000008739908>, <function <lambda> at 0x0000000008739978>, <function <lambda> at 0x00000000087399E8>, <function <lambda> at 0x0000000008739A58>, <function <lambda> at 0x0000000008739AC8>, <function <lambda> at 0x0000000008739B38>, <function <lambda> at 0x0000000008739BA8>, <function <lambda> at 0x0000000008739C18>, <function <lambda> at 0x0000000008739C88>, <function <lambda> at 0x0000000008739CF8>, <function <lambda> at 0x0000000008739D68>, <function <lambda> at 0x0000000008739DD8>, <function <lambda> at 0x0000000008739E48>, <function <lambda> at 0x0000000008739EB8>, <function <lambda> at 0x0000000008739F28>, <function <lambda> at 0x0000000008739F98>, <function <lambda> at 0x0000000008739828>, <function <lambda> at 0x000000000873D048>, <function <lambda> at 0x000000000873D0B8>, <function <lambda> at 0x000000000873D198>, <function <lambda> at 0x000000000873D208>, <function <lambda> at 0x000000000873D278>, <function <lambda> at 0x000000000873D2E8>, <function <lambda> at 0x000000000873D358>, <function <lambda> at 0x000000000873D128>, <function <lambda> at 0x00000000165452E8>]

-23.1
-23.1

我尝试了How can I define functions in a for loop?的所有建议,但我仍然无法让它发挥作用。有任何想法吗?我真的很感激。

3 个答案:

答案 0 :(得分:1)

for r in r_list:
   f_t.append(lambda x: r*x*(1-x))

Lambda没有抓住价值,他们捕捉变量。这里r在所有lambda中都是相同的,它的值是循环中的最后一个值。

您可以通过手动捕获值来修复它:

   f_t.append(lambda x,r=r: r*x*(1-x))

证明行为的小例子:

l=[1, 2, 3]
l2=[]
for r in l:
   l2.append(lambda: r)
l2[0]()   # 3

l2=[]
for r in l:
   l2.append(lambda r=r: r)
l2[0]()   # 1

答案 1 :(得分:1)

lambda函数中的r是外部上下文的r,因此它具有当时的值,该函数被调用。为避免这种情况,请将r

本地化
f_t.append(lambda x, r=r: r*x*(1-x))

答案 2 :(得分:0)

  

我不希望r作为我的功能的参数

为什么不呢?

  

它只存储列表中所有26个点中第一个值r = 3.8的函数。

听起来不对。它应该做的是捕获变量r,它应该具有r不时具有的值。

你想要做的是像这样定义你的lambda:

for r in r_list:
   f_t.append(lambda x, r=r: r*x*(1-x))

这样,lambda的本地r被赋予外部r在定义时所具有的值。