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 17 Python
python计算圆周率pi的方法
Jul 11 Python
python十进制和二进制的转换方法(含浮点数)
Jul 07 Python
解决使用pycharm提交代码时冲突之后文件丢失找回的方法
Aug 05 Python
解决sublime+python3无法输出中文的问题
Dec 12 Python
python实现数据分析与建模
Jul 11 Python
Python Django Vue 项目创建过程详解
Jul 29 Python
pycharm 2019 最新激活方式(pycharm破解、激活)
Sep 22 Python
Python字典添加,删除,查询等相关操作方法详解
Feb 07 Python
Python流程控制常用工具详解
Feb 24 Python
简单了解python shutil模块原理及使用方法
Apr 28 Python
浅谈Python 命令行参数argparse写入图片路径操作
Jul 12 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
Body是什么,该怎么喝出咖啡里的口感
2021/03/03 咖啡文化
php error_log 函数的使用
2009/04/13 PHP
php打造属于自己的MVC框架
2012/03/07 PHP
PHP常用字符串操作函数实例总结(trim、nl2br、addcslashes、uudecode、md5等)
2016/01/09 PHP
php通过两层过滤获取留言内容的方法
2016/07/11 PHP
php PDO异常处理详解
2016/11/20 PHP
PHP输出多个元素的排列或组合的方法
2017/03/14 PHP
php实现和c#一致的DES加密解密实例
2017/07/24 PHP
JavaScript Distilled 基础知识与函数
2010/04/07 Javascript
javascript 触发HTML元素绑定的函数
2010/09/11 Javascript
Javascript实现DIV滚动自动滚动到底部的代码
2012/03/01 Javascript
jQuery fadeTo方法调整图片的透明度使用介绍
2013/05/06 Javascript
jQuery遍历页面所有CheckBox查看是否被选中的方法
2015/04/14 Javascript
JavaScript保存并运算页面中数字类型变量的写法
2015/07/06 Javascript
Bootstrap的图片轮播示例代码
2015/08/31 Javascript
AngularJS实现一次监听多个值发生的变化
2016/08/31 Javascript
用node开发并发布一个cli工具的方法步骤
2019/01/03 Javascript
jQuery实现每日秒杀商品倒计时功能
2019/09/06 jQuery
在vue中实现禁止回退上一步,路由不存历史记录
2020/07/22 Javascript
Python中每次处理一个字符的5种方法
2015/05/21 Python
Python处理CSV与List的转换方法
2018/04/19 Python
如何实现删除numpy.array中的行或列
2018/05/08 Python
python得到电脑的开机时间方法
2018/10/15 Python
Python设计模式之适配器模式原理与用法详解
2019/01/15 Python
python logging添加filter教程
2019/12/24 Python
CSS3实现网站商品展示效果图
2020/01/18 HTML / CSS
Qoo10马来西亚:全球时尚和引领潮流的购物市场
2016/08/25 全球购物
计算机专业自我鉴定
2013/10/15 职场文书
会计专业毕业生自我鉴定
2013/10/29 职场文书
护士在校生自荐信
2014/02/01 职场文书
捐款活动总结
2014/08/27 职场文书
讲党性心得体会
2014/09/03 职场文书
企业委托书范本
2014/09/13 职场文书
2014乡镇党政班子四风问题思想汇报
2014/09/14 职场文书
幼儿园迎新生欢迎词
2015/09/30 职场文书
MySQL系列之一 MariaDB-server安装
2021/07/02 MySQL