【问题标题】:Don't understand why Map returns iterator makes code to fail不明白为什么 Map 返回迭代器会导致代码失败
【发布时间】:2022-01-24 01:21:14
【问题描述】:

我有一些代码:

map(lambda increment:
                 self.__delete_table_id_range(table, delete_field, value,
                                              delete_interval, increment),
                 range(delete_interval.min, delete_interval.max, self.purge_range))

python 2 中它可以正常工作,但在python 3 中我调试过并且从未调用过__delete_table_id_range 函数。

我知道map 现在返回iterator,所以我将map 更改为list

list(map(lambda increment:
                     self.__delete_table_id_range(table, delete_field, value,
                                                  delete_interval, increment),
                     range(delete_interval.min, delete_interval.max, self.purge_range)))

只有添加这个__delete_table_id_range 函数才会运行。

我不明白为什么会这样。谁能解释一下?

【问题讨论】:

  • 地图迭代器(以及python中的其他迭代器)就是所谓的lazy
  • 因为如果你不迭代迭代器,函数永远不会被调用。
  • 您误用了map。考虑改用 for 循环。
  • 更重要的是,您不应该使用map 来获得副作用开始。这应该只是一个for循环
  • map 在 Python 2 中是一个返回列表的函数。在 Python 3 中,它是一个实现迭代器协议的 type

标签: python python-3.x iterator python-2.x


【解决方案1】:

map 方法返回一个迭代器,您可以使用经典 for 进行迭代

my_list = [1, 2, 3]
result = map(lambda index: my_list[index] * 2, range(0, len(my_list), 1))
for index, element in enumerate(result):
    print(f"Element[{index}]: {element}")

你可以这样做,但我不推荐你

result = map(lambda increment: self.__delete_table_id_range(table, delete_field, value, delete_interval, increment), range(delete_interval.min, delete_interval.max, self.purge_range))
for element in result:
    pass

在你的情况下,我认为它是一个更好的经典

for index in range(delete_interval.min, delete_interval.max, self.purge_range):
    self.__delete_table_id_range(table, delete_field, value, delete_interval, increment)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 2020-02-14
    • 1970-01-01
    相关资源
    最近更新 更多