实例讲解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使用pil库实现图片合成实例代码
Jan 20 Python
通过Py2exe将自己的python程序打包成.exe/.app的方法
May 26 Python
Sanic框架安装与简单入门示例
Jul 16 Python
Python根据当前日期取去年同星期日期
Apr 14 Python
Python 抓取微信公众号账号信息的方法
Jun 14 Python
利用Python模拟登录pastebin.com的实现方法
Jul 12 Python
详解Python图像处理库Pillow常用使用方法
Sep 02 Python
python使用配置文件过程详解
Dec 28 Python
Python3操作YAML文件格式方法解析
Apr 10 Python
什么是python的自省
Jun 21 Python
python如何实现DES加密
Sep 21 Python
利用Python优雅的登录校园网
Oct 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
将OICQ数据转成MYSQL数据
2006/10/09 PHP
使用Xdebug调试和优化PHP程序之[1]
2007/04/17 PHP
将博客园(cnblogs.com)数据导入到wordpress的代码
2013/01/06 PHP
php 检查电子邮件函数(自写)
2014/01/16 PHP
php获取客户端电脑屏幕参数的方法
2015/01/09 PHP
Yii中srbac权限扩展模块工作原理与用法分析
2016/07/14 PHP
学习YUI.Ext 第七天--关于View&amp;JSONView
2007/03/10 Javascript
jquery高效反选具体实现
2013/05/05 Javascript
Jquery时间验证和转换工具小例子
2013/07/01 Javascript
NodeJs的fs读写删除移动监听
2017/04/28 NodeJs
jquery.rotate.js实现可选抽奖次数和中奖内容的转盘抽奖代码
2017/08/23 jQuery
基于bootstrop常用类总结(推荐)
2017/09/11 Javascript
angularJs-$http实现百度搜索时的动态下拉框示例
2018/02/27 Javascript
Electron 如何调用本地模块的方法
2019/02/01 Javascript
Layui Table js 模拟选中checkbox的例子
2019/09/03 Javascript
Python实现在线程里运行scrapy的方法
2015/04/07 Python
用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
2017/12/14 Python
Python使用pickle模块存储数据报错解决示例代码
2018/01/26 Python
django用户注册、登录、注销和用户扩展的示例
2018/03/19 Python
Python安装pycurl失败的解决方法
2018/10/15 Python
python实现简单名片管理系统
2018/11/30 Python
解析PyCharm Python运行权限问题
2020/01/08 Python
基于python实现复制文件并重命名
2020/09/16 Python
python闭包与引用以及需要注意的陷阱
2020/09/18 Python
python3判断IP地址的方法
2021/03/04 Python
AE美国鹰美国官方网站:American Eagle Outfitters
2016/08/22 全球购物
医学生个人求职信范文
2013/09/24 职场文书
高级人员简历的自我评价分享
2013/11/03 职场文书
小学教师事迹材料
2014/01/13 职场文书
学雷锋倡议书
2015/01/19 职场文书
农村党支部承诺书
2015/04/30 职场文书
小公司融资,商业计划书的8切记
2019/07/15 职场文书
为什么说餐饮很难做,是因为你不了解这些新规则
2019/08/20 职场文书
JS异步堆栈追踪之为什么await胜过Promise
2021/04/28 Javascript
pytorch 使用半精度模型部署的操作
2021/05/24 Python
Python使用OpenCV实现虚拟缩放效果
2022/02/28 Python