Python迭代器和生成器定义与用法示例


Posted in Python onFebruary 10, 2018

本文实例讲述了Python迭代器和生成器定义与用法。分享给大家供大家参考,具体如下:

迭代器 iter()

迭代器是访问集合中元素的一种方式,迭代器 object 从集合中的第一个元素开始访问,直到所有的元素被访问完成.

所以迭代器的特点是:只能往前,不能后退

迭代器的优点:不需要提前准备整个迭代器中的所有元素,仅仅迭代到某个元素时才计算该元素,而之前或者之后,元素可以不存在或者销毁.因为这个特点,迭代器特别适合遍历文件比较大或者无限的集合.

总结下迭代器 iter()的特点吧:

1.访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
2.不能随机访问集合中的某个值 ,只能从头到尾依次访问
3.访问到一半时不能往回退
4.便于循环比较大的数据集合,节省内存

**迭代器是用__next__()来取值的,来看个例子吧:

li=[1,2,3,4,56,78]
a=iter(li)
print(a.__next__())
print(a.__next__())
print(a.__next__())
print(a.__next__())
print(a.__next__())
print(a.__next__()) #取值到最后一个元素787
print(a.__next__())

输出:

1
2
3
4
56
78
#开始报错
Traceback (most recent call last):
 File "/Users/shane/PycharmProjects/Py_study/Base/S5/iter_test.py", line 14, in <module>
  print(a.__next__())
StopIteration

生成器generator

一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator);如果函数中包含yield语法,那这个函数就会变成生成器

yield是个什么鬼?yield 其实和函数中的 return 一样,一样的是都会返回定义好的值,但不同的是,return 是退出函数,yield 只是暂停函数执行,等待下一次迭代器取值

我们来看个例子:

def func():
  print(111)
  yield 1
  print(222)
  yield 2
  print(333)
  yield 3
ret=func()
r1=ret.__next__()
print(r1) #如果没有 print,只会返回111

out:

111
1

一个典型的生成器的取值方式:

def func():
  print(111)
  yield 1
  print(222)
  yield 2
  print(333)
  yield 3
ret=func()
r1=ret.__next__()
print(r1)
r2=ret.__next__()
print(r2)
r3=ret.__next__()
print(r3)
r4=ret.__next__()  #如果没有 r4就不会报错,因为已经没值可取了
print(r4)

out:

Traceback (most recent call last):
 File "/Users/shane/PycharmProjects/Py_study/Base/S5/geno.py", line 21, in <module>
  r4=ret.__next__()
StopIteration
111
1
222
2
333
3

进程已结束,退出代码1

来看一个比较完整一点的生成器和迭代器吧:

def myrange(args):
  start=0
  while True:
    if start > args:
      return
    else:
      yield start
      start+=1
res=myrange(3)
ret=res.__next__()
print(ret)
ret=res.__next__()
print(ret)
ret=res.__next__()
print(ret)
ret=res.__next__()
print(ret)
ret=res.__next__()
print(ret)

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python 随机数生成的代码的详细分析
May 15 Python
Python实现计算文件夹下.h和.cpp文件的总行数
Apr 23 Python
Python文件及目录操作实例详解
Jun 04 Python
Python批量生成特定尺寸图片及图画任意文字的实例
Jan 30 Python
Django中create和save方法的不同
Aug 13 Python
使用Python操作ArangoDB的方法步骤
Feb 02 Python
pip安装tensorflow的坑的解决
Apr 19 Python
Python实现封装打包自己写的代码,被python import
Jul 12 Python
Python进行统计建模
Aug 10 Python
Python自动化之UnitTest框架实战记录
Sep 08 Python
python实现马丁策略回测3000只股票的实例代码
Jan 22 Python
Django数据库(SQlite)基本入门使用教程
Jul 07 Python
Python中装饰器学习总结
Feb 10 #Python
Python基于hashlib模块的文件MD5一致性加密验证示例
Feb 10 #Python
Python中生成器和迭代器的区别详解
Feb 10 #Python
详解python中的线程
Feb 10 #Python
Odoo中如何生成唯一不重复的序列号详解
Feb 10 #Python
python TCP Socket的粘包和分包的处理详解
Feb 09 #Python
python实现Adapter模式实例代码
Feb 09 #Python
You might like
360通用php防护代码(使用操作详解)
2013/06/18 PHP
PHP数据库万能引擎类adodb配置使用以及实例集锦
2014/06/12 PHP
thinkphp框架实现删除和批量删除
2016/06/29 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
jQuery的一些注意
2006/12/06 Javascript
jQuery 加上最后自己的验证
2009/11/04 Javascript
Jquery选择器中使用变量实现动态选择例子
2014/07/25 Javascript
javascript常见操作汇总
2014/09/03 Javascript
jQuery手指滑动轮播效果
2016/12/22 Javascript
input输入密码变黑点密文的实现方法
2017/01/09 Javascript
薪资那么高的Web前端必看书单
2017/10/13 Javascript
什么是Vue.js框架 为什么选择它?
2017/10/17 Javascript
javascript 通过键名获取键盘的keyCode方法
2017/12/31 Javascript
vue页面离开后执行函数的实例
2018/03/13 Javascript
JavaScript继承与多继承实例分析
2018/05/26 Javascript
js实现下拉框二级联动
2018/12/04 Javascript
用云开发Cloudbase实现小程序多图片内容安全监测的代码详解
2020/06/07 Javascript
[01:02:05]LGD vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[48:46]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第二场 11.19
2020/11/19 DOTA
浅谈python新手中常见的疑惑及解答
2016/06/14 Python
python3中获取文件当前绝对路径的两种方法
2018/04/26 Python
python实现转盘效果 python实现轮盘抽奖游戏
2019/01/22 Python
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
2019/03/27 Python
python openCV获取人脸部分并存储功能
2019/08/28 Python
Python如何省略括号方法详解
2020/03/21 Python
python中编写函数并调用的知识点总结
2021/01/13 Python
莫斯科绝对前卫最秘密的商店:SVMoscow
2017/10/23 全球购物
继电保护工岗位职责
2014/01/05 职场文书
小学生新学期寄语
2014/01/19 职场文书
绩效管理实施方案
2014/03/19 职场文书
经销商订货会主持词
2014/03/27 职场文书
导师工作推荐信范文
2014/05/17 职场文书
有关九一八事变的演讲稿
2014/09/14 职场文书
阳光体育运动标语口号
2015/12/26 职场文书
工作一年自我鉴定
2019/06/20 职场文书
2019年感恩励志演讲稿(收藏备用)
2019/09/11 职场文书