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

题二

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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值