一 什么是迭代
1 重复
2 下一次重复是基于上一次的结果
  1. # while True:
  2. # cmd=input('>>: ')
  3. # print(cmd)
  4.  
  5. # l=['a','b','c','d']
  6. # count=0
  7. # while count < len(l):
  8. # print(l[count])
  9. # count+=1
  10.  
  11. #
  12. # l=['a','b','c','d']
  13. # for count in range(len(l)):
  14. # print(l[count])
  15.  
  16. # d={'a':1,'b':2,'c':3}
  17. #
  18. # for k in d:
  19. # print(k)

python为了提供一种不依赖于索引的迭代方式,
python会为一些对象内置__iter__方法
obj.__iter__称为可迭代的对象

二 可迭代对象:obj.__iter__
三 迭代器:iter1=obj.__iter__()
1 iter1.__next__
2 iter1.__iter__ 
iter1.__next__()

迭代器的优点
1:提供了一种不依赖于索引的取值方式
2:惰性计算。节省内存

迭代器的缺点:
1:取值不如按照索引取值方便
2:一次性的。只能往后走不能往前退
3:无法获取长度

  1. l=[1,2,3]
  2. for item in l: #i=l.__iter__()
  3. print(item)
  1. l=['x','y','z']
  2. # print(l[2])
  3. # print(l[0])
  4.  
  5. # i=l.__iter__()
  6. # print(i.__next__())
  7. # print(i.__next__())
  8. # print(i.__next__())

  

  1. #得到的迭代器:既有__iter__又有一个__next__方法
  2. # d={'a':1,'b':2,'c':3}
  3. #
  4. # i=d.__iter__() #i叫迭代器
  5. # print(i)
  6. # print(i.__next__())
  7. # print(i.__next__())
  8. # print(i.__next__())
  9. # print(i.__next__()) #StopIteration

  

  

iterator判断是否为迭代器对象
iterabl判断是否为可迭代对象
迭代对象需要.__iter__()转换成迭代器,才能迭代
迭代器对象可以直接迭代
迭代器的应用:
1 提供了一种不依赖索引的统一的迭代方法
2 惰性计算,比如取文件的每一行
 
四、生成器
1、生成器函数:函数体内包含有yield关键字,该函数执行的结果是生成器

  1. def foo():
  2. print('first------>')
  3. yield 1
  4. print('second----->')
  5. yield 2
  6. print('third----->')
  7. yield 3
  8. print('fouth----->')
  9.  
  10. g=foo()

2、生成器就是迭代器

 

  1. # print(g.__next__())
  2. # print(g.__next__())
  3. # print(g.__next__())
  4. # print(g.__next__())
  5.  
  6. # for i in g: #obj=g.__iter__() #obj.__next__()
  7. # print(i)

3、

yield的功能:
1.与return类似,都可以返回值,但不一样的地方在于yield返回多次值,而return只能返回一次值
2.为函数封装好了__iter__和__next__方法,把函数的执行结果做成了迭代器
3.遵循迭代器的取值方式obj.__next__(),触发的函数的执行,函数暂停与再继续的状态都是由yield保存的

  1. def countdown(n):
  2. print('starting countdown')
  3.  
  4. while n > 0:
  5. yield n
  6. n-=1
  7. print('stop countdown')
  8. g=countdown(5)
  9. # print(g)
  10. # print(g.__next__())
  11. # print(g.__next__())
  12. # print(g.__next__())
  13. # print(g.__next__())
  14. # print(g.__next__())
  15. # print(g.__next__())
  16.  
  17. #
  18. # for i in g:
  19. # print(i)

例题:

  1. #1 编写 tail -f a.txt |grep 'error' |grep '404'命令
  2. import time
  3. def tail(filepath,encoding='utf-8'):
  4. with open(filepath,encoding=encoding) as f:
  5. f.seek(0,2)
  6. while True:
  7. line=f.readline()
  8. if line:
  9. yield line
  10. else:
  11. time.sleep(0.5)
  12.  
  13. def grep(lines,pattern):
  14. for line in lines:
  15. if pattern in line:
  16. #print(line)
  17. yield line
  18.  
  19. g1=tail('a.txt')
  20. g2=grep(g1,'error')
  21. g3=grep(g2,'404')
  22. for i in g3:
  23. print(i)

总结:

1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退)

2.可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法)

3.协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象。

4.for循环的本质:循环所有对象,全都是使用迭代器协议。

5.(字符串,列表,元组,字典,集合,文件对象)这些都不是可迭代对象,只不过在for循环式,调用了他们内部的__iter__方法,把他们变成了可迭代对象

然后for循环调用可迭代对象的__next__方法去取值,而且for循环会捕捉StopIteration异常,以终止迭代

6.生成器:可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己内置的__iter__方法),所以生成器就是可迭代对象

7.可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己内置的__iter__方法),所以生成器就是可迭代对象

8.为何使用生成器之生成器的优点

Python使用生成器对延迟操作提供了支持。所谓延迟操作,是指在需要的时候才产生结果,而不是立即产生结果。这也是生成器的主要好处。

9.生成器小结:

1).是可迭代对象

2).实现了延迟计算,省内存啊

3).生成器本质和其他的数据类型一样,都是实现了迭代器协议,只不过生成器附加了一个延迟计算省内存的好处,其余的可迭代对象可没有这点好处

Python基础(8)迭代器、生成器的更多相关文章

  1. python基础6 迭代器 生成器

    可迭代的:内部含有__iter__方法的数据类型叫可迭代的,也叫迭代对象实现了迭代协议的对象 运用dir()方法来测试一个数据类型是不是可迭代的的. 迭代器协议是指:对象需要提供next方法,它要么返 ...

  2. python基础(9)-迭代器&生成器函数&生成器进阶&推导式

    迭代器 可迭代协议和迭代器协议 可迭代协议 只要含有__iter__方法的对象都是可迭代的 迭代器协议 内部含有__next__和__iter__方法的就是迭代器 关系 1.可以被for循环的都是可迭 ...

  3. (转)python基础之迭代器协议和生成器(一)

    一 递归和迭代 二 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前 ...

  4. Python基础(冒泡、生成器、迭代器、列表与字典解析)

    一.冒泡算法 冒泡算法,给定一组数据,从大到小排序或者从小到大排序,就像气泡一样 原理:  相邻的两个对象相比,大的放到后面,交换位置 交换位置通过a,b=b,a来实现 1.我们可以通过for循环来根 ...

  5. Python基础之迭代器和生成器

    阅读目录 楔子 python中的for循环 可迭代协议 迭代器协议 为什么要有for循环 初识生成器 生成器函数 列表推导式和生成器表达式 本章小结 生成器相关的面试题 返回顶部 楔子 假如我现在有一 ...

  6. python基础之 迭代器回顾,生成器,推导式

    1.迭代器回顾 可迭代对象:Iterable 可以直接作用于for循环的对象统称为可迭代对象:Iterable.因为可迭代对象里面存在可迭代协议,所以才会被迭代 可迭代对象包括: 列表(list) 元 ...

  7. 7th,Python基础4——迭代器、生成器、装饰器、Json&pickle数据序列化、软件目录结构规范

    1.列表生成式,迭代器&生成器 要求把列表[0,1,2,3,4,5,6,7,8,9]里面的每个值都加1,如何实现? 匿名函数实现: a = map(lambda x:x+1, a) for i ...

  8. python基础之迭代器协议和生成器

    迭代器和生成器补充:http://www.cnblogs.com/luchuangao/p/6847081.html 一 递归和迭代 略 二 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个ne ...

  9. python基础8 -----迭代器和生成器

    迭代器和生成器 一.迭代器 1.迭代器协议指的是对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2. ...

  10. Python基础4 迭代器,生成器,装饰器,Json和pickle 数据序列化

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...

随机推荐

  1. win10 无法修改默认程序 默认打开方式的解决方法

    此时是2018年11月24日 win10 pro 64位 版本是1803  具体版本号是17134 情景: 我的状况是.json文件的默认打开方式被新安装的应用霸占了,然后无论是通过“右键-属性-更改 ...

  2. VI的配置

    vi下设置tab键为4个空格 在每个用户的主目录下,都有一个 vi 的配置文件".vimrc"或".exrc",没有的可以新建一个.用户可以编辑它,使这些设置在 ...

  3. 【廖雪峰老师python教程】day1

    主要内容摘要 函数参数[个人感觉难度很大,却很重要,可以先大概记一记]不要用的太复杂.戳这儿温习 递归函数:使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出.重点:找到递归关系和终止条件 ...

  4. TortoiseSVN的安装使用

    下面分享一篇关于TortoiseSVN的安装以及使用 1.运行TortoiseSVN-1.6.6.17493-win32-svn-1.6.6.msi程序, 开始安装 2.点击Next, 下一步 3.选 ...

  5. url解读

    我刚刚学习的时候,我抓到包不知道哪个是协议.哪个是是服务器地址.哪个是端口号...不知道有没有老铁遇到跟我一样的. 接口:http://172.168.12.0:8888/old/login.do 解 ...

  6. 第十七篇 Python函数之闭包与装饰器

    一. 装饰器 装饰器:可以拆解来看,器本质就是函数,装饰就是修饰的意思,所以装饰器的功能就是为其他函数添加附加功能. 装饰器的两个原则: 1. 不修改被修饰函数的源代码 2. 不修改被修饰函数的调用方 ...

  7. 移动端webapp如何隐藏浏览器的导航栏

    webapp如何隐藏浏览器的导航栏 在webapp开发中,手机浏览器的导航栏会让我们的页面看起来很怪异,这个时候我们就需要将导航栏给隐藏起来,隐藏的方法十分简单,只需要在head头中加入以下几行代码就 ...

  8. http长连接和短连接以及连接的本职

    HTTP长连接和短连接原理浅析 本文主要讲了,http长连接本质是tcp的长连接. 网络通信过程中,建立连接的本质是什么? 连接的本质 建立连接这个词,是从早期的电话系统中来的,那个时候,“建立连接” ...

  9. P2P(WFD)之RegClass *****************************TBD

    三个Action Frame的IE会有带上RegClass的信息 Listen Channel element, Channel List element, Operation Channel ele ...

  10. 【python】time 和datetime类型转换,字符串型变量转成日期型变量

    s1='20120125';   6     s2='20120216';   7     a=time.strptime(s1,'%Y%m%d');   8     b=time.strptime( ...