繁体   English   中英

iter() 如何将列表转换为迭代器对象?

[英]How does iter() convert the list into the iterator object?

我知道iter()函数将list (或另一个集合)转换为迭代器对象。 但我不能完全理解迭代器对象是什么。

我读到它是无序数据,其中的每个元素(在调用__next__() )分配给局部变量。但是计算机如何知道迭代器的哪个元素将是下一个?

迭代器对象将这些信息存储在其字段中。 像这样(我们假设我们的数组使用正常索引):

class IteratorObject:
    def __init__(self, iterated_array) :
        self.iterated = iterated_array 
        self.current_index = 0 # starting index is 0

    def __iter__(self) :
        return self # there isnt reason to create new iterator object - we will return existing one

    def __next__(self) :
        #if current_index is bigger that length of our array, we will stop iteration
        if self.current_index >= len(self.iterated):
            raise StopIteration() #this is exception used for stopping iteration
   
        old_index = self.current_index
        self.current_index += 1

        return self.iterated[old_index

您可以看到迭代器对象具有存储当前索引( current_index )的内部字段。 如果这个索引大于迭代数组的长度,我们将结束迭代(使用 StopIteration 异常)。

你可以以任何你想要的方式实现迭代器。 就像您可以拥有从数组末尾迭代到数组开头的迭代器一样-您只需要从最后一个索引开始并以 0 索引结束。

Tl; dr:迭代器是对象,就像每个对象一样,它有字段。 并且迭代器使用这些字段来存储有关迭代的信息

迭代器(带有__iter__方法的对象)可以在 iter() 中使用。 有两种方法可以迭代。

  1. iter返回一个迭代器。 当 iter() 被调用时,它返回一个已经 iterd 的列表(当你 iter() 一个列表时)这将一直持续,直到迭代的对象是一个内置对象,实际上可以使它成为自己的迭代器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM