Python迭代器

迭代器是可以迭代的对象。 在本教程中,您将了解迭代器的工作原理,以及如何使用__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。这从来没有发生,所以这样就得到一个无限迭代器。

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

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)

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

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

原文来自:http://www.zyiz.net/tutorial/detail-6911.html

(0)

相关推荐

  • 学 Python 怎能不知 yield ?

    简说Python 1周前 以下文章来源于无量测试之道 ,作者无量测试之道  简说Python推荐  来源|无量测试之道 作者|无量测试之道 引言 你可能听说过,带有 yield 的函数在 Python ...

  • Python学习——for循环,生成器,迭代器详解

    文章目录 Python的for循环 for循环示例 List 列表循环 dict 字典循环 列表生成式 生成器 列表式生成器 函数式生成器 生成器式生产者消费者模型 迭代器 什么是迭代器 再论for循 ...

  • Python学习之迭代器和生成器有什么不同?

    迭代器和生成器区别是什么?相信很多人在初学Python的时候对它们都很好奇,接下来我们一起来看看它们的区别吧. 迭代器是一个更抽象的概念,任何对象,如果它的类有next方法和iter方法返回自己的本身 ...

  • 【Python 第75课】可迭代对象和迭代器

    for 循环是我们在 Python 里非常常用的一个语法,但你有没有思考过 for 循环是怎样实现的? 如果你以前接触过 C++,应该会知道类似 for (int i = 0; i < 100; ...

  • 一文掌握 Python 迭代器的原理

    理解迭代器是每个严肃的 Python 使用者学习 Python 道路上的里程碑.本文将从零开始,一步一步带你认识 Python 中基于类的迭代器. 相较于其他编程语言,Python 的语法是优美而清晰 ...

  • Python迭代器与生成器的区别!

    无论你是Python初学者还是爱好者,相信大家都听说过迭代器与生成器,但是很多同学搞不懂Python迭代器与生成器到底是什么?它们之间又有什么样的关系呢?接下来,小编通过这篇文章为大家介绍一下. 什么 ...

  • 弄懂这 5 个问题,拿下 Python 迭代器

    我的施工之路 1.我的施工计划 2.数字专题 3.字符串专题 4.列表专题 5.流程控制专题 6.编程风格专题 7.函数使用 8.面向对象编程(上篇) 9.面向对象编程(下篇) 10.十大数据结构 1 ...

  • 面试题-python 什么是迭代器?

    前言 python 里面有 3 大神器:迭代器,生成器,装饰器.在了解迭代器之前,需弄清楚2个概念: 1.什么是迭代 2.什么是可迭代对象 迭代 如果给定一个list或tuple,我们可以通过for循 ...

  • python 生成器 & 迭代器

    在聊生成器之前,我们先看看什么是生成式? a = [i*2 for i in range(10) ]    类似于这样的就是生成式 而把列表 " [ ] " 符号换成 " ...

  • 第18天:Python 之迭代器

    第18天:Python 之迭代器

  • Python生成器和迭代器有什么用?

    当我们学习Python的时候,会遇到很多专业的术语及工具,而对于这些很多人并不是很了解,比如说生成器和迭代器,Python的生成器和迭代器有什么区别?这是很多人都比较疑惑的问题,我们来看看吧. 迭代器 ...

  • 一文读懂Python可迭代对象、迭代器和生成器

    IT头条 每日推送最新.最热点的IT界新闻 马化腾回应"腾讯没有梦想"截图系网友PS:天天P图回应<我的前世青年照>涉嫌收集个人隐私:马云称阿里不愿招北大清华毕业生-- ...