实例讲解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爬虫中urllib库的进阶学习
Jan 05 Python
python做量化投资系列之比特币初始配置
Jan 23 Python
对Python中plt的画图函数详解
Nov 07 Python
Python3中exp()函数用法分析
Feb 19 Python
在Django下测试与调试REST API的方法详解
Aug 29 Python
Ubuntu16.04安装python3.6.5步骤详解
Jan 10 Python
python 安装库几种方法之cmd,anaconda,pycharm详解
Apr 08 Python
在jupyter notebook中调用.ipynb文件方式
Apr 14 Python
python 异步async库的使用说明
May 04 Python
python算的上脚本语言吗
Jun 22 Python
基于注解实现 SpringBoot 接口防刷的方法
Mar 02 Python
python中的None与NULL用法说明
May 25 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模拟QQ登录的方法
2015/07/29 PHP
2款PHP无限级分类实例代码
2015/11/11 PHP
php中this关键字用法分析
2016/12/07 PHP
JavaScript Event学习第三章 早期的事件处理程序
2010/02/07 Javascript
js+xml生成级联下拉框代码
2012/07/24 Javascript
javascript小数四舍五入多种方法实现
2012/12/23 Javascript
IE下写xml文件的两种方式(fso/saveAs)
2013/08/05 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
2015/05/11 Javascript
用javascript实现自动输出网页文本
2015/07/30 Javascript
JS图片定时翻滚效果实现方法
2016/06/21 Javascript
Vue实现路由跳转和嵌套
2017/06/20 Javascript
vue.js实现条件渲染的实例代码
2017/06/22 Javascript
js学使用setTimeout实现轮循动画
2017/07/17 Javascript
VUE 动态组件的应用案例分析
2019/12/02 Javascript
uni-app如何页面传参数的几种方法总结
2020/04/28 Javascript
JS中锚点链接点击平滑滚动并自由调整到顶部位置
2021/02/06 Javascript
[36:33]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第二场 11.29
2020/12/02 DOTA
Python绘制3D图形
2018/05/03 Python
Python语法分析之字符串格式化
2019/06/13 Python
PIL图像处理模块paste方法简单使用详解
2019/07/17 Python
Python 切分数组实例解析
2019/11/07 Python
Python实现图像去噪方式(中值去噪和均值去噪)
2019/12/18 Python
Python读取pdf表格写入excel的方法
2021/01/22 Python
css3的transition属性详解
2014/12/15 HTML / CSS
canvas像素画板的实现代码
2018/11/21 HTML / CSS
amazeui 验证按钮扩展的实现
2020/08/21 HTML / CSS
阿迪达斯丹麦官网:adidas丹麦
2016/10/01 全球购物
美国零售商店:Blue&Cream
2017/04/07 全球购物
男女时尚与复古风格在线购物:RoseGal(全球免费送货)
2017/07/19 全球购物
企业晚会策划方案
2014/05/29 职场文书
综治维稳工作承诺书
2014/08/30 职场文书
党的群众路线教育实践活动对照检查材料
2014/09/22 职场文书
四风个人对照检查材料思想汇报(办公室通用版)
2014/10/07 职场文书
煤矿施工安全协议书
2016/03/22 职场文书
Python爬虫实战之爬取京东商品数据并实实现数据可视化
2021/06/07 Python
js 数组 fill() 填充方法
2021/11/02 Javascript