''' 生成器:函数中有yield就是生成器函数 生成器本质是一个迭代器 yield后面的值会作为返回值返回. ''' def func(): print("apple") yield 1 print("banana") yield 3 print("orange") yield 2 g = func() #创建一个生成器对象,本质是一个迭代器 print(g.__next__()) print(next(g)) print(g.__next__()) # print(g.__next__()) #StopIteration
返回结果:
apple
1
banana
3
orange
2
'''yield在循环体内''' def func(n): print("start...") count = 0 while count < n: count += 1 yield count print("end...") g = func(5) for i in g: #for循环本质就是next下一个元素 print(i)
返回结果:
start...
1
2
3
4
5
end...
'''注意区分send()给上一个yield位置传递一个值,yield是向外返回一个值''' def func(): print("apple") y1 = yield 2 print(y1, " = banana") y2 = yield 1 print(y2, " = orange") y3 = yield 3 print(y3) g = func() print(g.__next__()) print(next(g)) print(g.send("big"))
返回结果:
apple
2
None = banana
1
big = orange
3
'''生成器表达式(结果 for循环 if语句)''' # lst = [i*i for i in range(5)] # print(lst) #列表生成式,直接生成一个列表,下面把中括号换为小括号,就是一个生成器 # g = (i*i for i in range(5)) # print(g) #生成器对象,省内存 # print(next(g)) # print(next(g)) # print(next(g)) # print(next(g)) # print(next(g)) # print(next(g)) #StopIteration ''' 一个面试题,难度系数50000000000颗星 ''' # def add(a, b): # return a + b # # def test(): # for r_i in range(4): # yield r_i # # g = test() #g是一个生成器,也是一个迭代器 # # for n in [2, 10]: # g = (add(n, i) for i in g) # # print(list(g)) ''' 分析,当n=2时, g = (add(n, i) for i in g) 右边是一个生成器表达式, g就是一个生成器 当n=10时, g = (add(n, i) for i in (add(n, i) for i in g)) 右边是一个生成器表达式, g就是一个生成器 当程序执行到list(g)时,开始取生成器里的值 当n=10时,g = (add(10, i) for i in (add(10, i) for i in g)) g = (add(10, i) for i in (10, 11, 12, 13)) g = (20, 21, 22, 23) 所以打印出来的值就是[20, 21, 22, 23] '''