实例讲解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使用内存zipfile对象在内存中打包文件示例
Apr 30 Python
用Python代码来解图片迷宫的方法整理
Apr 02 Python
Python标准库defaultdict模块使用示例
Apr 28 Python
Python+django实现文件下载
Jan 17 Python
Python利用itchat对微信中好友数据实现简单分析的方法
Nov 21 Python
Python利用splinter实现浏览器自动化操作方法
May 11 Python
浅谈Python3中strip()、lstrip()、rstrip()用法详解
Apr 29 Python
windows环境中利用celery实现简单任务队列过程解析
Nov 29 Python
python itsdangerous模块的具体使用方法
Feb 17 Python
Python 实现将某一列设置为str类型
Jul 14 Python
pandas apply使用多列计算生成新的列实现示例
Feb 24 Python
Python卷积神经网络图片分类框架详解分析
Nov 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
实现了一个PHP5的getter/setter基类的代码
2007/02/25 PHP
php self,$this,const,static,-&amp;gt;的使用
2009/10/22 PHP
Apache2中实现多网站域名绑定的实现方法
2011/06/01 PHP
codeigniter中测试通过的分页类示例
2014/04/17 PHP
php中使用gd库实现远程图片下载实例
2015/05/12 PHP
PHP中isset与array_key_exists的区别实例分析
2015/06/02 PHP
Yii框架实现图片上传的方法详解
2017/05/20 PHP
jQuery(js)获取文字宽度(显示长度)示例代码
2013/12/31 Javascript
原生js实现类似弹窗抖动效果
2015/04/02 Javascript
基于jQuery实现拖拽图标到回收站并删除功能
2015/11/25 Javascript
jQuery实现遮罩层登录对话框
2016/12/29 Javascript
Webpack中publicPath路径问题详解
2018/05/03 Javascript
js数据类型检测总结
2018/08/05 Javascript
对Vue.js之事件的绑定(v-on: 或者 @ )详解
2018/09/15 Javascript
vue elementui el-form rules动态验证的实例代码详解
2019/05/23 Javascript
vue 实现路由跳转时更改页面title
2019/11/05 Javascript
js函数柯里化的方法和作用实例分析
2020/04/11 Javascript
js实现幻灯片轮播图
2020/08/14 Javascript
[01:19:23]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第二场
2018/04/06 DOTA
[55:42]VG vs VGJ.T 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
Python是编译运行的验证方法
2015/01/30 Python
Python简单进程锁代码实例
2015/04/27 Python
python+selenium实现自动化百度搜索关键词
2019/06/03 Python
python中rc1什么意思
2020/06/19 Python
python之语音识别speech模块
2020/09/09 Python
Python之多进程与多线程的使用
2021/02/23 Python
html5是什么_动力节点Java学院整理
2017/07/07 HTML / CSS
AmazeUI中模态框的实现
2020/08/19 HTML / CSS
John Varvatos官方网站:设计师男士时装
2017/02/08 全球购物
施工人员岗位职责
2013/12/12 职场文书
超市仓管员岗位职责
2014/04/07 职场文书
邮政竞聘演讲稿
2014/09/03 职场文书
2015年话务员工作总结
2015/04/29 职场文书
中学社团活动总结
2015/05/07 职场文书
小学语文的各类谚语(70首)
2019/08/15 职场文书
OpenCV-Python直方图均衡化实现图像去雾
2021/06/07 Python