如何正确运用Python中的迭代器进行高效编程?

2026-05-17 09:361阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1619个文字,预计阅读时间需要7分钟。

迭代器是可迭代的对象。在本教程中,您将了解迭代器的工作原理,以及如何使用`__iter__`和`__next__`方法构建自己的迭代器。迭代器在Python中无处不在。它们优雅地实现循环,尤其是在循环中。

python迭代器是一种可以遍历的对象,它通过`__iter__`和`__next__`方法工作。`__iter__`方法返回迭代器对象,而`__next__`方法用于获取下一个元素。

class MyIterator: def __init__(self, data): self.data=data self.index=0

def __iter__(self): return self

def __next__(self): if self.index >=len(self.data): raise StopIteration result=self.data[self.index] self.index +=1 return result

使用自定义迭代器my_iter=MyIterator([1, 2, 3, 4, 5])for item in my_iter: print(item)

迭代器是可以迭代的对象。 在本教程中,您将了解迭代器的工作原理,以及如何使用__iter____next__方法构建自己的迭代器。

迭代器在Python中无处不在。 它们优雅地实现在循环,推导,生成器等中,但隐藏在明显的视觉中。

Python中的迭代器只是一个可以迭代的对象。一个将一次返回数据的对象或一个元素。

从技术上讲,Python迭代器对象必须实现两个特殊的方法__iter__()__next__(),统称为迭代器协议。

如果我们从中获取一个迭代器,那么一个对象被称为iterable。 大多数Python中的内置容器是列表,元组,字符串等都是可迭代的。

iter()函数(这又调用__iter__()方法)返回一个迭代器。

通过Python中的迭代器迭代

使用next()函数来手动遍历迭代器的所有项目。当到达结束,没有更多的数据要返回时,它将会引发StopIteration。 以下是一个例子。

# define a list my_list = [4, 7, 0, 3] # get an iterator using iter() my_iter = iter(my_list) ## iterate through it using next() #prints 4 print(next(my_iter)) #prints 7 print(next(my_iter)) ## next(obj) is same as obj.__next__() #prints 0 print(my_iter.__next__()) #prints 3 print(my_iter.__next__()) ## This will raise error, no items left next(my_iter)

更优雅的自动迭代方式是使用for循环。 使用for循环可以迭代任何可以返回迭代器的对象,例如列表,字符串,文件等。

>>> for element in my_list: ... print(element) ... 3 循环如何实际工作?

在上面的例子中看到的,for循环能够自动通过列表迭代。

事实上,for循环可以迭代任何可迭代对象。我们来仔细看一下在Python中是如何实现for循环的。

for element in iterable: # do something with element

实际上它是以类似下面的方式来实现的 -

# create an iterator object from that iterable iter_obj = iter(iterable) # infinite loop while True: try: # get the next item element = next(iter_obj) # do something with element except StopIteration: # if StopIteration is raised, break from loop break

所以在for的内部,for循环通过在可迭代的对象上调用iter()来创建一个迭代器对象iter_obj

有意思的是,这个for循环实际上是一个无限循环。

在循环中,它调用next()来获取下一个元素,并使用该值执行for循环的主体。 在所有对象耗尽后,引发StopIteration异常,内部被捕获从而结束循环。请注意,任何其他类型的异常都将正常通过。

在Python中构建自己的Iterator

构建迭代器在Python中很容易。只需要实现__iter__()__next__()方法。

__iter__()方法返回迭代器对象本身。如果需要,可以执行一些初始化。

__next__()方法必须返回序列中的下一个项目(数据对象)。 在到达结束后,并在随后的调用中它必须引发StopIteration异常。

在这里,我们展示一个例子,在每次迭代中给出下一个2的几次方。 次幂指数从零开始到用户设定的数字。

class PowTwo: """Class to implement an iterator of powers of two""" def __init__(self, max = 0): self.max = max def __iter__(self): self.n = 0 return self def __next__(self): if self.n <= self.max: result = 2 ** self.n self.n += 1 return result else: raise StopIteration

现在可以创建一个迭代器,并通过它迭代如下

>>> a = PowTwo(4) >>> i = iter(a) >>> next(i) >>> next(i) >>> next(i) >>> next(i) >>> next(i) >>> next(i) Traceback (most recent call last): ... StopIteration

也可以使用for循环迭代那些迭代器类。

>>> for i in PowTwo(5): ... print(i) ... 8 Python无限迭代器

迭代器对象中的项目不必都是可耗尽的,可以是无限迭代器(永远不会结束)。 处理这样的迭代器时一定要小心。

下面是用来演示无限迭代器的一个简单的例子。

内置的函数iter()可以用两个参数来调用,其中第一个参数必须是可调用对象(函数),而第二个参数是标头。迭代器调用此函数,直到返回的值等于指定值。

>>> int() >>> inf = iter(int,1) >>> next(inf) >>> next(inf)

  

可以看到,int()函数总是返回0,所以将它作为iter(int,1)传递将返回一个调用int()的迭代器,直到返回值等于1。这从来没有发生,所以这样就得到一个无限迭代器。

我们也可以建立自己的无限迭代器。 以下迭代器理论上将返回所有奇数。

''' 学习中遇到问题没人解答?小编创建了一个Python学习交流群:857662006 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! ''' class InfIter: """Infinite iterator to return all odd numbers""" def __iter__(self): self.num = 1 return self def __next__(self): num = self.num self.num += 2 return num

示例运行如下

>>> a = iter(InfIter()) >>> next(a) >>> next(a) >>> next(a) >>> next(a)

  

当迭代这些类型的无限迭代器时,请注意指定终止条件。

使用迭代器的优点是它们可以节省资源。 如上所示,我们可以获得所有奇数,而不将整个系统存储在内存中。理论上,可以在有限的内存中计算有无限的项目。

本文共计1619个文字,预计阅读时间需要7分钟。

迭代器是可迭代的对象。在本教程中,您将了解迭代器的工作原理,以及如何使用`__iter__`和`__next__`方法构建自己的迭代器。迭代器在Python中无处不在。它们优雅地实现循环,尤其是在循环中。

python迭代器是一种可以遍历的对象,它通过`__iter__`和`__next__`方法工作。`__iter__`方法返回迭代器对象,而`__next__`方法用于获取下一个元素。

class MyIterator: def __init__(self, data): self.data=data self.index=0

def __iter__(self): return self

def __next__(self): if self.index >=len(self.data): raise StopIteration result=self.data[self.index] self.index +=1 return result

使用自定义迭代器my_iter=MyIterator([1, 2, 3, 4, 5])for item in my_iter: print(item)

迭代器是可以迭代的对象。 在本教程中,您将了解迭代器的工作原理,以及如何使用__iter____next__方法构建自己的迭代器。

迭代器在Python中无处不在。 它们优雅地实现在循环,推导,生成器等中,但隐藏在明显的视觉中。

Python中的迭代器只是一个可以迭代的对象。一个将一次返回数据的对象或一个元素。

从技术上讲,Python迭代器对象必须实现两个特殊的方法__iter__()__next__(),统称为迭代器协议。

如果我们从中获取一个迭代器,那么一个对象被称为iterable。 大多数Python中的内置容器是列表,元组,字符串等都是可迭代的。

iter()函数(这又调用__iter__()方法)返回一个迭代器。

通过Python中的迭代器迭代

使用next()函数来手动遍历迭代器的所有项目。当到达结束,没有更多的数据要返回时,它将会引发StopIteration。 以下是一个例子。

# define a list my_list = [4, 7, 0, 3] # get an iterator using iter() my_iter = iter(my_list) ## iterate through it using next() #prints 4 print(next(my_iter)) #prints 7 print(next(my_iter)) ## next(obj) is same as obj.__next__() #prints 0 print(my_iter.__next__()) #prints 3 print(my_iter.__next__()) ## This will raise error, no items left next(my_iter)

更优雅的自动迭代方式是使用for循环。 使用for循环可以迭代任何可以返回迭代器的对象,例如列表,字符串,文件等。

>>> for element in my_list: ... print(element) ... 3 循环如何实际工作?

在上面的例子中看到的,for循环能够自动通过列表迭代。

事实上,for循环可以迭代任何可迭代对象。我们来仔细看一下在Python中是如何实现for循环的。

for element in iterable: # do something with element

实际上它是以类似下面的方式来实现的 -

# create an iterator object from that iterable iter_obj = iter(iterable) # infinite loop while True: try: # get the next item element = next(iter_obj) # do something with element except StopIteration: # if StopIteration is raised, break from loop break

所以在for的内部,for循环通过在可迭代的对象上调用iter()来创建一个迭代器对象iter_obj

有意思的是,这个for循环实际上是一个无限循环。

在循环中,它调用next()来获取下一个元素,并使用该值执行for循环的主体。 在所有对象耗尽后,引发StopIteration异常,内部被捕获从而结束循环。请注意,任何其他类型的异常都将正常通过。

在Python中构建自己的Iterator

构建迭代器在Python中很容易。只需要实现__iter__()__next__()方法。

__iter__()方法返回迭代器对象本身。如果需要,可以执行一些初始化。

__next__()方法必须返回序列中的下一个项目(数据对象)。 在到达结束后,并在随后的调用中它必须引发StopIteration异常。

在这里,我们展示一个例子,在每次迭代中给出下一个2的几次方。 次幂指数从零开始到用户设定的数字。

class PowTwo: """Class to implement an iterator of powers of two""" def __init__(self, max = 0): self.max = max def __iter__(self): self.n = 0 return self def __next__(self): if self.n <= self.max: result = 2 ** self.n self.n += 1 return result else: raise StopIteration

现在可以创建一个迭代器,并通过它迭代如下

>>> a = PowTwo(4) >>> i = iter(a) >>> next(i) >>> next(i) >>> next(i) >>> next(i) >>> next(i) >>> next(i) Traceback (most recent call last): ... StopIteration

也可以使用for循环迭代那些迭代器类。

>>> for i in PowTwo(5): ... print(i) ... 8 Python无限迭代器

迭代器对象中的项目不必都是可耗尽的,可以是无限迭代器(永远不会结束)。 处理这样的迭代器时一定要小心。

下面是用来演示无限迭代器的一个简单的例子。

内置的函数iter()可以用两个参数来调用,其中第一个参数必须是可调用对象(函数),而第二个参数是标头。迭代器调用此函数,直到返回的值等于指定值。

>>> int() >>> inf = iter(int,1) >>> next(inf) >>> next(inf)

  

可以看到,int()函数总是返回0,所以将它作为iter(int,1)传递将返回一个调用int()的迭代器,直到返回值等于1。这从来没有发生,所以这样就得到一个无限迭代器。

我们也可以建立自己的无限迭代器。 以下迭代器理论上将返回所有奇数。

''' 学习中遇到问题没人解答?小编创建了一个Python学习交流群:857662006 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! ''' class InfIter: """Infinite iterator to return all odd numbers""" def __iter__(self): self.num = 1 return self def __next__(self): num = self.num self.num += 2 return num

示例运行如下

>>> a = iter(InfIter()) >>> next(a) >>> next(a) >>> next(a) >>> next(a)

  

当迭代这些类型的无限迭代器时,请注意指定终止条件。

使用迭代器的优点是它们可以节省资源。 如上所示,我们可以获得所有奇数,而不将整个系统存储在内存中。理论上,可以在有限的内存中计算有无限的项目。