For 循环中迭代 function() 的迭代器的解释? ---以及示例中使用的 lambda 函数

问题描述

这来自于描述 Python 中常见“陷阱”的 article。我的问题不是关于他所描述的问题,或者为什么下面的代码没有按照您的预期执行——它比这更基本。

我不明白函数上的迭代器在做什么:代码如下;

一个函数

def create_multiplers():
    return [lambda x: i*x for i in range(5)]

然后,有一个循环遍历函数

for multiplier in create_multipliers():
print(multiplier(2))
  1. for 循环“用文字”做什么?迭代函数 create_mutipliers 是什么意思?这如何告诉它循环多少次?

我认为它调用了 create_multipliers 一次,该函数返回 lambda 函数。是迭代 5 次的 lambda 函数循环——对吗?

  1. multiplier(2) 如何将值传递给 lambda 函数中的 x——mutlipiers(2) 是如何导致 lambda 2: i*2 for i in range(5) 的?

for 循环迭代一个函数和返回的 lambda 函数功能的组合真的让我感到困惑。这里有一些隐含的东西我只是不明白(我是一个中级 Python 用户)。我希望能“用文字”描述代码的执行。

解决方法

for 循环不是迭代函数,而是迭代 lambda 返回的 create_multipliers 函数列表。棘手的部分是 create_multipliers 中的 return 语句实际上是创建 (5) lambda 表达式列表的列表推导式。您可以通过单独查看此示例代码来了解这一点:

print([lambda x: i*x for i in range(5)])

输出:

[<function <listcomp>.<lambda> at 0x0E9F0198>,<function <listcomp>.<lambda> at 0x0E9F0150>,<function <listcomp>.<lambda> at 0x0E9F0108>,<function <listcomp>.<lambda> at 0x0E9F04F8>,<function <listcomp>.<lambda> at 0x0E9F0540>]

lambda 函数采用单个参数 x,每次通过 for 循环都会调用 lambda 函数列表中的 lambda 函数由 create_multipliers 返回并将 2 的值作为 x 传入。