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

2024-09-27 00:19:59 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我想为大约26个不同的r值重复定义,范围从3.8到3.85(我希望最终为这些函数绘制蛛网图并进行比较,我不想把r作为函数的参数)。所以我想把这26个函数存储在一个列表中,以后再访问它们。我有下面的代码,但是没有存储不同的函数定义,它只在列表中的所有26个位置存储第一个值r=3.8的函数。在

^{pr2}$

因此,这些打印语句的输出是:

[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?中的所有建议,但还是无法使其发挥作用。有什么想法吗?我真的很感激。在


Tags: lambda函数代码功能列表参数定义绘制
3条回答

I don't want to have r as a parameter to my function

为什么不呢?在

it only stores the function with the first value of r=3.8 in all 26 spots in the list.

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

你要做的是定义你的lambda如下:

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

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

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

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

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

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

^{pr2}$

展示行为的小例子:

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

相关问题 更多 >

    热门问题