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比较两个图片相似度的方法
Mar 13 Python
简单介绍Python的Django框架加载模版的方式
Jul 20 Python
Python使用struct处理二进制的实例详解
Sep 11 Python
在pycharm中python切换解释器失败的解决方法
Oct 29 Python
在linux系统下安装python librtmp包的实现方法
Jul 22 Python
pycharm设置鼠标悬停查看方法设置
Jul 29 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
Aug 05 Python
浅谈pycharm使用及设置方法
Sep 09 Python
Pandas数据离散化原理及实例解析
Nov 16 Python
Python urlencode和unquote函数使用实例解析
Mar 31 Python
Python request使用方法及问题总结
Apr 26 Python
python单元测试之pytest的使用
Jun 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学习之PHP表达式
2006/10/09 PHP
PHP内核探索:变量概述
2014/01/30 PHP
php使用pdo连接并查询sql数据库的方法
2014/12/24 PHP
php截取指定2个字符之间字符串的方法
2015/04/15 PHP
php根据用户语言跳转相应网页
2015/11/04 PHP
php基于session锁防止阻塞请求的方法分析
2017/08/07 PHP
php7连接MySQL实现简易查询程序的方法
2020/10/13 PHP
css动画效果之animation的常用样式
2021/03/09 HTML / CSS
IE和Firefox下event事件杂谈
2009/12/18 Javascript
javascript suggest效果 自动完成实现代码分享
2012/02/17 Javascript
用原生JS对AJAX做简单封装的实例代码
2016/07/13 Javascript
浅谈js继承的实现及公有、私有、静态方法的书写
2016/10/28 Javascript
微信小程序  modal详解及实例代码
2016/11/09 Javascript
详解照片瀑布流效果(js,jquery分别实现与知识点总结)
2017/01/01 Javascript
vue2滚动条加载更多数据实现代码
2017/01/10 Javascript
详解前端构建工具gulpjs的使用介绍及技巧
2017/01/19 Javascript
angular动态表单制作
2018/02/23 Javascript
vue设置动态请求地址的例子
2019/11/01 Javascript
[00:29]2019完美世界全国高校联赛(秋季赛)总决赛海口落幕
2019/12/10 DOTA
python将html转成PDF的实现代码(包含中文)
2013/03/04 Python
Python 执行字符串表达式函数(eval exec execfile)
2014/08/11 Python
python实现的正则表达式功能入门教程【经典】
2017/06/05 Python
对python中return和print的一些理解
2017/08/18 Python
使用Flask集成bootstrap的方法
2018/07/24 Python
win10环境下配置vscode python开发环境的教程详解
2019/10/16 Python
HTML5中的拖放实现详解
2017/08/23 HTML / CSS
Otticanet美国:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/03/10 全球购物
EJB的几种类型
2012/08/15 面试题
承诺书范文
2014/06/03 职场文书
社会治安综合治理责任书
2015/01/29 职场文书
社区文明创建工作总结2015
2015/04/21 职场文书
环保证明
2015/06/23 职场文书
2016七夕情人节寄语
2015/12/04 职场文书
拥有这5个特征人,“命”都不会太差
2019/08/16 职场文书
Python代码风格与编程习惯重要吗?
2021/06/03 Python
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电