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基于pygame实现响应游戏中事件的方法(附源码)
Nov 11 Python
Python之reload流程实例代码解析
Jan 29 Python
对numpy中布尔型数组的处理方法详解
Apr 17 Python
对Python信号处理模块signal详解
Jan 09 Python
详解python配置虚拟环境
Apr 08 Python
Python列表对象实现原理详解
Jul 01 Python
python pickle存储、读取大数据量列表、字典数据的方法
Jul 07 Python
python2 中 unicode 和 str 之间的转换及与python3 str 的区别
Jul 25 Python
Python 、Pycharm、Anaconda三者的区别与联系、安装过程及注意事项
Oct 11 Python
Python生态圈图像格式转换问题(推荐)
Dec 02 Python
PyTorch中permute的用法详解
Dec 30 Python
Python PyQt5运行程序把输出信息展示到GUI图形界面上
Apr 27 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中养成7个面向对象的好习惯
2010/07/17 PHP
php 验证码(倾斜,正弦干扰线,黏贴,旋转)
2013/06/29 PHP
php获取指定范围内最接近数的方法
2015/06/02 PHP
详解WordPress中提醒安装插件以及隐藏插件的功能实现
2015/12/25 PHP
WordPress开发中的get_post_custom()函数使用解析
2016/01/04 PHP
微信公众平台DEMO(PHP)
2016/05/04 PHP
Zend Framework上传文件重命名的实现方法
2016/11/25 PHP
laravel框架实现为 Blade 模板引擎添加新文件扩展名操作示例
2020/01/25 PHP
预加载css或javascript的js代码
2010/04/23 Javascript
JavaScript 反科里化 this [译]
2012/09/20 Javascript
Js+Flash实现访问剪切板操作
2012/11/20 Javascript
从零学JSON之JSON数据结构
2014/05/19 Javascript
WEB 前端开发中防治重复提交的实现方法
2016/10/26 Javascript
html5 canvas 详细使用教程
2017/01/20 Javascript
详解Vuejs2.0 如何利用proxyTable实现跨域请求
2017/08/03 Javascript
vue.js iview打包上线后字体图标不显示解决办法
2020/01/20 Javascript
浅谈js中的attributes和Attribute的用法与区别
2020/07/16 Javascript
Python动态加载模块的3种方法
2014/11/22 Python
python中常用检测字符串相关函数汇总
2015/04/15 Python
Django 生成登陆验证码代码分享
2017/12/12 Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
2019/12/09 Python
Python模块future用法原理详解
2020/01/20 Python
使用Matplotlib绘制不同颜色的带箭头的线实例
2020/04/17 Python
pytorch 实现L2和L1正则化regularization的操作
2021/03/03 Python
美国杂志订阅折扣与优惠网站:Magazines.com
2016/08/31 全球购物
优秀企业获奖感言
2014/02/01 职场文书
工作推荐信范文
2014/05/10 职场文书
运动会演讲稿200字
2014/08/25 职场文书
优秀共产党员事迹材料
2014/12/18 职场文书
先进党支部事迹材料
2014/12/24 职场文书
会计求职信怎么写
2015/03/20 职场文书
离婚案件被告代理词
2015/05/23 职场文书
2016同学毕业寄语大全
2015/12/04 职场文书
使用python如何删除同一文件夹下相似的图片
2021/05/07 Python
Pygame Rect区域位置的使用(图文)
2021/11/17 Python
阿里云日志过滤器配置日志服务
2022/04/09 Servers