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的Bottle框架的一些使用技巧介绍
Apr 08 Python
Python ftp上传文件
Feb 13 Python
python3爬取各类天气信息
Feb 24 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
Apr 08 Python
如何利用python制作时间戳转换工具详解
Sep 12 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
Sep 26 Python
python文件读写代码实例
Oct 21 Python
Django 简单实现分页与搜索功能的示例代码
Nov 07 Python
Python函数的默认参数设计示例详解
Dec 01 Python
Python3运算符常见用法分析
Feb 14 Python
python中有帮助函数吗
Jun 19 Python
python 三种方法提取pdf中的图片
Feb 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
使用php检测用户当前使用的浏览器是否为IE浏览器
2013/12/03 PHP
php读取flash文件高宽帧数背景颜色的方法
2015/01/06 PHP
PHP创建PowerPoint2007文档的方法
2015/12/10 PHP
详解PHP匿名函数与注意事项
2016/03/29 PHP
php 流程控制switch的简单实例
2016/06/07 PHP
Ajax PHP JavaScript MySQL实现简易无刷新在线聊天室
2016/08/17 PHP
Zend Framework上传文件重命名的实现方法
2016/11/25 PHP
thinkPHP5实现数据库添加内容的方法
2017/10/25 PHP
php精度计算的问题解析
2019/06/21 PHP
PHP实现简单的计算器
2020/08/28 PHP
asp批量修改记录的代码
2008/06/25 Javascript
js中复制行和删除行的操作实例
2013/06/25 Javascript
点击页面其它地方隐藏该div的两种思路
2013/11/18 Javascript
jQuery带箭头提示框tooltips插件集锦
2014/11/17 Javascript
jQuery多媒体插件jQuery Media Plugin使用详解
2014/12/19 Javascript
ionic组件ion-tabs选项卡切换效果实例
2016/08/27 Javascript
vue绑定class与行间样式style详解
2017/08/16 Javascript
node通过npm写一个cli命令行工具
2017/10/12 Javascript
vue实现图书管理demo详解
2017/10/17 Javascript
Vue.js 中取得后台原生HTML字符串 原样显示问题的解决方法
2018/06/10 Javascript
vue基础知识--axios合并请求和slot
2020/06/04 Javascript
[39:52]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第一场
2018/04/04 DOTA
Pyhthon中使用compileall模块编译源文件为pyc文件
2015/04/28 Python
Python生成数字图片代码分享
2017/10/31 Python
Python里字典的基本用法(包括嵌套字典)
2019/02/27 Python
Python3模拟登录操作实例分析
2019/03/12 Python
Python Web项目Cherrypy使用方法镜像
2020/11/05 Python
CSS3实现文本垂直排列的方法
2018/07/10 HTML / CSS
HTML5边玩边学(2)基础绘图实现方法
2010/09/21 HTML / CSS
Timberland美国官网:全球领先的户外品牌
2016/08/15 全球购物
英国最大最好的无人机商店:Drones Direct
2019/07/12 全球购物
西班牙高科技产品购物网站:MejorDeseo
2019/09/08 全球购物
物业电工岗位职责
2013/11/20 职场文书
会计职业生涯规划书
2014/01/13 职场文书
开工仪式主持词
2014/03/20 职场文书
Android开发实现极为简单的QQ登录页面
2022/04/24 Java/Android