首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在Python循环中定义函数

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

Stack Overflow用户
提问于 2014-11-20 19:14:59
回答 3查看 913关注 0票数 0

如果有人能帮我解决这个问题(用Python),我将不胜感激。我有这个功能

代码语言:javascript
代码运行次数:0
运行
复制
f(x) = r*x*(1-x)

我想对大约26个不同的r值反复定义它,范围从3.8到3.85 (我最终想为这些函数绘制cobweb图并比较它们,我不想把r作为函数的参数)。因此,我想将这26个函数存储在一个列表中,然后访问它们。我有下面的代码,但是它不是存储不同的函数定义,而是只在列表中的26个位置存储带有r=3.8的第一个值的函数。

代码语言:javascript
代码运行次数:0
运行
复制
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)

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

代码语言:javascript
代码运行次数:0
运行
复制
[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?的所有建议,但我仍然无法让它发挥作用。有什么想法吗?我会很感激的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-20 19:21:41

代码语言:javascript
代码运行次数:0
运行
复制
for r in r_list:
   f_t.append(lambda x: r*x*(1-x))

Lambdas不捕获值,而是捕获变量。在这里,r在所有lambda中是相同的,它的值是它在循环中接受的最后一个值。

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

代码语言:javascript
代码运行次数:0
运行
复制
   f_t.append(lambda x,r=r: r*x*(1-x))

证明这种行为的小例子:

代码语言:javascript
代码运行次数:0
运行
复制
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
票数 3
EN

Stack Overflow用户

发布于 2014-11-20 19:22:49

lambda函数中的r是外部上下文的r,因此它在时间上有值,函数被调用。要避免这种情况,请本地化r

代码语言:javascript
代码运行次数:0
运行
复制
f_t.append(lambda x, r=r: r*x*(1-x))
票数 1
EN

Stack Overflow用户

发布于 2014-11-20 19:23:08

我不想让r作为函数的参数

为什么不行?

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

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

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

代码语言:javascript
代码运行次数:0
运行
复制
for r in r_list:
   f_t.append(lambda x, r=r: r*x*(1-x))

这样,lambda的本地r被分配给外部r在定义时的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27047673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档