一、迭代器
1、可迭代对象——iterable
(1)判断是否可迭代的方法:
from collections import Iterable print(isinstance('aaa',Iterable) #输出结果:True print(isinstance(123,Iterable) #输出结果:False print(isinstance([1,2,3],Iterable) #输出结果:True
常见的可迭代对象有:字符串、列表、元组、字典、集合、文件句柄、range()
(2)可迭代协议
包含‘__iter__'方法的数据类型就是可迭代的。输出数据类型所有方法的方式如下:
#实例:求出两个不同数据类型的方法的不同 difference=set(dir([1,2,3]))-set(dir(123)) #dir()方法以列表形式列出数据的所有的方法 print(diffenrence)
2、迭代器——iterator
(1)判断迭代器的方法
from collections import Iterator iterator_lst=[1,2,3].__iter__() print(isinstance(itertor_lst,Iterator) #输出结果为:True print(isinstance([1,2,3],Iterator) #输出结果为:False
(2)迭代器协议
迭代器中有'__next__'和'__iter__'方法
(3)常见迭代器
a.先天的:文件句柄;b后天的:从可迭代对象转变,格式为:“可迭代对象.__iter__()”
(4)迭代器取值
lst_iterator=[1,2,3].__iter__() print(lst_iterator.__next__()) #输出结果为:1 print(lst_iterator.__next__()) #输出结果为:2 print(lst_iterator.__next__()) #输出结果为:3 #超过迭代器中的内容就会报错:stopIterator
(5)优点
a.能对python数据类型进行遍历,不关心每一个值;b.可以节省空间:惰性计算
3、二者的区别
(1)可迭代对象包含迭代器;(2)迭代器=可迭代对象.__iter__();(3)可以对可迭代对象和迭代器进行循环
二、生成器
1、定义:生成器就是迭代器,生成器是我们自己写出来的
2、生成器函数:带有关键字yield/yield from的函数就称为生成器函数
(1)生成器函数在执行时候只返回一个生成器,不执行生成器函数中的内容
def generator(): print(123) yield ’aaa‘ g=generator() print(g) #返回结果:生成器地址<generator object generator at 0x0000023F014D3BA0>
(2)从生成器中取值
a.生成器.__next__():生成器函数中有几个yield,就可以取几次
def generator(): print(123) yield 'aaa' print(456) yield 'bbb' g=generator() print(g.__next__()) #输出结果:123 aaa print(g.__next__()) #输出结果:456 bbb def generator(): print(123) yield 'aaa' print(456) yield 'bbb' print(generator().__next__()) #输出结果:123 aaa print(generator().__next__()) #输出结果:123 aaa 注意:前者为创建一个生成器,后者为每次重新创建一个生成器
b.for循环取值
#实例1: def generator(): print(123) yield 'aaa' print(456) yield 'bbb' g=generator() for i in g: print(i)
#实例2: def generator(): for i in range(1,50000): yield i g=generator() for j in g: print(j) if j==555: break
c. list(生成器函数) 返回一个列表,里面装着生成器中的所有内容
def generator(): yield 'aaa' yield 'bbb' g=generator() print(list(g)) #输出结果为:[aaa,bbb]
三、生成器实例
1、yield from实例
def generator(): yield from [1,2,3] yield from 'abc' g=generator() for i in g: print(i)
****************************************等价于*****************************************
def generator(): for i in [1, 2, 3]: yield i for j in 'abc': yield j g = generator() for i in g: print(i)
2、监控文件中写入的内容
import time def generator(filename): f=open(filename,encoding='utf-8') f.seek(0,2) while True: line=f.readline() if not line: time.sleep(0.1) continue yield line g=generator('demo') for line in g: print(line,end='')