实例讲解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 相关文章推荐
python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)
Feb 24 Python
给Python入门者的一些编程建议
Jun 15 Python
Python的Django框架中自定义模版标签的示例
Jul 20 Python
Python3使用requests登录人人影视网站的方法
May 11 Python
python email smtplib模块发送邮件代码实例
Apr 26 Python
Python编程深度学习绘图库之matplotlib
Dec 28 Python
Python内置方法实现字符串的秘钥加解密(推荐)
Dec 09 Python
python 写函数在一定条件下需要调用自身时的写法说明
Jun 01 Python
Python调用百度OCR实现图片文字识别的示例代码
Jul 17 Python
matplotlib部件之套索Lasso的使用
Feb 24 Python
python 字典和列表嵌套用法详解
Jun 29 Python
Python 中的Sympy详细使用
Aug 07 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 无限分类三种方式 非函数的递归调用!
2011/08/26 PHP
php一次性删除前台checkbox多选内容的方法
2013/09/22 PHP
php生成mysql的数据字典
2016/07/07 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
2019/11/26 PHP
JS+flash实现chrome和ie浏览器下同时可以复制粘贴
2013/09/22 Javascript
Javascript核心读书有感之表达式和运算符
2015/02/11 Javascript
javascript闭包的理解
2015/04/01 Javascript
javascript字符串函数汇总
2015/12/06 Javascript
SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
2015/12/10 Javascript
jquery获取文档高度和窗口高度汇总
2016/01/25 Javascript
Bootstrap与KnockoutJs相结合实现分页效果实例详解
2016/05/03 Javascript
微信小程序加载更多 点击查看更多
2016/11/29 Javascript
Webpack框架核心概念(知识点整理)
2017/12/22 Javascript
开发一个Parcel-vue脚手架工具(详细步骤)
2018/09/22 Javascript
JavaScript判断浏览器运行环境的详细方法
2019/06/30 Javascript
vue自定义switch开关组件,实现样式可自行更改
2019/11/01 Javascript
[01:28:56]2014 DOTA2华西杯精英邀请赛 5 24 CIS VS DK
2014/05/26 DOTA
[02:56]DOTA2亚洲邀请赛 VG出场战队巡礼
2015/02/07 DOTA
[01:02:48]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Liquid
2018/04/03 DOTA
[47:20]DAC2018 4.4 淘汰赛 Optic vs Mineski 第一场
2018/04/05 DOTA
[32:07]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第一场 12.16
2020/12/17 DOTA
在Django的URLconf中进行函数导入的方法
2015/07/18 Python
使用python实现抓取腾讯视频所有电影的爬虫
2019/04/15 Python
如何基于Python Matplotlib实现网格动画
2020/07/20 Python
三陽商会官方网站:Sanyo iStore
2019/05/15 全球购物
法国在线药房:1001Pharmacies
2021/03/07 全球购物
户外拓展活动方案
2014/02/11 职场文书
2014公司党员自我评价范文
2014/09/11 职场文书
教师党的群众路线教育实践活动个人整改措施
2014/11/04 职场文书
单位介绍信格式范文
2015/05/04 职场文书
催款函范本大全
2015/06/24 职场文书
小学四年级班主任工作经验交流材料
2015/11/02 职场文书
房屋买卖定金协议书
2016/03/21 职场文书
Python图片检索之以图搜图
2021/05/31 Python
用python批量解压带密码的压缩包
2021/05/31 Python
详解Python中的进程和线程
2021/06/23 Python