初识生成器
只要函数中有yield的,就是生成器函数,(生成器函数只是生成可迭代的对象).
yield的特性:
1.和return差不多,都可以做返回值.
2.只要在函数执行的过程中遇到了yield,就会暂停这个函数的运行,并返回yield后面值
3.下次再执行这个函数就会从上一次暂停的地方重新往下执行
# def outer():
# print("马云")
# yield '阿里巴巴'
# print('马化腾')
# yield '腾讯'
# print('刘强东')
# yield '京东'
# ger = outer()
# print(ger) # 生成的是一个生成器
# <generator object outer at 0x0000000002761F10>
如何使用这个生成器
生成器是生成一个可迭代的对象,之前的list,str,dict等都是可迭代的对象,方法一致.
2.1 方法一
# r1 = ger.__next__() # 执行"__next__"是打印第一个yield之前的内容,r1接受的是第一个yield的返回值
# print(r1)
# 结果:
# 马云
# 阿里巴巴
# 每一次执行生成器的"__next__"就是执行到下一个yield的出现
# r2 = ger.__next__()
# print(r2)
# 结果:
# 马云
# 阿里巴巴
# 马化腾
# 腾讯
2.2 方法二
def outer():
print("马云")
yield '阿里巴巴'
print('马化腾')
yield '腾讯'
print('刘强东')
yield '京东'
ger = outer() # 这就是生成器函数"outer"的迭代器
for i in ger: #只要是可迭代的对象,for循环都可以进行迭代,迭代器既是可迭代对象,也是迭代器,所以可以使用for循环
print(i)
# 结果:
# 马云
# 阿里巴巴
# 马化腾
# 腾讯
# 刘强东
# 京东
2.3 方法三
def outer():
print("马云")
yield '阿里巴巴'
print('马化腾')
yield '腾讯'
print('刘强东')
yield '京东'
ger = outer()
print(list(ger)) # 把yield的返回值放进一个列表,并以此执行函数里的代码
send使用
def outer():
print("马云")
a = yield '阿里巴巴'
print('我是a',a)
print('马化腾')
b = yield '腾讯'
print('我是b',b)
print('刘强东')
yield '京东'
ger = outer()
ger.__next__()
ger.send("a")
ger.send("b")
# 结果:
# 马云
# 我是a a
# 马化腾
# 我是b b
# 刘强东
send的执行过程
3.2 __next__() 和 .send() 的区别,和注意事项
1.send和next都是让生成器往下在执行一个yield.
2.send可以上一个yield的位置传递一个值,不能给最后一个yield传递值,因为yield是给上一个yield传递一个值,所以第一次访问生成器,不能是send,只能是__next__()
生成器表达式
# 生成器表达式
# gen = (n for n in range(1,6))
# print(gen) # gen是一个迭代器.迭代器需要使用"__next__"或迭代,来访问生成器里面的代码.
# 结果:<generator object <genexpr> at 0x00000000028120A0>