Python迭代器与生成器用法实例分析


Posted in Python onJuly 09, 2018

本文实例讲述了Python迭代器与生成器用法。分享给大家供大家参考,具体如下:

迭代器,迭代的工具

什么是迭代器?

指的是一个重复的过程,每一次重复称为一次迭代,并且每一次重复的结果是下一次重复的初始值

l=['a','b','c']
count=0
while count <len(l):
  print(l[count])
  count+=1

为什么要有迭代器

1、对于序列类型:str,list,tuple,可以依赖索引来迭代取值
2、对于dict,set,文件,python必须为我们提供一种不依赖于索引的迭代取值的方式—>迭代器

可迭代的对象

对象内置函数带有iter的都称为可迭代的对象

str   name='lqx' name.__iter__
list  l=[1,2,3]  l.__iter__
tuple  t=(1,2,3)  t.__iter__
dict  d={'name':'lqx','age':18,'sex':'male'} d.__iter__
set   s={'a','b','c'} s.__iter__
file  f=open('a.txt','w',encoding='utf-8')  f.__iter__

迭代器对象

文件即是可迭代对象,也是迭代器对象

f.__iter__
f.__next__

迭代器总结

1、可迭代对象不一定是迭代器对象
2、迭代器对象一定是可迭代的对象
3、调用obj.iter()方式,得到的是迭代器对象(对于迭代器对象,执行iter得打的仍然是它本身)

d={'name':'egon','age':18,'sex':'male'}
d_iter=d.__iter__() #使用iter之后,生成的d_iter是迭代器
print(d_iter,type(d_iter))
print(d_iter.__next__()) #next的俩种使用方式
print(next(d_iter))
print(next(d_iter))
print(next(d_iter)) #迭代器d_iter没有值的时候,会抛出异常:StopIteration
print(next(d_iter))

如何去除next取不到中导致StopIteration异常

#下面是如何去除StopIteration异常
while True:
  try:   #使用try:去除异常
    print(next(d_iter))
  except StopIteration: #去除异常StopIteration
    break

for循环详解:

1、调用in后面的obj_iter=obj.iter()
2、k=obj_iter.next()
3、捕捉stopiteration异常,结束迭代

d={'name':'lqx','age':19,'sex':'male'}
for k in d:
  print(k)

迭代器优缺点总结

优点:

1、提供一种统一的、不依赖与索引的取值方式,为for循环提供了依据
2、迭代器同一时间在内存中只有一个值—>更节省内存空间

缺点:

1、只能往后取,并且是一次性的
2、不能统计值的个数,即长度

l=[1,2,3,4,5]
l_iter=l.__iter__()
print(next(l_iter))
print(next(l_iter))
print(next(l_iter))
print(len(l_iter))  #TypeError: object of type 'list_iterator' has no len()

生成器,就是生成迭代器

什么是生成器

只要在函数体内出现yield关键字,那么再执行函数就不会执行函数代码,会得到一个结果,该结果就是生成器

def func():
  print('---->1')
  yield 1
  print('---->2')
  yield 2
  print('---->3')
  yield 3
a=func()
print(next(a)) #next(a),会执行到第一个yield结束,返回结果是yield后面的返回值
next(a)
next(a)

生成器就是迭代器

g=func()
res1=next(g)
print(res1)
res2=next(g)
print(res2)
res3=next(g)
print(res3)
>>>
---->1
1
---->2
2
---->3

yield的功能

yield为我们提供了一种自定义迭代器对象的方法

yield与return的区别:

1、yield可以返回多次值
2、函数暂停与再继续的状态是由yield帮我们保存的
3、yield在函数中也就是暂停的意思,并且返回yield后面的值

obj=range(1,1000000000000,2)
obj_iter=obj.__iter__()
print(next(obj_iter))
print(next(obj_iter))
print(next(obj_iter))
print(next(obj_iter))

制作一个range内置函数:

#制作一个range函数
def range_it(start,stop,step=1):
  while stop > start:
    yield start
    start=start + step
for i in range_it(1,20,2):
  print(i)

制作一个类似于linux中管道的小程序

import time
# 小练习::tail -f access.log | grep '404'
def tail(filepath): #检测是否有新的写入信息,如果有一条就给yield,作为函数的返回结果。
  with open(filepath,'rb') as f:
    f.seek(0,2)
    while True:
      line=f.readline()
      if line:
        yield line
      else:
        time.sleep(0.05)
def grep(lines,pattern): #传入tail检测到新增加的行,然后打印出来这一行并赋值给line,再做判断404,在就使用yield返回这一行
  for line in lines:
    # print(line)
    line=line.decode('utf-8')
    if pattern in line:
      yield line
lines=grep(tail('a.txt'),'404') #grep()函数执行的结果返回的yield的值,给他赋值,
for line in lines:    #使用for去循环取出lines中的值
  print(line)

生成器了解知识点:yield表达式的用法

生成器使用yield表达式,就是给yield初始化下,然后给他传任意值
这里需要先给yield传入一个None的值

e.send:

1、从暂停的位置将值传给yield
2、与next一样

def eater(name):
  print('%s ready to eat' %name)
  food_list=[]
  while True:
    food=yield food_list
    food_list.append(food)
    print('%s start to eat %s' %(name,food))
e=eater('alex')
#首先要做一个初始化的操作:也就是必须要先给yield传入一个None的值。
print(e.send(None)) #next(e)
print(e.send('一桶水')) #给yield赋值一次,然后会执行下面的代码,然后循环到下一个yield停止
print(e.send('一盘骨头'))

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python批量生成本地ip地址的方法
Mar 23 Python
python单例模式实例分析
Apr 08 Python
python批量制作雷达图的实现方法
Jul 26 Python
Django查询数据库的性能优化示例代码
Sep 24 Python
pygame游戏之旅 添加游戏界面按键图形
Nov 20 Python
PyQt5内嵌浏览器注入JavaScript脚本实现自动化操作的代码实例
Feb 13 Python
python批量处理txt文件的实例代码
Jan 13 Python
Python3操作MongoDB增册改查等方法详解
Feb 10 Python
python判断变量是否为int、字符串、列表、元组、字典的方法详解
Feb 13 Python
Python高阶函数与装饰器函数的深入讲解
Nov 10 Python
python 读取yaml文件的两种方法(在unittest中使用)
Dec 01 Python
Jmeter调用Python脚本实现参数互相传递的实现
Jan 22 Python
numpy的文件存储.npy .npz 文件详解
Jul 09 #Python
Python实现聊天机器人的示例代码
Jul 09 #Python
Atom的python插件和常用插件说明
Jul 08 #Python
Python中pip更新和三方插件安装说明
Jul 08 #Python
python中sys.argv函数精简概括
Jul 08 #Python
python输出100以内的质数与合数实例代码
Jul 08 #Python
详解Python中的正则表达式
Jul 08 #Python
You might like
PHP程序员编程注意事项
2008/04/10 PHP
php中拷贝构造函数、赋值运算符重载
2012/07/25 PHP
解析用PHP实现var_export的详细介绍
2013/06/20 PHP
PHP 字符串长度判断效率更高的方法
2014/03/02 PHP
开源php中文分词系统SCWS安装和使用实例
2014/04/11 PHP
php实现的zip文件内容比较类
2014/09/24 PHP
PHP使用pear自带的mail类库发邮件的方法
2015/07/08 PHP
PHP中each与list用法分析
2016/01/08 PHP
php使用timthumb生成缩略图的方法
2016/01/22 PHP
js 数组克隆方法 小结
2010/03/20 Javascript
jQuery插件slides实现无缝轮播图特效
2015/04/17 Javascript
解析Node.js异常处理中domain模块的使用方法
2016/02/16 Javascript
使用bootstrap-paginator.js 分页来进行ajax 异步分页请求示例
2017/03/09 Javascript
基于JavaScript实现多级菜单效果
2017/07/25 Javascript
React中使用collections时key的重要性详解
2017/08/07 Javascript
浅谈sass在vue注意的地方
2017/08/10 Javascript
使用vue-aplayer插件时出现的问题的解决
2018/03/02 Javascript
微信小程序实现顶部导航特效
2019/01/28 Javascript
详解小程序退出页面时清除定时器
2019/04/28 Javascript
jQuery利用cookie 实现本地收藏功能(不重复无需多次命名)
2019/11/07 jQuery
js验证账户名是否重复
2020/05/26 Javascript
Javascript柯里化实现原理及作用解析
2020/10/22 Javascript
JavaScript实现鼠标移入随机变换颜色
2020/11/24 Javascript
Python逐行读取文件中内容的简单方法
2019/02/26 Python
python实现可逆简单的加密算法
2019/03/22 Python
Mio Skincare法国官网:身体紧致及孕期身体护理
2018/04/04 全球购物
酒吧总经理岗位职责
2013/12/10 职场文书
护理专业毕业生自我鉴定总结
2014/03/24 职场文书
医学求职信
2014/05/28 职场文书
公司委托书范本5篇
2014/09/20 职场文书
领导班子“四风问题”“整改方案
2014/10/02 职场文书
光棍节联谊晚会活动策划书
2014/10/10 职场文书
人事局接收函
2015/01/31 职场文书
副总经理岗位职责范本
2015/04/08 职场文书
昆虫记读书笔记
2015/06/26 职场文书
Python中Schedule模块使用详解 周期任务神器
2022/04/19 Python