实例讲解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单例模式实例分析
Apr 08 Python
在windows系统中实现python3安装lxml
Mar 23 Python
Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】
Dec 15 Python
Python使用Django实现博客系统完整版
Sep 29 Python
Python3.6.0+opencv3.3.0人脸检测示例
May 25 Python
详解Django-restframework 之频率源码分析
Feb 27 Python
python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法
Jul 03 Python
python 实现12bit灰度图像映射到8bit显示的方法
Jul 08 Python
Django forms表单 select下拉框的传值实例
Jul 19 Python
django Admin文档生成器使用详解
Jul 22 Python
python自动化工具之pywinauto实例详解
Aug 26 Python
解决pycharm同一目录下无法import其他文件
Feb 12 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
关于BIG5-HKSCS的解决方法
2007/03/20 PHP
获取URL文件名后缀
2013/10/24 PHP
yii权限控制的方法(三种方法)
2015/12/28 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
2020/02/27 PHP
利用XMLHTTP传递参数在另一页面执行并刷新本页
2006/10/26 Javascript
jquery中的mouseleave和mouseout的区别 模仿下拉框效果
2012/02/07 Javascript
JavaScript常用验证函数实例汇总
2014/11/25 Javascript
JS验证逗号隔开可以是中文字母数字
2016/04/22 Javascript
全面解析JavaScript的Backbone.js框架中的Router路由
2016/05/05 Javascript
浅谈javascript中关于日期和时间的基础知识
2016/07/13 Javascript
利用浮层使select不可选的实现方法
2016/12/03 Javascript
Websocket协议详解及简单实例代码
2016/12/12 Javascript
vue中页面跳转拦截器的实现方法
2017/08/23 Javascript
在vue项目中引入highcharts图表的方法(详解)
2018/03/05 Javascript
JS打印彩色菱形的实例代码
2018/08/15 Javascript
angularjs实现对表单输入改变的监控(ng-change和watch两种方式)
2018/08/29 Javascript
node.js express框架简介与实现
2019/07/23 Javascript
[02:18]DOTA2英雄基础教程 育母蜘蛛
2014/01/20 DOTA
[37:03]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第二场 12.16
2020/12/18 DOTA
python encode和decode的妙用
2009/09/02 Python
使用Python脚本来控制Windows Azure的简单教程
2015/04/16 Python
Linux上安装Python的PIL和Pillow库处理图片的实例教程
2016/06/23 Python
Falsk 与 Django 过滤器的使用与区别详解
2019/06/04 Python
Python Selenium参数配置方法解析
2020/01/19 Python
python3 中使用urllib问题以及urllib详解
2020/08/03 Python
纯CSS3实现图片无间断轮播效果
2016/08/25 HTML / CSS
css3进阶之less实现星空动画的示例代码
2019/09/10 HTML / CSS
澳大利亚领先的孕妇服装品牌:Mamaway
2018/08/14 全球购物
市场安全管理制度
2014/01/26 职场文书
同志主要表现材料
2014/08/21 职场文书
乡镇群众路线教育实践活动整改措施
2014/10/04 职场文书
2015教师个人德育工作总结
2015/07/22 职场文书
食品安全主题班会
2015/08/13 职场文书
导游词之五台山
2019/10/11 职场文书
手把手教你导入Go语言第三方库
2021/08/04 Golang
浅析CSS在DevTools 中架构演变
2021/10/05 HTML / CSS