1.什么是生成器
生成器是一种特殊的迭代器
2.案例
常见的生成器: --- 元组推导式
data = (i for i in range(10))
print(type(data))
3.迭代协议与自定义得迭代器
原型了解即可
class Cycle:
def __init__(self, elem, n):
self.elem = elem
self.n = n
def __iter__(self):
elem = self.elem
n = self.n
class CycleInter:
def __init__(self):
self.count = 0
def __next__(self):
if self.count < n:
self.count = 1
return elem
else:
raise StopIteration
def __iter__(self):
return self
return CycleInter()
自己实现迭代器那么首先得写迭代协议
class TesIter:
"""
自定义迭代器
"""
def __init__(self, li):
self.li = li
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index < len(self.li):
data = self.li[self.index]
self.index += 1
return data
else:
raise StopIteration
a = TesIter([1, 2, 3, 4, 5, 'hha'])
print(type(a))
print(next(a))
print(next(a))
print(next(a))
print(next(a))
print(next(a))
print(next(a))
4.生成器与yield
生成器很重要的就是yield
"""
特征:
类似函数逻辑
支持显式的暂停与恢复
隐性的支持迭代协议
yeild一个对象
返回这个对象
暂停这个函数
等待下一次next的激活调用
"""
def demo():
print('第一次执行')
yield 1
print('第二次执行')
yield 2
s = demo()
v1 = next(s)
print(v1)
v2 = next(s)
print(v2)
def cycle(elem):
count = 0
n = len(elem)
while True:
if count < n:
data = elem[count]
count += 1
yield data
else:
break
a = cycle('数据')
print(next(a))
print(next(a))