实例讲解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基础教程之基本数据类型和变量声明介绍
Aug 29 Python
python中global与nonlocal比较
Nov 21 Python
Python基类函数的重载与调用实例分析
Jan 12 Python
Python函数返回值实例分析
Jun 08 Python
Python实现使用卷积提取图片轮廓功能示例
May 12 Python
利用python GDAL库读写geotiff格式的遥感影像方法
Nov 29 Python
python基于socket实现的UDP及TCP通讯功能示例
Nov 01 Python
python基于gevent实现并发下载器代码实例
Nov 01 Python
Python 下载及安装详细步骤
Nov 04 Python
关于Python Tkinter Button控件command传参问题的解决方式
Mar 04 Python
Python如何截图保存的三种方法(小结)
Sep 01 Python
python 自动识别并连接串口的实现
Jan 19 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+Mysql无限分类的方法汇总
2015/03/02 PHP
CodeIgniter中使用Smarty3基本配置
2015/06/29 PHP
php实现购物车功能(上)
2020/07/23 PHP
php将文件夹打包成zip文件的简单实现方法
2016/10/04 PHP
IIS 7.5 asp Session超时时间设置方法
2017/04/17 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
极酷的javascirpt,让你随意编辑任何网页
2007/02/25 Javascript
一组JS创建和操作表格的函数集合
2009/05/07 Javascript
JavaScript 事件对象的实现
2009/07/13 Javascript
基于jQuery的图片剪切插件
2011/08/03 Javascript
通过上下左右键和回车键切换光标实现代码
2013/03/08 Javascript
javascript通过navigator.userAgent识别各种浏览器
2013/10/25 Javascript
JS生成不重复随机数组的函数代码
2014/06/10 Javascript
js点击按钮实现水波纹效果代码(CSS3和Canves)
2016/09/15 Javascript
详解Webpack实战之构建 Electron 应用
2017/12/25 Javascript
浅谈webpack对样式的处理
2018/01/05 Javascript
Python的迭代器和生成器
2015/07/29 Python
python中利用xml.dom模块解析xml的方法教程
2017/05/24 Python
python自动裁剪图像代码分享
2017/11/25 Python
python开发准备工作之配置虚拟环境(非常重要)
2019/02/11 Python
Python 20行简单实现有道在线翻译的详解
2019/05/15 Python
一篇文章弄懂Python中所有数组数据类型
2019/06/23 Python
德国购买踏板车网站:Microscooter
2019/10/14 全球购物
仓库管理专业个人自我评价范文
2013/11/11 职场文书
安全事故检讨书
2014/01/18 职场文书
行政文秘岗位职责范本
2014/02/10 职场文书
心理学专业大学生职业生涯规划范文
2014/02/19 职场文书
2014乡镇党政班子四风问题思想汇报
2014/09/14 职场文书
2014客服代表实习自我鉴定
2014/09/18 职场文书
2014年项目工作总结
2014/11/24 职场文书
违规违纪检讨书范文
2015/05/06 职场文书
交心谈心活动总结
2015/05/11 职场文书
第一节英语课开场白
2015/06/01 职场文书
2016秋季校长开学典礼致辞
2015/11/26 职场文书
react 项目中引入图片的几种方式
2021/06/02 Javascript
Winsows11性能如何? win11性能测评多核竟比Win10差了10%
2021/11/21 数码科技