gpt4 book ai didi

python - 为什么 map over 一个 iterable 会返回一个 one-shot iterable?

转载 作者:行者123 更新时间:2023-11-28 22:29:17 26 4
gpt4 key购买 nike

为什么 map 在调用一个可以迭代多次的对象时不返回一个也可以迭代多次的对象?我认为后者更为合理。

我的用例是我有很多数据,因此只能对其进行迭代。 map(理论上)非常适合对data 进行操作,因为它是惰性的。但是在下面的示例中,我希望长度两次相同。

iterable = [1,2,3,4]  # this can be iterated repeatedly
m = map(lambda x:x**2, iterable) # this again should be iterable repeatedly
print(len(list(m))) # 4
print(len(list(m))) # 0

如何映射可迭代结构并返回可迭代结构?

编辑:这是恕我直言应该如何工作的示例,展示了惰性评估:

def g(): 
print('g() called')

data = [g, g]

# map is lazy, so nothing is called
m = map(lambda g: g(), data)
print('m: %s' % len(list(m))) # g() is called here
print('m: %s' % len(list(m))) # this should work, but doesnt

# this imap returns an iterable
class imap(object):
def __init__(self, fnc, iterable):
self.fnc = fnc
self.iterable = iterable
def __iter__(self):
return map(self.fnc, self.iterable)

# imap is lazy, so nothing is called
im = imap(lambda g: g(), data)
print('im: %s' % len(list(im))) # g() is called here
print('im: %s' % len(list(im))) # works as expected

最佳答案

Why does map when called with an object which can be iterated over multiple times not return an object which can also be iterated multiple times?

因为没有接口(interface)可以告诉一个对象是否可以重复迭代。 map 无法判断它迭代的对象是否支持重复迭代,除非 map 设法以某种方式确定此信息并发明一个 API 将其公开给用户, map 用户无法判断他们的 map 对象是否支持重复迭代。

此外,重复迭代需要重复函数求值或缓存结果(但如果您要缓存结果,为什么要重新设计 map 以返回迭代器? ).重复的功能评估效率低下,有潜在危险,而且通常不是用户想要的。最好让用户明确地重复 map 调用,或者如果他们想再次迭代则明确地调用 list

如果 map 对象始终只是迭代器,那就更简单了。

关于python - 为什么 map over 一个 iterable 会返回一个 one-shot iterable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43134157/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com