实例讲解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判断端口是否打开的实现代码
Feb 10 Python
Python实现的数据结构与算法之链表详解
Apr 22 Python
使用Python编写简单的端口扫描器的实例分享
Dec 18 Python
详解Python中使用base64模块来处理base64编码的方法
Jul 01 Python
Python遍历文件夹和读写文件的实现方法
May 10 Python
Python基于pygame模块播放MP3的方法示例
Sep 30 Python
Python装饰器用法实例总结
May 26 Python
Python3中编码与解码之Unicode与bytes的讲解
Feb 28 Python
django中嵌套的try-except实例
May 21 Python
python的help函数如何使用
Jun 11 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
Oct 15 Python
python字典进行运算原理及实例分享
Aug 02 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
请离开include_once和require_once
2013/07/18 PHP
ZF框架实现发送邮件的方法
2015/12/03 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
在JavaScript中重写jQuery对象的方法实例教程
2014/08/25 Javascript
JQuery判断radio(单选框)是否选中和获取选中值方法总结
2015/04/15 Javascript
JavaScript实现自动弹出窗口并自动关闭窗口的方法
2015/08/06 Javascript
JavaScript动态创建div等元素实例讲解
2016/01/06 Javascript
JS把内容动态插入到DIV的实现方法
2016/07/19 Javascript
jQuery简单实现中间浮窗效果
2016/09/04 Javascript
AngularJS使用ng-Cloak阻止初始化闪烁问题的方法
2016/11/03 Javascript
原生js实现放大镜特效
2017/03/08 Javascript
VueJs单页应用实现微信网页授权及微信分享功能示例
2017/07/26 Javascript
解决Vue.js父组件$on无法监听子组件$emit触发事件的问题
2018/09/12 Javascript
详解VUE项目中安装和使用vant组件
2019/04/28 Javascript
JS中队列和双端队列实现及应用详解
2020/09/29 Javascript
jquery实现点击左右按钮切换图片
2021/01/27 jQuery
python numpy函数中的linspace创建等差数列详解
2017/10/13 Python
Python requests发送post请求的一些疑点
2018/05/20 Python
python实现逆序输出一个数字的示例讲解
2018/06/25 Python
Python双向循环链表实现方法分析
2018/07/30 Python
python去掉 unicode 字符串前面的u方法
2018/10/21 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
2019/06/25 Python
PyQt5+Caffe+Opencv搭建人脸识别登录界面
2019/08/28 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
2021/03/03 Python
CSS3动画:5种预载动画效果实例
2017/04/05 HTML / CSS
英国汽车零件购物网站:GSF Car Parts
2019/05/23 全球购物
一套.net面试题及答案
2016/11/02 面试题
Linux管理员面试题 Linux admin interview questions
2016/07/08 面试题
船舶专业个人求职信范文
2014/01/02 职场文书
2014年办公室人员工作总结
2014/12/09 职场文书
实习生辞职信范文
2015/03/02 职场文书
2015年学校体育工作总结
2015/04/22 职场文书
爱心捐助活动总结
2015/05/09 职场文书
大学新生入学感想
2015/08/07 职场文书
台积电称即便经济低迷也没有降价的计划
2022/04/21 数码科技