迭代器
1,什么是迭代?
逐个获取数据的过程叫迭代
2,什么时可迭代对象?
可迭代对象是可以被遍历的对象,比如字符串,列表,元组,集合,字典等等
3,什么是迭代器?
支持next操作的对象
class Numbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
x = self.a
self.a += 1
return x
cla = iter(Numbers())
for i in range(10):
print(next(cla))
特性:
不可以获取长度len()会报错,内部有两个方法。
一个是__iter__:他的作用是返回一个可迭代对象
一个是__next__:他的作用是根据逻辑返回下一个元素
4,如何创建迭代器
a = iter(可迭代对象)
print(next(a))
print(next(a))
print(next(a))
print(next(a))
5,使用场景
生成器
1,什么是生成器?
生成器是一个特殊的迭代器,他里边有一个yield参数,它可以记录函数执行到的位置,并且下一次可以继续接着这次的位置继续执行
2,如何创建生成器?
利用yeild关键字
def li(n):
for i in range(n):
yield i*i
a = li(5)
# for i in a:
# print(i)
print(next(a))
print(next(a))
print(next(a))
print(next(a))
使用括号和列表生成式
a = (i*i for i in range(5))
# for i in a:
# print(i)
print(next(a))
print(next(a))
print(next(a))
print(next(a))
使用场景
1,可控文本读取,当需要读取文本内容过大时可以使用生成器来读取文本。
def read_file(path):
BLOCK_SIZE = 1024
with open(path, 'rb') as f:
while True:
block = f.read(BLOCK_SIZE)
if block:
yield block
else:
return
2,协程
def task1(times):
for i in range(times):
print('task1 done the :{} time'.format(i+1))
yield
def task2(times):
for i in range(times):
print('task2 done the :{} time'.format(i+1))
yield
gene1=task1(5)
gene2=task2(5)
for i in range(100):
next(gene1)
next(gene2)