实例讲解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中的jquery PyQuery库使用小结
May 13 Python
python绘图库Matplotlib的安装
Jul 03 Python
python遍历 truple list dictionary的几种方法总结
Sep 11 Python
将tensorflow的ckpt模型存储为npy的实例
Jul 09 Python
Python图像处理之颜色的定义与使用分析
Jan 03 Python
Python通过TensorFlow卷积神经网络实现猫狗识别
Mar 14 Python
解决安装python3.7.4报错Can''t connect to HTTPS URL because the SSL module is not available
Jul 31 Python
Python2和Python3中@abstractmethod使用方法
Feb 04 Python
python 自定义异常和主动抛出异常(raise)的操作
Dec 11 Python
Python 机器学习工具包SKlearn的安装与使用
May 14 Python
pytorch 运行一段时间后出现GPU OOM的问题
Jun 02 Python
python manim实现排序算法动画示例
Aug 14 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求一个网段开始与结束IP地址的方法
2015/07/09 PHP
PHP中单例模式的使用场景与使用方法讲解
2019/03/18 PHP
IE中createElement需要注意的一个问题
2010/07/13 Javascript
jQuery中slideUp()方法用法分析
2014/12/24 Javascript
动态加载jQuery的方法
2015/06/16 Javascript
Nodejs Express4.x开发框架随手笔记
2015/11/23 NodeJs
AngularJS上拉加载问题解决方法
2016/05/23 Javascript
jQuery实现点击后高亮背景固定显示的菜单效果【附demo源码下载】
2016/09/21 Javascript
基于jQuery制作小图标上下滑动特效
2017/01/18 Javascript
基于node.js的fs核心模块读写文件操作(实例讲解)
2017/09/10 Javascript
jquery一键控制checkbox全选、反选或全不选
2017/10/16 jQuery
vue+swiper实现侧滑菜单效果
2017/12/28 Javascript
d3.js实现自定义多y轴折线图的示例代码
2018/05/30 Javascript
详解微信小程序的 request 封装示例
2018/08/21 Javascript
详解Vue项目在其他电脑npm run dev运行报错的解决方法
2018/10/29 Javascript
微信小程序实现卡片左右滑动效果的示例代码
2019/05/01 Javascript
jquery实现淡入淡出轮播图效果
2020/12/13 jQuery
[44:33]EG vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python将字符串转换成数组的方法
2015/04/29 Python
python实现判断数组是否包含指定元素的方法
2015/07/15 Python
Python3.X 线程中信号量的使用方法示例
2017/07/24 Python
pycharm+django创建一个搜索网页实例代码
2018/01/24 Python
Python使用一行代码获取上个月是几月
2018/08/30 Python
Python使用requests提交HTTP表单的方法
2018/12/26 Python
Python时间和字符串转换操作实例分析
2019/03/16 Python
Python实现从SQL型数据库读写dataframe型数据的方法【基于pandas】
2019/03/18 Python
python3 pathlib库Path类方法总结
2019/12/26 Python
Pytorch数据拼接与拆分操作实现图解
2020/04/30 Python
canvas简单连线动画的实现代码
2020/02/04 HTML / CSS
俄罗斯最大的隐形眼镜销售网站:Ochkov.Net
2021/02/07 全球购物
会计电算化专业毕业生自荐信
2013/12/20 职场文书
教育局长自荐信范文
2013/12/22 职场文书
优秀共产党员事迹材料
2014/12/18 职场文书
三方合作意向书范本
2015/05/09 职场文书
《没有任何借口》读后感:完美的执行能力
2020/01/07 职场文书
用Python将GIF动图分解成多张静态图片
2021/06/11 Python