实例讲解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之大话题小函数(2)
Oct 10 Python
Python中optparse模块使用浅析
Jan 01 Python
python基础教程项目五之虚拟茶话会
Apr 02 Python
python增加矩阵维度的实例讲解
Apr 04 Python
pandas 获取季度,月度,年度首尾日期的方法
Apr 11 Python
详谈python3中用for循环删除列表中元素的坑
Apr 19 Python
python贪吃蛇游戏代码
Apr 18 Python
python实现屏保程序(适用于背单词)
Jul 30 Python
在notepad++中实现直接运行python代码
Dec 18 Python
Python实现使用dir获取类的方法列表
Dec 24 Python
python-jwt用户认证食用教学的实现方法
Jan 19 Python
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
Apr 21 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
Laravel 的数据库迁移的方法
2017/07/31 PHP
PHP设计模式之建造者模式定义与用法简单示例
2018/08/13 PHP
js获取触发事件元素在整个网页中的绝对坐标(示例代码)
2013/12/13 Javascript
获取3个数组不重复的值的具体实现
2013/12/30 Javascript
NodeJS使用jQuery选择器操作DOM
2015/02/13 NodeJs
javascript实现10个球随机运动、碰撞实例详解
2015/07/08 Javascript
JavaScript实现算术平方根算法-代码超简单
2015/09/11 Javascript
浅析node连接数据库(express+mysql)
2015/11/30 Javascript
使用NodeJs 开发微信公众号(三)微信事件交互实例
2016/03/02 NodeJs
jQuery实现立体式数字动态增加(animate方法)
2016/12/21 Javascript
js实现textarea限制输入字数
2017/02/13 Javascript
详解angular中的作用域及继承
2017/05/31 Javascript
javascript 中select框触发事件过程的分析
2017/08/01 Javascript
layer实现关闭弹出层刷新父界面功能详解
2017/11/15 Javascript
p5.js入门教程之鼠标交互的示例
2018/03/16 Javascript
微信小程序仿美团城市选择
2018/06/06 Javascript
js正则表达式校验指定字符串的方法
2018/07/23 Javascript
浅谈Webpack多页应用HMR卡住问题
2019/04/24 Javascript
Vue CLI3创建项目部署到Tomcat 使用ngrok映射到外网
2019/05/16 Javascript
vue中watch的用法汇总
2020/12/28 Vue.js
vue 数据双向绑定的实现方法
2021/03/04 Vue.js
[02:48]DOTA2英雄基础教程 暗夜魔王
2013/12/12 DOTA
Python字符串的encode与decode研究心得乱码问题解决方法
2009/03/23 Python
python实现定时播放mp3
2015/03/29 Python
python实现在windows下操作word的方法
2015/04/28 Python
Python的GUI框架PySide的安装配置教程
2016/02/16 Python
Python实现的求解最小公倍数算法示例
2018/05/03 Python
pytorch 获取tensor维度信息示例
2020/01/03 Python
TensorFlow命名空间和TensorBoard图节点实例
2020/01/23 Python
自定义html标记替换html5新增元素
2008/10/17 HTML / CSS
Melijoe英国官网:法国儿童时尚网站
2016/11/18 全球购物
美国中小型企业领先的办公家具供应商:Office Designs
2016/11/26 全球购物
Stylenanda中文站:韩国一线网络服装品牌
2016/12/22 全球购物
建筑公司文秘岗位职责
2013/11/29 职场文书
机关党员2014全国两会学习心得体会
2014/03/10 职场文书
html5表单的required属性使用
2021/07/07 HTML / CSS