实例讲解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使用cx_Oracle模块将oracle中数据导出到csv文件的方法
May 16 Python
python中json格式数据输出的简单实现方法
Oct 31 Python
django开发之settings.py中变量的全局引用详解
Mar 29 Python
Python获取SQLite查询结果表列名的方法
Jun 21 Python
Python3爬虫学习之应对网站反爬虫机制的方法分析
Dec 12 Python
python爬虫 爬取超清壁纸代码实例
Aug 16 Python
解决Python中报错TypeError: must be str, not bytes问题
Apr 07 Python
pymysql之cur.fetchall() 和cur.fetchone()用法详解
May 15 Python
基于python tkinter的点名小程序功能的实例代码
Aug 22 Python
python爬虫实现爬取同一个网站的多页数据的实例讲解
Jan 18 Python
python numpy中multiply与*及matul 的区别说明
May 26 Python
Python  lambda匿名函数和三元运算符
Apr 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 获取百度的热词数据的代码
2012/02/18 PHP
php获取目标函数执行时间示例
2014/03/04 PHP
thinkphp5框架调用其它控制器方法 实现自定义跳转界面功能示例
2019/07/03 PHP
DHTML 中的绝对定位
2006/11/26 Javascript
IE6图片加载的一个BUG解决方法
2010/07/13 Javascript
在标题栏显示新消息提示,很多公司项目中用到这个方法
2011/11/04 Javascript
javascript动态加载二
2012/08/22 Javascript
Extjs 3.3切换tab隐藏相应工具栏出现空白解决
2013/04/02 Javascript
JS 操作Array数组的方法及属性实例解析
2014/01/08 Javascript
jQuery实现有动画淡出效果的二级折叠菜单代码
2015/10/17 Javascript
JS实现的仿QQ空间图片弹出效果代码
2016/02/23 Javascript
轻松掌握JavaScript中的Math object数学对象
2016/05/26 Javascript
Javascript缓存API
2016/06/14 Javascript
jQuery post数据至ashx实例详解
2016/11/18 Javascript
vue做网页开场视频的实例代码
2017/10/20 Javascript
使用纯前端JavaScript实现Excel导入导出方法过程详解
2020/08/07 Javascript
js实现点击烟花特效
2020/10/14 Javascript
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
2015/03/05 Python
Python实现的简单文件传输服务器和客户端
2015/04/08 Python
一文总结学习Python的14张思维导图
2017/10/17 Python
Python wxPython库Core组件BoxSizer用法示例
2018/09/03 Python
只需7行Python代码玩转微信自动聊天
2019/01/27 Python
Python深拷贝与浅拷贝用法实例分析
2019/05/05 Python
实现Python与STM32通信方式
2019/12/18 Python
Python3 使用selenium插件爬取苏宁商家联系电话
2019/12/23 Python
Python figure参数及subplot子图绘制代码
2020/04/18 Python
Pandas直接读取sql脚本的方法
2021/01/21 Python
CSS3条纹背景制作的实战攻略
2016/05/31 HTML / CSS
The Hut美国/加拿大:英国领先的豪华在线百货商店
2019/03/26 全球购物
美国波西米亚风格精品店:South Moon Under
2019/10/26 全球购物
屈臣氏泰国官网:Watsons TH
2021/02/23 全球购物
机关党建工作汇报材料
2014/08/20 职场文书
捐书倡议书
2014/08/29 职场文书
四查四看整改措施
2014/09/19 职场文书
中标通知书格式
2015/04/17 职场文书
2016大学先进团支部事迹材料
2016/03/01 职场文书