当前位置: 首页 > 面试题库 >

Python3中map的非惰性评估版?

扶隐水
2023-03-14
问题内容

我正在尝试map在Python3中使用。这是我正在使用的一些代码:

import csv

data = [
    [1],
    [2],
    [3]
]

with open("output.csv", "w") as f:
    writer = csv.writer(f)
    map(writer.writerow, data)

但是,由于map在Python3中返回了迭代器,因此该代码在Python3中不起作用(但在Python2中可以正常工作,因为该版本的mapalways返回a
list

我当前的解决方案是list在迭代器上添加一个函数调用以强制求值。但这似乎很奇怪(我不在乎返回值,为什么要将迭代器转换为列表?)

有更好的解决方案吗?


问题答案:

map当您对返回的值不感兴趣时​​,使用它的副作用(例如,函数调用)即使在Python2.x中也不可取。如果函数返回None,但重复一百万次-
您将构建一百万个列表,None只是将其丢弃。正确的方法是使用for循环并调用:

for row in data:
    writer.writerow(row)

或者在csv模块允许的情况下,使用:

writer.writerows(data)

如果出于某些原因您 确实想要 使用map,则可以使用consumeitertools中的配方并生成零长度的双端队列,例如:

from collections import deque
deque(map(writer.writerow, data), maxlen=0)


 类似资料:
  • 问题内容: 什么是Python中的惰性评估? 一个网站说: 在Python 3.x中,该函数返回一个特殊的范围对象,该对象按需计算列表元素(延迟或延迟评估): 这是什么意思? 问题答案: 由(或在Python2.x中)返回的对象被称为惰性迭代。 生成器没有将整个范围存储在内存中,而是存储的定义并仅在需要时才计算下一个值(又称惰性求值)。 本质上,生成器允许您返回类似于结构的列表,但是这里有一些区别

  • 问题内容: 我知道Java在这种情况下具有智能/惰性评估: 但是关于: 即使返回true 也被调用? 问题答案: 在Java(和其他类似C的语言)中,这称为 短路评估 。* 是的,在第二个示例中总是被调用。也就是说,除非编译器/ JVM可以确定它没有可观察到的副作用,否则在这种情况下它可以选择进行优化,但是无论如何您都不会注意到它们之间的差异。 两者截然不同; 前者本质上是一种优化技术,而第二种则

  • 问题内容: 我最近读到了Python 3的一个好处是它很懒。那就更好了 而不是 我很好奇的是如何使用这种懒惰。如果生成映射对象,例如,如何访问生成的操作/列表中的特定元素。在我所见过的几乎所有文档中,他们都会做类似或的事情(据我所知),它放弃了惰性概念,因为它隐式将地图转换为列表。 我想我正在寻找的是能够以与我可以懒惰地懒惰地生成地图对象类似的方式使用地图对象的能力,并且可以在没有巨大计算量的情况

  • 我正在写一篇关于Java流API的文章。我已经阅读了Stream的整个软件包文档,并在这里查看了类似的问题。 如果我说:“直到终端操作被命中,才会评估流上的中间操作,这将实际执行它们,”我是否正确?我在StackOverflow上看到了混合答案,而且每个中间操作都返回一个Stream,所以我想知道它是否只是返回自己,然后只是跟踪要执行的中间操作。这就是“懒惰评估/执行”的意思吗? 下面的javad

  • 我正在阅读HadleyWickhams关于Github的书,特别是关于懒惰评估的这一部分。在那里,他给出了一个懒惰求值结果的例子,在函数的添加部分。让我引用这一点: 这个[惰性评估]在使用lApplication或循环创建闭包时很重要: x在您第一次调用其中一个加法器函数时被延迟计算。此时,循环完成,x的最终值为10。因此,所有加法器函数都会在其输入中添加10,可能不是您想要的!手动强制评估解决了

  • 下面的备选案文1或备选案文2是否正确(例如,其中一个优于另一个),或者它们是否等同? 备选案文1 或 备选案文2