实例讲解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中实现结构相似的函数调用方法
Mar 10 Python
django model去掉unique_together报错的解决方案
Oct 18 Python
python 编程之twisted详解及简单实例
Jan 28 Python
python将ansible配置转为json格式实例代码
May 15 Python
python+requests+unittest API接口测试实例(详解)
Jun 10 Python
Python实现的FTP通信客户端与服务器端功能示例
Mar 28 Python
django2+uwsgi+nginx上线部署到服务器Ubuntu16.04
Jun 26 Python
在python中利用opencv简单做图片比对的方法
Jan 24 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
May 27 Python
Python+PyQT5的子线程更新UI界面的实例
Jun 14 Python
Django Form 实时从数据库中获取数据的操作方法
Jul 25 Python
Django在Model保存前记录日志实例
May 14 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
海贼王:最美的悬赏令!
2020/03/02 日漫
php的4种常见运行方式
2015/03/20 PHP
php中删除、清空session的方式总结
2015/10/09 PHP
php生成毫秒时间戳的实例讲解
2017/09/22 PHP
Add a Picture to a Microsoft Word Document
2007/06/15 Javascript
JavaScript 三种创建对象的方法
2009/10/16 Javascript
JavaScript 布尔操作符解析  &amp;&amp; || !
2012/08/10 Javascript
jquery统计复选框选中示例
2013/11/05 Javascript
jQuery实现单击和鼠标感应事件
2015/02/01 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
js实现简易的单数字随机抽奖(0-9)
2020/03/19 Javascript
angularjs学习笔记之简单介绍
2015/09/26 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)
2016/02/16 Javascript
JS/jQ实现免费获取手机验证码倒计时效果
2016/06/13 Javascript
jQuery+Pdo编写login登陆界面
2016/08/01 Javascript
浅谈js中的变量名和函数名重名
2017/02/13 Javascript
jQuery 中msgTips 顶部弹窗效果实现代码
2017/08/14 jQuery
jQuery获取所有父级元素及同级元素及子元素的方法(推荐)
2018/01/21 jQuery
详解封装基础的angular4的request请求方法
2018/06/05 Javascript
react build 后打包发布总结
2018/08/24 Javascript
详解ES6中的Map与Set集合
2019/03/22 Javascript
详解Js里的for…in和for…of的用法
2019/03/28 Javascript
详解mpvue开发微信小程序基础知识
2019/09/23 Javascript
[02:16]完美世界DOTA2联赛PWL S3 集锦第三期
2020/12/21 DOTA
python中的__init__ 、__new__、__call__小结
2014/04/25 Python
Python实现生成简单的Makefile文件代码示例
2015/03/10 Python
Python中利用sorted()函数排序的简单教程
2015/04/27 Python
pandas中的DataFrame按指定顺序输出所有列的方法
2018/04/10 Python
Python中asyncio模块的深入讲解
2019/06/10 Python
学Python 3的理由和必要性
2019/11/19 Python
Numpy(Pandas)删除全为零的列的方法
2020/09/11 Python
Html5实现二维码扫描并解析
2016/01/20 HTML / CSS
促销活动总结报告
2014/04/26 职场文书
给公司的建议书范文
2014/05/13 职场文书
岗位职责说明书模板
2014/07/30 职场文书
Oracle 触发器trigger使用案例
2022/02/24 Oracle