初识生成器
只要函数中有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>