gpt4 book ai didi

python - iter() 对列表做了什么?

转载 作者:行者123 更新时间:2023-11-28 20:01:43 27 4
gpt4 key购买 nike

我有这个代码:

a = ['animal', 'dog', 'car', 'bmw', 'color', 'blue']
a_iter = iter(a)

print(a)
print(a_iter)

print(dict(zip(a,a)))
print(dict(zip(a_iter,a_iter)))

输出为:

['animal', 'dog', 'car', 'bmw', 'color', 'blue']
<list_iterator object at 0x7f2d98b756d8>
{'dog': 'dog', 'car': 'car', 'animal': 'animal', 'color': 'color', 'blue': 'blue', 'bmw': 'bmw'}
{'car': 'bmw', 'color': 'blue', 'animal': 'dog'}

我不明白,为什么 zip 与 a_itera 的工作方式不同。 iter()有什么作用,list是可迭代的,那为什么要用iter()呢?有人可以用一些很好的例子向我解释吗?我用谷歌搜索了它,但我还是不明白。

最佳答案

iter()对列表不做任何事情; list对象有一个 __iter__ iter() 的方法用于生成迭代器对象。该对象具有对原始列表和索引的引用;每次您在迭代器中请求下一个值时,都会检索并返回当前索引处的值,并且索引会递增。

您可以使用 next()从迭代器中获取下一个值的函数:

>>> a = ['animal', 'dog', 'car', 'bmw', 'color', 'blue']
>>> a_iter = iter(a)
>>> next(a_iter) # get the next value
'animal'
>>> next(a_iter) # get the next value
'dog'

注意如何调用next()再次给你一个新的值(value)。您可以这样做,直到迭代器完成:

>>> three_more = next(a_iter), next(a_iter), next(a_iter)
>>> next(a_iter) # last one
'blue'
>>> next(a_iter) # nothing left
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration

列表迭代器对象保留原始列表对象;更改列表对象将反射(reflect)在 next() 上生成的迭代器值中:

>>> b = ['foo', 'bar']
>>> b_iter = iter(b)
>>> next(b_iter)
'foo'
>>> b[1] = 'spam'
>>> b
['foo', 'spam']
>>> next(b_iter)
'spam'

zip()在它的每个参数中询问下一个值,这些参数被假定为 iterableszip()电话 iter()在他们身上。对于迭代器对象,例如 a_iter , iter(a_iter)返回迭代器本身(毕竟它已经是一个迭代器):

>>> iter(a_iter)
<list_iterator object at 0x10e7b6a20>
>>> iter(a_iter) is a_iter
True

a_iter将从原始列表中按顺序产生值,这意味着您在字典中获得配对元素,因为 zip() 对同一个对象有两个引用;你有效地创造了(next(a_iter), next(a_iter))作为 zip() 的迭代器步长值.如果您传入对 a 的两个引用,另一方面,zip()会调用iter() 两次,创建两个独立的迭代器对象,每个都有自己的索引要跟踪。

让我们详细看一下。注意 zip() 产生一个迭代器对象,所以我们可以验证调用next()zip()反过来导致a_iter向前走两次:

>>> a_iter = iter(a)
>>> a_iter_zip = zip(a_iter, a_iter)
>>> a_iter_zip # a zip object is an iterator too
<zip object at 0x10e7ba8c8>
>>> next(a_iter_zip) # get next value of a_iter, together with the next value of a_iter
('animal', 'dog')
>>> next(a_iter) # the a-list iterator was advanced, so now we get 'car'
'car'
>>> next(a_iter_zip) # now a_iter is at bmw, so we get bmw and color
('bmw', 'color')

迭代器是独立的对象,它们各自有自己的索引:

>>> a_iter1 = iter(a)
>>> a_iter2 = iter(a) # different iterator from a_iter1
>>> next(a_iter1), next(a_iter1) # what zip() does
('animal', 'dog')
>>> next(a_iter2), next(a_iter2) # iter2 is independent
('animal', 'dog')

所以当你使用 zip(a, a) ,真正发生的是 zip()电话 iter(a)两次,创建两个新的迭代器,并且都用于创建输出:

>>> a_iter1 = iter(a)
>>> a_iter2 = iter(a)
>>> a_iter_1_and_2_zip = zip(a_iter1, a_iter2)
>>> next(a_iter_1_and_2_zip) # values from a_iter1 and a_iter2
('animal', 'animal')
>>> next(a_iter_1_and_2_zip) # moving in lockstep
('dog', 'dog')
>>> next(a_iter1) # moving one of these two one step along, to 'car'
'car'
>>> next(a_iter_1_and_2_zip) # so a_iter1 is one step ahead!
('bmw', 'car')
>>> next(a_iter1) # another extra step
'color'
>>> next(a_iter_1_and_2_zip) # so a_iter1 is two steps ahead!
('blue', 'bmw')

关于python - iter() 对列表做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50132627/

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