可迭代对象(Iterable):实现了能返回迭代器的__iter__方法,或实现了__getitem__方法而且参数是从零开始的索引
迭代器(Iterator):实现了无参数的next方法,返回下一个原色,如果没有元素,则抛出StopIteration异常;并且实现了__iter__方法,返回迭代器本身
生成器(Generator):生成器是带有yield关键字的函数,调用生成器函数时,会返回一个生成器对象
生成器表达式:
generator_ = (i for i in range(10))
print(generator)
执行结果:<generator object <genexpr> at 0x0000028F9DA07C10> # 生成器对象
生成器优势:
①生成器是一种特殊的迭代器,具备迭代器所有的特性
②生成器内部不存储数据,只保存生成数据的计算规则,在存储大量数据的时候,能够节约内存开销
可迭代对象和迭代器的区别:
①实现的协议不同:
可迭代协议
迭代器协议
②迭代器支持使用next进行迭代,可迭代对象不行
生成器创建:
eg:
def work():
print("----work函数----")
yield 999
print("------1--")
yield 888
print('----2------')
yield 777
print('---hello word---')
g = work()
print(next(g))
print(next(g))
print(next(g))
①send方法:生成数据并且可以和生成器内部进行数据交互
eg:
def work():
print("---------开始执行----------")
val1 = yield 'Start'
print("---------1----------:", val1)
val2 = yield 11
print("---------2----------:", val2)
val3 = yield 22
print("---------3----------:", val3)
val4 = yield 33
print("---------4----------:", val4)
g = work()
print('数据:', next(g))
print('数据:', next(g))
r1 = g.send('变量1')
print("数据:", r1)
r2 = g.send('变量2')
print("数据:", r2)
②close方法:关闭生成器
③throw方法:在生成器内部抛出异常
eg:
g.throw(ValueError)
生成器使用案例:
import faker
# 生成(名字 手机 邮箱)数据的生成器
def work():
fk = faker.Faker(locale='zh_CN')
val = yield 'Start'
while True:
if val == 1:
# 生成手机号
val = yield fk.phone_number()
elif val == 2:
# 生成名字
val = yield fk.name()
elif val == 3:
# 生成邮箱
val = yield fk.email()
else:
# 生成包含名字,手机号,邮箱的字典
val = yield {'name': fk.name(), "mobile": fk.phone_number(), "email": fk.email()}
g = work()
next(g)
print(g.send(1))
print(g.send(2))
print(g.send(3))
print(g.send('a'))
附录:
Faker库,大魔王同名库,好记又好用,提供随机生成姓名、手机号、邮箱等信息;