实例讲解Python 迭代器与生成器


Posted in Python onJuly 08, 2020

迭代器

迭代是Python最强大的功能之一,是访问集合元素的一种方式。

迭代器是一个可以记住遍历的位置的对象。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

迭代器有两个基本的方法:iter() 和 next()。

字符串,列表或元组对象都可用于创建迭代器:

>>> list=[1,2,3,4]
>>> it = iter(list) # 创建迭代器对象
>>> print (next(it)) # 输出迭代器的下一个元素
1
>>> print (next(it))
2
>>>

迭代器对象可以使用常规for语句进行遍历:

#!/usr/bin/python3
 
list=[1,2,3,4]
it = iter(list) # 创建迭代器对象
for x in it:
 print (x, end=" ")

执行以上程序,输出结果如下:

1 2 3 4

也可以使用 next() 函数:

#!/usr/bin/python3
 
import sys   # 引入 sys 模块
 
list=[1,2,3,4]
it = iter(list) # 创建迭代器对象
 
while True:
 try:
  print (next(it))
 except StopIteration:
  sys.exit()

执行以上程序,输出结果如下:

1
2
3
4

创建一个迭代器

把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__() 。

如果你已经了解的面向对象编程,就知道类都有一个构造函数,Python 的构造函数为 __init__(), 它会在对象初始化的时候执行。

__iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。

__next__() 方法(Python 2 里是 next())会返回下一个迭代器对象。

创建一个返回数字的迭代器,初始值为 1,逐步递增 1:

class MyNumbers:
 def __iter__(self):
 self.a = 1
 return self
 
 def __next__(self):
 x = self.a
 self.a += 1
 return x
 
myclass = MyNumbers()
myiter = iter(myclass)
 
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

执行输出结果为:

1
2
3
4
5

StopIteration

StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 __next__() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。

在 20 次迭代后停止执行:

class MyNumbers:
 def __iter__(self):
 self.a = 1
 return self
 
 def __next__(self):
 if self.a <= 20:
  x = self.a
  self.a += 1
  return x
 else:
  raise StopIteration
 
myclass = MyNumbers()
myiter = iter(myclass)
 
for x in myiter:
 print(x)

执行输出结果为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

生成器

在 Python 中,使用了 yield 的函数被称为生成器(generator)。

跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。

调用一个生成器函数,返回的是一个迭代器对象。

以下实例使用 yield 实现斐波那契数列:

#!/usr/bin/python3
 
import sys
 
def fibonacci(n): # 生成器函数 - 斐波那契
 a, b, counter = 0, 1, 0
 while True:
  if (counter > n): 
   return
  yield a
  a, b = b, a + b
  counter += 1
f = fibonacci(10) # f 是一个迭代器,由生成器返回生成
 
while True:
 try:
  print (next(f), end=" ")
 except StopIteration:
  sys.exit()

执行以上程序,输出结果如下:

0 1 1 2 3 5 8 13 21 34 55

以上就是实例讲解Python 迭代器与生成器的详细内容,更多关于Python 迭代器与生成器的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python通过exifread模块获得图片exif信息的方法
Mar 16 Python
详解Python函数可变参数定义及其参数传递方式
Aug 02 Python
Python中循环后使用list.append()数据被覆盖问题的解决
Jul 01 Python
对numpy中向量式三目运算符详解
Oct 31 Python
漂亮的Django Markdown富文本app插件的实现
Jan 02 Python
关于不懂Chromedriver如何配置环境变量问题解决方法
Jun 12 Python
如何通过50行Python代码获取公众号全部文章
Jul 12 Python
pytorch使用指定GPU训练的实例
Aug 19 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
Jan 13 Python
Python集合操作方法详解
Feb 09 Python
Python过滤序列元素的方法
Jul 31 Python
python的列表生成式,生成器和generator对象你了解吗
Mar 16 Python
opencv 阈值分割的具体使用
Jul 08 #Python
如何表示python中的相对路径
Jul 08 #Python
如何卸载python插件
Jul 08 #Python
python中数字是否为可变类型
Jul 08 #Python
如何让python的运行速度得到提升
Jul 08 #Python
opencv 图像加法与图像融合的实现代码
Jul 08 #Python
opencv 图像轮廓的实现示例
Jul 08 #Python
You might like
浅析PHP递归函数返回值使用方法
2013/02/18 PHP
深入理解curl类,可用于模拟get,post和curl下载
2013/06/08 PHP
php自动给网址加上链接的方法
2015/06/02 PHP
php将远程图片保存到本地服务器的实现代码
2015/08/03 PHP
JavaScript中的关键字&quot;VAR&quot;使用详解 分享
2013/07/31 Javascript
js定时器(执行一次、重复执行)
2014/03/07 Javascript
jQuery切换网页皮肤并保存到Cookie示例代码
2014/06/16 Javascript
ECMAScript 5严格模式(Strict Mode)介绍
2015/03/02 Javascript
jQuery中的通配符选择器使用总结
2016/05/30 Javascript
js实现图片淡入淡出切换简易效果
2016/08/22 Javascript
js实现加载更多功能实例
2016/10/27 Javascript
JS动态的把左边列表添加到右边的实现代码(可上下移动)
2016/11/17 Javascript
老生常谈combobox和combotree模糊查询
2017/04/17 Javascript
easyui简介_动力节点Java学院整理
2017/07/14 Javascript
AngularJS创建一个上传照片的指令实例代码
2018/02/24 Javascript
JS处理一些简单计算题
2018/02/24 Javascript
vue使用better-scroll实现下拉刷新、上拉加载
2018/11/23 Javascript
Vue项目安装插件并保存
2019/01/28 Javascript
vue中的mvvm模式讲解
2019/01/31 Javascript
node.js使用net模块创建服务器和客户端示例【基于TCP协议】
2020/02/14 Javascript
vue中keep-alive、activated的探讨和使用详解
2020/07/26 Javascript
python处理cookie详解
2014/02/07 Python
Python 时间操作例子和时间格式化参数小结
2014/04/24 Python
Python多线程、异步+多进程爬虫实现代码
2016/02/17 Python
python机器学习之神经网络(一)
2017/12/20 Python
ubuntu安装sublime3并配置python3环境的方法
2018/03/15 Python
Keras 数据增强ImageDataGenerator多输入多输出实例
2020/07/03 Python
PyQt5-QDateEdit的简单使用操作
2020/07/12 Python
马德里竞技官方网上商店:Atletico Madrid Shop
2019/03/31 全球购物
硕士研究生自我鉴定
2013/11/08 职场文书
园林设计师自荐信
2013/11/18 职场文书
买卖协议书范本
2014/04/21 职场文书
参赛口号
2014/06/16 职场文书
2014院党委领导班子及其成员群众路线对照检查材料思想汇报
2014/10/04 职场文书
2015年防灾减灾工作总结
2015/07/24 职场文书
Java实现聊天机器人完善版
2021/07/04 Java/Android