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解决汉字编码问题:Unicode Decode Error
Jan 19 Python
python爬虫之自动登录与验证码识别
Jun 15 Python
python 保存float类型的小数的位数方法
Oct 17 Python
Python I/O与进程的详细讲解
Mar 08 Python
python程序运行进程、使用时间、剩余时间显示功能的实现代码
Jul 11 Python
python爬虫刷访问量 2019 7月
Aug 01 Python
Python爬取知乎图片代码实现解析
Sep 17 Python
Tensorflow 多线程设置方式
Feb 06 Python
Django关于admin的使用技巧和知识点
Feb 10 Python
Python局部变量与全局变量区别原理解析
Jul 14 Python
Python通过fnmatch模块实现文件名匹配
Sep 30 Python
基于Python实现对比Exce的工具
Apr 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
哪吒敖丙传:新人物二哥敖乙出场 小敖丙奶气十足
2020/03/08 国漫
PHP递归调用数组值并用其执行指定函数的方法
2015/04/01 PHP
php使用Jpgraph绘制柱形图的方法
2015/06/10 PHP
PHP生成唯一ID之SnowFlake算法
2016/12/17 PHP
JavaScript CSS修改学习第五章 给“上传”添加样式
2010/02/19 Javascript
非常好用的JsonToString 方法 简单实例
2013/07/18 Javascript
jquery遍历数组与筛选数组的方法
2013/11/05 Javascript
JS实现从表格中动态删除指定行的方法
2015/03/31 Javascript
JavaScript中数据结构与算法(三):链表
2015/06/19 Javascript
深入浅析AngularJS中的module(模块)
2016/01/04 Javascript
详解Angular.js数据绑定时自动转义html标签及内容
2017/03/30 Javascript
基于twbsPagination.js分页插件使用心得(分享)
2017/10/21 Javascript
vue3.0 CLI - 3.2 路由的初级使用教程
2018/09/20 Javascript
微信小程序当前时间时段选择器插件使用方法详解
2018/12/28 Javascript
layui扩展上传组件模拟进度条的方法
2019/09/23 Javascript
vue-cli创建的项目中的gitHooks原理解析
2020/02/14 Javascript
微信小程序文章详情功能完整实例
2020/06/03 Javascript
[02:57]DOTA2亚洲邀请赛小组赛第四日 赛事回顾
2015/02/02 DOTA
[01:04:05]VG vs Newbee 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python中设置变量作为默认值时容易遇到的错误
2015/04/03 Python
浅谈Python的垃圾回收机制
2016/12/17 Python
Django 缓存配置Redis使用详解
2019/07/23 Python
python打造爬虫代理池过程解析
2019/08/15 Python
印尼在线精品店:Berrybenka.com
2016/10/22 全球购物
美国Jeep配件购物网站:Morris 4×4 Center
2019/05/01 全球购物
德国在线香料制造商:Gewürzland
2020/03/10 全球购物
javascript实现用户必须勾选协议实例讲解
2021/03/24 Javascript
艺术系大学生毕业个人自我评价
2013/09/19 职场文书
对公司合理化的建议书
2014/03/12 职场文书
全运会口号
2014/06/20 职场文书
民族学专业大学生职业规划范文:清晰未来的构想
2014/09/20 职场文书
党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
pandas提升计算效率的一些方法汇总
2021/05/30 Python
自从在 IDEA 中用了热部署神器 JRebel 之后,开发效率提升了 10(真棒)
2021/06/26 Java/Android
openGauss数据库JDBC环境连接配置的详细过程(Eclipse)
2022/06/01 Java/Android
JS前端监控采集用户行为的N种姿势
2022/07/23 Javascript