python笔记(生成器进阶)

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]
[]

扫描二维码关注公众号,回复: 3834932 查看本文章

题二
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]

猜你喜欢

转载自blog.csdn.net/qq_41433183/article/details/83474811