gpt4 book ai didi

python - 为什么将范围对象转换为生成器会产生 `range_iterator` 对象?

转载 作者:行者123 更新时间:2023-11-28 21:04:12 30 4
gpt4 key购买 nike

这不是 Why a range_iterator when a range is reversed? 的副本如果你看一下,你就会知道为什么。

我的问题是关于 range 生成的生成器与任何其他迭代器之间的区别,以及为什么要进行区分:

In [500]: iter(range(5))
Out[500]: <range_iterator at 0x10987f810>

鉴于...

In [506]: (i for i in range(4))
Out[506]: <generator object <genexpr> at 0x10a025fc0>

那么,为什么要进行这种区分,它有什么优点呢?

最佳答案

很简单,range 不是迭代器:

In [32]: r = range(10)

In [33]: next(r)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-33-0b5056469c9c> in <module>()
----> 1 next(r)

TypeError: 'range' object is not an iterator

range 是一个序列类型,和所有其他容器一样,iter 返回一个对应的迭代器对象:

In [34]: iter(list())
Out[34]: <list_iterator at 0x112197cc0>

In [35]: iter(tuple())
Out[35]: <tuple_iterator at 0x112107be0>

In [36]: iter(dict())
Out[36]: <dict_keyiterator at 0x1142eef98>

通常,容器是可迭代对象,而不是迭代器。它们实现了 __iter__,而迭代器实现了 __iter__ __next__

请注意,您标题中的术语有点偏离,坦率地说,我认为您将生成器、迭代器和可迭代对象混为一谈。 iter(obj) 不返回生成器,它返回一个迭代器 对象。生成器是一种允许简洁地编写迭代器的语言结构。生成器函数返回的 generator 对象迭代器:

In [37]: def mygen():
...: yield 1
...: yield 2
...:

In [38]: g = mygen()

In [39]: g
Out[39]: <generator object mygen at 0x1121778e0>

In [40]: next(g)
Out[40]: 1

In [41]: iter(g) is g
Out[41]: True

最后,生成器表达式只是编写生成器的一种更方便的方式!

In [44]: (i for i in range(10) if i % 2 == 0)
Out[44]: <generator object <genexpr> at 0x10de89990>

In [45]: next(_)
Out[45]: 0

关于python - 为什么将范围对象转换为生成器会产生 `range_iterator` 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45605305/

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