实例讲解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制作CSDN免积分下载器
Mar 10 Python
浅谈python多线程和队列管理shell程序
Aug 04 Python
今天 平安夜 Python 送你一顶圣诞帽 @微信官方
Dec 25 Python
ubuntu安装mysql pycharm sublime
Feb 20 Python
Python闭包思想与用法浅析
Dec 27 Python
python 多线程串行和并行的实例
Feb 22 Python
python 含子图的gif生成时内存溢出的方法
Jul 07 Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
Aug 27 Python
python getpass实现密文实例详解
Sep 24 Python
将python依赖包打包成window下可执行文件bat方式
Dec 26 Python
python 实现将Numpy数组保存为图像
Jan 09 Python
Python 把两层列表展开平铺成一层(5种实现方式)
Apr 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通过COM使用ADODB的简单例子
2006/12/31 PHP
mysql 中InnoDB和MyISAM的区别分析小结
2008/04/15 PHP
mongo Table类文件 获取MongoCursor(游标)的实现方法分析
2013/07/01 PHP
详解php 使用Callable Closure强制指定回调类型
2017/10/26 PHP
javascript 写类方式之九
2009/07/05 Javascript
Javascript 汉字字节判断
2009/08/01 Javascript
jQuery.query.js 取参数的两点问题分析
2012/08/06 Javascript
简单常用的幻灯片播放实现代码
2013/09/25 Javascript
特殊情况下如何获取span里面的值
2014/05/20 Javascript
escape函数解决js中ajax传递中文出现乱码问题
2014/10/30 Javascript
JavaScript中操作Mysql数据库实例
2015/04/02 Javascript
深入浅析AngularJS和DataModel
2016/02/16 Javascript
关于javascript事件响应的基础语法总结(必看篇)
2016/12/26 Javascript
利用JS实现简单的瀑布流加载图片效果
2017/04/22 Javascript
最通俗易懂的javascript变量提升详解
2017/08/05 Javascript
vue基于Element构建自定义树的示例代码
2017/09/19 Javascript
vue 实现 ios 原生picker 效果及实现思路解析
2017/12/06 Javascript
vue绑定事件后获取绑定事件中的this方法
2018/09/15 Javascript
通过实例讲解JS如何防抖动
2019/06/15 Javascript
create-react-app中添加less支持的实现
2019/11/15 Javascript
vue计算属性+vue中class与style绑定(推荐)
2020/03/30 Javascript
微信小程序实现多图上传
2020/06/19 Javascript
python中文件变化监控示例(watchdog)
2017/10/16 Python
python获取文件路径、文件名、后缀名的实例
2018/04/23 Python
python实现AES加密与解密
2019/03/28 Python
python3 实现口罩抽签的功能
2020/03/11 Python
css3弹性盒模型实例介绍
2013/05/27 HTML / CSS
英国轻奢珠宝品牌:Astley Clarke
2016/12/18 全球购物
三只松鼠官方旗舰店:全网坚果销售第1
2017/11/25 全球购物
Big Green Smile德国网上商店:提供各种天然产品
2018/05/23 全球购物
外语系毕业生自荐信范文
2013/12/16 职场文书
大学生职业生涯规划方案
2014/01/03 职场文书
学校募捐倡议书
2014/05/14 职场文书
项目合作协议书
2014/09/23 职场文书
门卫管理制度范本
2015/08/05 职场文书
导游词之青岛太清宫
2019/12/13 职场文书