1.send()的用法
def generator():
print(123)
num = yield 1
print(num)
yield 2
g = generator()
ret = g.__next__()
print(ret)
ret = g.send('hello') #send效果和next是一样的,获取下一个值的时候给上一个值的位置传递一个数据
print(ret)
输出结果:
123
1
hello
2
@使用send的注意事项:
(1)第一次使用生成器的时候是用next获取下一个值
(2) 最后一个yield不能接收外部的值
示例:
1.获取移动平均值
def average():
sum = 0
count = 0
avg = 0
while True:
num = yield avg
sum += num
count += 1
avg = sum/count
avg_g = average()
avg_g.__next__()
avg1 = avg_g.send(10)
avg1 = avg_g.send(20)
print(avg1)
2.计算移动平均值__预激协程的装饰器
def init(func):
def inner(*arg,**karg):
g = func(*arg,**karg)
g.__next__()
return g
return inner
@init
def average():
sum = 0
count = 0
avg = 0
while True:
num = yield avg
sum += num
count += 1
avg = sum/count
avg_g = average()
avg1 = avg_g.send(10)
avg1 = avg_g.send(20)
print(avg1)
3.yield from的用法,可以从返回值里一个一个取
def generator():
a = 'ab'
b = '12'
yield from a
yield from b
g = generator()
for i in g:
print(i)
输出结果:
a
b
1
2
4.生成器相关的面试题
题一
def demo():
for i in range(4):
yield i
g = demo()
g1 = (i for i in g)
g2 = (i for i in g1)
print(list(g1))
print(list(g2))#g1已经把值取完了
输出结果:
[0, 1, 2, 3]
[]
题二
def add(n,i):
return n+i
def test():
for i in range(4):
yield i
g = test()
for n in [1,10]:
g = (add(n,i) for i in g)
'''
for n in [1,10]:
g = (add(n,i) for i in g)
相当于=====>>
n = 1
g = (add(n,i) for i in g)
n = 10
g = (add(n,i) for i in (add (n,i) for i in test())) == g = (add(n,i) for i in (add (10,[0,1,2])) ==
g = (add(n,i) for i in 10,11,12,13)
'''
print(list(g))
输出结果:
[20, 21, 22, 23]