迭代器和生成器

迭代器协议和可迭代协议

可迭代协议:只要含有__iter__方法的都是可迭代的。

可以被迭代要满足的要求就叫做可迭代协议。可迭代协议的定义非常简单,就是内部实现了__iter__方法。

from collections import Iterable     #Iterable  可迭代的
print(isinstance[],Iterator)             # isintance   判读是什么类型

可以被迭代要满足的要求就叫做可迭代协议。可迭代协议的定义非常简单,就是内部实现了__iter__方法。

print(dir([1,2]))
print(dir((2,3)))
print(dir({1:2}))
print(dir({1,2}))
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__',
 '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', 
'__gt__', '__hash__','__iadd__', '__imul__', '__init__', '__iter__', '__le__', 
'__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
 '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__',
 '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index',
 'insert', 'pop', 'remove', 'reverse', 'sort']
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__',
'__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', 
'__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', 
'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__',
 '__str__', '__subclasshook__', 'count', 'index']
['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', 
'__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__',
 '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
 '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 
'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
['__and__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__',
 '__ge__', '__getattribute__', '__gt__', '__hash__', '__iand__', '__init__', '__ior__', '__isub__', 
'__iter__', '__ixor__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', 
'__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', 
'__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'add', 'clear', 'copy', 
'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint',
'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference',
'symmetric_difference_update', 'union', 'update']

可迭代的概念:

1.可以被for循环的都是可迭代的

2.只要是迭代器一定 可迭代

3.可迭代的.__iter__()方法就可以得到一个迭代器

迭代器协议:内部含有__next__和__iter__方法的就是迭代器。

判断是否是迭代器

1.iterator

2.可迭代对象

3.直接给你内存地址

4.for

  只有是可迭代对象的时候,才能用for

  当我们遇到一个新的变量,不确定能不能for循环的时候,就判断它是否可迭代。

迭代器的好处:

1.从容器类型中一个一个的取值,会把所有的值都取到。

2.可以节省内存空间。

3.迭代器并不会在内存中再占用一大块内存,而是随着循环每次生成,每次next每次给我一个。

from collections import Iterator   #iterator 迭代器。 
print(isinstance[],Iterator)     #isinstance 判断是什么类型

 for循环内置了一个迭代器。

生成器

生成器函数:执行之后会得到一个生成器作为返回值

生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表。

生成器Generator:

  本质:迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现)。

  特点:惰性运算,开发者自定义。

def generator
    print(1)
    yield 'a'

ret = generator()
print(ret)
print(ret.__next__())


def generator():
    print(1)
    yield 'a'
    print(2)
    yield'b'
g = generator()
ret = g.__next__()     #  这个是读取文件1,'a'
print(ret)
ret = g.__next__()    #在写一个就是读取文件2,'a'
print(ret)     

for i in g:     #这个是直接打印出两个结果
    print(i)

生成器的优点:

1.不会一下子在内存中生成太多数据。

2.延迟计算,一次返回一个结果。也就是说,它不会一次生成所有的结果,这对于大数据量处理,将会非常有用。

3.提高代码可读性

def wahaha():
    for i in range(2000000):     #不会在内存中生成太多数据
        yield 'wahaha%s' % i

g = wahaha()
count = 0
for i in g:
    count += 1
    print(i)
    if count > 50:  # 提取到50
        break
for i in g:
    count += 1
    print(i)
    if count > 100:  # 提取到100
        break
print(g.__next__())  # 这个就是从101提取

生成器例子(监听文件例子)

def tail(filename):
    f = open(filename,encoding='utf-8')
    while True:
        line = f.readline()
        if line.strip():
            yield line.strip()

g = tail('file')     
for i in g:            #输入文件会跟着一起读取
    print(i)
for i in g:
    if 'python' in i:       #规定只读取带'python'的文件
        print(i)

 

posted on 2018-01-02 21:18  Kindergarten_Panda  阅读(178)  评论(0编辑  收藏  举报