实例讲解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 相关文章推荐
pycharm 使用心得(八)如何调用另一文件中的函数
Jun 06 Python
Python实现保证只能运行一个脚本实例
Jun 24 Python
python 垃圾收集机制的实例详解
Aug 20 Python
Python文本统计功能之西游记用字统计操作示例
May 07 Python
python 不以科学计数法输出的方法
Jul 16 Python
python制作mysql数据迁移脚本
Jan 01 Python
​如何愉快地迁移到 Python 3
Apr 28 Python
详解Python列表赋值复制深拷贝及5种浅拷贝
May 15 Python
Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题
Jul 04 Python
python如何求圆的面积
Jul 01 Python
python logging模块的使用
Sep 07 Python
Python Pytorch查询图像的特征从集合或数据库中查找图像
Apr 09 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 win下Socket方式发邮件类
2009/08/21 PHP
PHP similar_text 字符串的相似性比较函数
2010/05/26 PHP
PHP中使用数组指针函数操作数组示例
2014/11/19 PHP
PHP自带方法验证邮箱是否存在
2016/02/01 PHP
PHP快速生成各种信息提示框的方法
2016/02/03 PHP
Javascript中Eval函数的使用
2010/03/23 Javascript
javascript来定义类的规范小结
2010/11/19 Javascript
js 链式延迟执行DOME
2012/01/04 Javascript
jquery配合css简单实现返回顶部效果
2013/09/30 Javascript
JavaScript设计模式之单件模式介绍
2014/12/28 Javascript
Node.js与Sails ~项目结构与Mvc实现及日志机制
2015/10/14 Javascript
jQuery实现本地预览上传图片功能
2016/01/08 Javascript
Angular 2父子组件数据传递之@ViewChild获取子组件详解
2017/07/04 Javascript
vue.js开发实现全局调用的MessageBox组件实例代码
2017/11/22 Javascript
NodeJS安装图文教程
2018/04/19 NodeJs
Vue路由切换时的左滑和右滑效果示例
2018/05/29 Javascript
jQuery实现鼠标移入显示蒙版效果
2020/01/11 jQuery
nuxt.js服务端渲染中axios和proxy代理的配置操作
2020/11/06 Javascript
在python中的socket模块使用代理实例
2014/05/29 Python
python3新特性函数注释Function Annotations用法分析
2016/07/28 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
2018/08/01 Python
关于阿里云oss获取sts凭证 app直传 python的实例
2019/08/20 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
2019/12/19 Python
Pytorch转tflite方式
2020/05/25 Python
基于python实现复制文件并重命名
2020/09/16 Python
Python的两道面试题
2013/06/29 面试题
创联软件面试题笔试题
2012/10/07 面试题
房地产销售计划书
2014/01/10 职场文书
学生出入校管理制度
2014/01/16 职场文书
大学生求职工作的自我评价
2014/02/13 职场文书
优秀共产党员先进事迹材料
2014/05/06 职场文书
自我介绍演讲稿范文
2014/08/21 职场文书
农业局党的群众路线教育实践活动整改方案
2014/09/20 职场文书
中学社团活动总结
2015/05/07 职场文书
工地食品安全责任书
2015/05/09 职场文书
民事辩护词范文
2015/05/21 职场文书