今日内容:
1.迭代器:
iterable:形容词,可迭代的
from clooections import Iterable (检测一个对象是否可迭代)
"_ _iter_ _":这个方法导致了yield数据类型的可迭代
iter:
只要是包含了“双下划线iter”方法的数据类型就是可迭代的 -- 可迭代协议(数据类型和Python解释器定下来的协议)
print([1,2,3]._ _iter_ _())
iterator: 名词 迭代器
迭代器:就是实现了能从其中一个一个的取出值来
lis_iterator = [1,2,3].__iter__()print(set(dir(lis_iterator)) - set(dir([1,2,3])))
迭代器中有__next__ 和__iter__方法 -- 迭代器协议
lis_iterator = [1,2,3].__iter__()from collections import Iteratorprint(isinstance(lis_iterator,Iterator))print(isinstance([1,2,3],Iterator))
在Python里 你学过的所有的可以被for循环的 基本数据类型 都是可迭代的 而不是迭代器
可迭代对象:
可迭代协议:含有__iter__方法的对象
from collections import Iterator
print(isinstance(要检测的对象, Iterator))
迭代器和可迭代对象之间的关系:
迭代器包含可迭代对象
迭代器 = 可迭代对象.__iter__()
可迭代对象 并不能用
迭代器 -- 它不关心值的索引状态
lst_iterator = [1,2,3].__iter__()print(lst_iterator.__next__())print(lst_iterator.__next__())print(lst_iterator.__next__())while True: try: print(lst_iterator.__next__()) except StopIteration: break
for 可以是一个可迭代对象 也可以是一个迭代器
为什么要有迭代器 迭代器存在的本质是什么?
1.能够对Python中的基本数据类型进行统一遍历,不需要关心每一个值分别是什么
2.它可以节省内存 -- 惰性运算
f = open("file","w") 文件句柄就是一个迭代器
range(1000).__iter__() range就是一个可迭代对象
for:
1.天生的,比如文件句柄
2.后天的,可迭代对象.__iter__()
生成器:
Iterator:迭代器
Gerator:生成器
生成器就是迭代器,生成器是我们自己写的
生成器函数
生成器表达式
def generator_func(): # 生成器函数 print(123) yield 'aaa' # 相当于return print(456) yield 'cccc'g = generator_func()print(g.__next__())print(g.__next__())
带yield关键字的函数就是生成器函数
生成器函数在执行的时候返回一个生成器,不执行生成器函数中的内容
从生成器中取值:
1.__next__ 有记过yield就可以取几次
2.for循环取值 正常取 for i in g:
3.其他数据类型进行强制转换list(g)返回一个列表,里边装着生成器的所有内容
注意:调用生成器函数的时候,要先获取生成器,在进行next取值
生成器中的内容只能取一次,且按顺序取值没有回头路,取完为止。
def generator(): yield yield 2g = generator()for i in g: print(i)print(list(g))g1 = generator()g2 = generator()for i in generator(): print(i)print(list(generator()))
def get_clothing(): for cloth in range(1,2000000): yield '第%s件衣服'%clothgenerate = get_clothing()print(get_clothing().__next__())for i in range(50): print(generate.__next__())for i in get_clothing(): print(i) if i == '第100件衣服': break
#yield fromdef func2(): yield from [1,2,3] yield from 'ABC'g = func2()for i in g: print(i)
总结:
可迭代对象 内部有__iter__ 迭代器 内部有__itre__ __next__ 生成器 -- 就是迭代器 自己写的迭代器 生成器函数 yield/yield from