实例讲解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实现去除下载电影和电视剧文件名中的多余字符的方法
Sep 23 Python
Python生成随机密码
Mar 10 Python
Python使用cookielib模块操作cookie的实例教程
Jul 12 Python
win系统下为Python3.5安装flask-mongoengine 库
Dec 20 Python
Python结合ImageMagick实现多张图片合并为一个pdf文件的方法
Apr 24 Python
Sanic框架蓝图用法实例分析
Jul 17 Python
python dict 相同key 合并value的实例
Jan 21 Python
Python编写合并字典并实现敏感目录的小脚本
Feb 26 Python
python利用selenium进行浏览器爬虫
Apr 25 Python
代码实例讲解python3的编码问题
Jul 08 Python
Python中文分词库jieba,pkusegwg性能准确度比较
Feb 11 Python
如何基于线程池提升request模块效率
Apr 18 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
全国FM电台频率大全 - 23 四川省
2020/03/11 无线电
用PHP创建PDF中文文档
2006/10/09 PHP
PHP数组操作――获取数组最后一个值的方法
2015/04/14 PHP
PHP 芝麻信用接入的注意事项
2016/12/01 PHP
简短几句 通俗解释javascript的闭包
2011/01/17 Javascript
找出字符串中出现次数最多的字母和出现次数精简版
2012/11/07 Javascript
JS中三目运算符和if else的区别分析与示例
2014/11/21 Javascript
js实现class样式的修改、添加及删除的方法
2015/01/20 Javascript
jquery渐隐渐显的图片幻灯闪烁切换实现方法
2015/02/26 Javascript
javascript通过元素id和name直接取得元素的方法
2015/04/28 Javascript
浅谈Javascript中Object与Function对象
2015/09/26 Javascript
JS实现点击按钮获取页面高度的方法
2015/11/02 Javascript
Javascript之Math对象详解
2016/06/07 Javascript
js Canvas绘制圆形时钟教程
2017/02/06 Javascript
JS检测window.open打开的窗口是否关闭
2017/06/25 Javascript
JavaScript实现与web通信的方法详解
2020/08/07 Javascript
[51:32]Optic vs Serenity 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
JS设计模式之责任链模式实例详解
2018/02/03 Python
python查看列的唯一值方法
2018/07/17 Python
python的time模块和datetime模块实例解析
2019/11/29 Python
基于Python 中函数的 收集参数 机制
2019/12/21 Python
使用jupyter Nodebook查看函数或方法的参数以及使用情况
2020/04/14 Python
关于Python解包知识点总结
2020/05/05 Python
css3 实现元素弧线运动的示例代码
2020/04/24 HTML / CSS
Marlies Dekkers内衣美国官方网上商店:高端内衣品牌
2018/11/12 全球购物
口腔医学技术应届生求职信
2013/11/09 职场文书
2014年三万活动总结
2014/04/26 职场文书
文体活动总结范文
2014/05/05 职场文书
推广普通话共筑中国梦演讲稿
2014/09/21 职场文书
群众路线领导班子四风对照检查材料
2014/09/27 职场文书
个人向公司借款协议书
2014/10/09 职场文书
安全隐患整改报告
2014/11/06 职场文书
团员自我评价范文
2015/03/10 职场文书
婚礼上证婚人致辞
2015/07/28 职场文书
四十年同学聚会致辞
2015/07/28 职场文书
Python数据可视化之用Matplotlib绘制常用图形
2021/06/03 Python