可迭代对象(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库,大魔王同名库,好记又好用,提供随机生成姓名、手机号、邮箱等信息;

使用指南:http://testingpai.com/article/1615615023407