迭代器生成器
迭代器Iterator
1.可迭代对象 iterable 形容词 可迭代的
-1.from collections import Iterable #检测一个对象是否可迭代
print(isinstance('aaa',Iterable))
print(isinstance(123,Iterable))
print(isinstance([1,2,3],Iterable))
- 2.含有__iter__方法的对象
#只要包含了“双下iter”方法的数据类型就是可迭代的 —— 可迭代协议
#数据类型和python解释器定下来的协议
# print([1,2,3].__iter__()) #打印出内存地址
2.迭代器 iterator 名词 迭代器
-1.迭代器 就是实现了从可迭代对象中一个一个的取值出来
-2.含有__itre__和__next__方法的对象
-3.检测是否是迭代器
from collections import Iterator
lst_iterator = [1,2,3].__iter__()
print(isinstance(lst_iterator,Iterator))
print(isinstance([1,2,3],Iterator))
- 4.在python里 你学过的所有的可以被for循环的 基本数据类型 都是可迭代的 而不是迭代器
3.可迭代对象和迭代器的关系
迭代器和可迭代对象之间的关系
-迭代器包含可迭代对象
-迭代器 = 可迭代对象.__iter__()
-可迭代对象 并不能用
-迭代器 #他不关心值得索引状态
4.捕捉异常,try except
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
5.for循环对象可以是一个可迭代对象,也可以是一个迭代器
6.为什么要有迭代器,迭代器存在的本质是什么
-1.能够对python中的基本数据类型进行统一的遍历,不需要关心每一个值分别是什么
-2.它可以节省内存 —— 惰性运算
-f = open('file','w') #文件句柄就是一个迭代器
-range(10000000).__iter__() #range就是一个可迭代的对象
生成器Gerator
1.生成器就是迭代器,使我们自己写出来的
-生成器函数
-生成器表达式 :yield
2.生成器定义
- 带yield关键字的函数就是生成器函数
- 生成器函数在执行的时候只返回一个生成器,不执行生成器函数中的内容
- 从生成器中取值
- 1.__next__ 有几个yield就可以取几次
- 2.for循环取值 正常取 for i in g:
- 3.其他数据类型进行强制转换 list(g) 返回一个列表,里面装着生成器中的所有内容
- 注意:调用生成器函数的时候,要先获取生成器,再进行next取值
- 生成器中的内容只能取一次,且按顺序取值没有回头路,取完为止。
3.生成器实例:监视文件写入
import time
def tail(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 #如果不为空有写入内容就返回这一行
tail_g = tail('demo')
for line in tail_g:
print(line,end='')
4.yield from
# def func():
# for i in [1,2,3]:
# yield i
# for j in 'ABC':
# yield j
def func2():
yield from [1,2,3] #和for循环一样,每次拿出一个值返回
yield from 'ABC'
g = func2()
for i in g:
print(i)
5.生成器示例
def get_clothing():
for cloth in range(1,2000000):
yield '第%s件衣服'%cloth
generate = get_clothing()
print(generate.__next__())
print(generate.__next__())
print(generate.__next__())
for i in range(50): #取50个
print(generate.__next__())
for i in get_clothing(): #控制取出的数量
print(i)
if i == '第100件衣服':
break
def generator_func(): #生成器函数
print(123)
yield 'aaa' #return
print(456)
yield 'bbb'
g = generator_func()
print(g.__next__) #123 aaa
print(g.__next__) #456 bbb
注意出错点
def get_clothing():
for cloth in range(1,2000000):
yield '第%s件衣服'%cloth
print(get_clothing().__next__()) #第一件衣服
print(get_clothing().__next__()) #第一件衣服
print(get_clothing().__next__()) #第一件衣服
- 每一次__next__(),都是调用一个新的生成器
- 所有要给生成器赋值来使用 g = get_clothing()
既然选择了远方,便是风雨兼程...