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中实现对Timestamp和Datetime及UTC时间之间的转换
Apr 08 Python
python获得一个月有多少天的方法
Jun 04 Python
简析Python的闭包和装饰器
Feb 26 Python
python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
Mar 12 Python
python hash每次调用结果不同的原因
Nov 21 Python
Python AutoCAD 系统设置的实现方法
Apr 01 Python
Python日志:自定义输出字段 json格式输出方式
Apr 27 Python
keras 多gpu并行运行案例
Jun 10 Python
解决pytorch 保存模型遇到的问题
Mar 03 Python
Python如何利用正则表达式爬取网页信息及图片
Apr 17 Python
python学习之panda数据分析核心支持库
May 07 Python
python如何读取和存储dict()与.json格式文件
Jun 25 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中使用gd库实现下载网页中所有图片
2015/05/12 PHP
初学prototype,发个JS接受URL参数的代码
2006/09/25 Javascript
jQuery 学习 几种常用方法
2009/06/11 Javascript
jQuery DOM操作小结与实例
2010/01/07 Javascript
Javascript学习笔记9 prototype封装继承
2010/01/11 Javascript
dojo学习第二天 ajax异步请求之绑定列表
2011/08/29 Javascript
jquery.blockUI.js上传滚动等待效果实现思路及代码
2013/03/18 Javascript
简易js代码实现计算器操作
2013/04/15 Javascript
如何使用jQUery获取选中radio对应的值(一句代码)
2013/06/03 Javascript
使用简洁的jQuery方法实现隔行换色功能
2014/01/02 Javascript
jquery简单的弹出层浮动层代码
2015/04/27 Javascript
jquery实现可点击伸缩与展开的菜单效果代码
2015/08/31 Javascript
仅30行代码实现Javascript中的MVC
2016/02/15 Javascript
Bootstrap基本样式学习笔记之表单(3)
2016/12/07 Javascript
关于jQuery EasyUI 中刷新Tab选项卡后一个页面变形的解决方法
2017/03/02 Javascript
Vue之Watcher源码解析(2)
2017/07/19 Javascript
详解puppeteer使用代理
2018/12/27 Javascript
微信小程序自定义扫码功能界面的实现代码
2020/07/02 Javascript
JS canvas实现画板和签字板功能
2021/02/23 Javascript
Python实现遍历windows所有窗口并输出窗口标题的方法
2015/03/13 Python
Python实现感知器模型、两层神经网络
2017/12/19 Python
python3 requests中使用ip代理池随机生成ip的实例
2018/05/07 Python
Sanic框架Cookies操作示例
2018/07/17 Python
Kali Linux安装ipython2 和 ipython3的方法
2019/07/11 Python
python爬虫请求头设置代码
2020/07/28 Python
HTML5所有标签汇总及标签意义解释
2015/03/12 HTML / CSS
应届大学生求职信
2013/12/01 职场文书
文科毕业生自荐书范文
2014/04/17 职场文书
装饰公司活动策划方案
2014/08/23 职场文书
小学语文复习计划
2015/01/19 职场文书
小学生交通安全寄语
2015/02/27 职场文书
写给老婆的保证书
2015/02/27 职场文书
应急管理工作总结2015
2015/05/04 职场文书
幼儿园小朋友毕业感言
2015/07/30 职场文书
MySQL表的增删改查基础教程
2021/04/07 MySQL
教你漂亮打印Pandas DataFrames和Series
2021/05/29 Python