七星白树

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

day14笔记

迭代器

  一、可迭代的

    字符串、列表、元祖、字典、集合、文件句柄、文件操作符、range;以上这些都是可迭代的

    判断一个对象是否是可迭代的可以用下面方法:      

      
1 from collections import Iterable
2 
3 print(isinstance('aaa',Iterable))
4 print(isinstance(123,Iterable))
5 print(isinstance([1,2,3],Iterable))
View Code

      isinstance()括号里第一个就是你要判断的对象

    所有可迭代对象都存在__iter__这个方法,所以说这个方法导致数据类型是可迭代的

    可迭代协议(数据类型与python解释器之间):只要包含了__iter__方法的数据类型就是可迭代的。

    

  二、迭代器

    迭代器和可迭代对象之间的关系

      1.迭代器=可迭代对象.__iter__()     

       
1 lst_iterator = [1,2,3].__iter__()       #列表为可迭代对象,使用.__iter__方法变为迭代器    
2 
3 print(lst_iterator.__next__())           #迭代器使用.__next__方法
4 print(lst_iterator.__next__())
5 print(lst_iterator.__next__())    
View Code

      可迭代对象里有几个元素,.__next__()就可以使用几次,超过就会报错

      2.迭代器包含于可迭代对象

    迭代器协议:含有__iter__()和__next__()方法的对象就是迭代器

    判断是否为迭代器可以使用下面的方法     

      
1 from collections import Iterator
2 
3 print(isinstance("aaa",Iterator))
View Code

    迭代器能够对python中的基本数据类型进行统一的遍历,不需要关心每一个值分别是什么

      
1 lst_iterator=[1,2,3].__iter__()
2 print(lst_iterator.__next__())        #1 
3 print(lst_iterator.__next__())        #2
4 print(lst_iterator.__next__())        #3
View Code

    节省内存(惰性运算)

    迭代器有两种

      1.本来就是,例如文件句柄

      2.可迭代对象.__iter__()

 

  三、生成器

    1.带yield关键字的函数就是生成器函数

    2.生成器函数在执行时只返回一个生成器,不会执行函数里的内容

    
1 def generator_func():
2     print("welcom")
3     yield qxbs
4 
5 g=generator_func            #返回一个生成器,并不执行函数内容
6 print(g)
7 ret=g.__next__()            #执行函数内容,有几个yield就可以对应几个.__next__()
8 print(ret)                
View Code

    3.从生成器中取值

      1.函数中有几个yield就可以用.__next__取值几次

      2.for循环取值

      
 1 def get_clothing():
 2     for cloth in range(1,200):
 3         yield "第%s件衣服" %cloth
 4 
 5 generate=get_clothing()
 6 
 7 print(generate.__next__())
 8 print(generate.__next__())
 9 for i in range(50):
10     print(generate.__next__())
View Code

      3.其它数据类型进行强转

      4.注意,在调用生成器函数时,先获取生成器,再进行.__next__取值

      5.生成器中的内容只能取一次,按顺序取值,取完为止

 

    生成器实例:文件监控  

      
 1 import time
 2 def tail(name):
 3     f=open(name,encoding="utf-8")            #打开要监控的文件
 4     f.seek(0,2)                                           #将光标移动到最后
 5     while True:
 6         line=f.readline()
 7         if not line:                                        #判断最后一行是否有内容
 8             time.sleep(0.1)
 9             continue
10         yield  line                                          
11 
12 tail_g=tail("file")
13 for line in tail_g:
14     print(line)                    
View Code

 

 

    

     

posted on 2017-09-04 17:00  七星白树  阅读(34)  评论(0)    收藏  举报