python基础十二之生成器进阶

  生成器表达式

  (满足条件的元素或其相关的操作 for 元素 in 可迭代对象 if 条件)

g = (i for i in range(10))
for i in g:
    print(i)
egg_lis = ('鸡蛋%s' %i for i in range(10))
print(egg_lis)
for i in egg_lis:
    print(i)

  生成器取值send()

  send效果在获取下一个值的时候和next相似,不同之处可以给上一个yield的位置传数据。

    第一个取值必须要用__next__()来取值不能用send()

    最后一个yield也不能接收外部的数据

def generator():
    print('zxc')
    content = yield 1
    print('==='+content)
    print('zxf')
    yield 2
g = generator()
print(g.__next__())
# print(g.__next__())
print(g.send('good'))

  生成器实例

# 计算移动平均值


def average():
    total = 0
    count = 0
    avg = 0
    while True:
        num = yield avg
        total += num
        count += 1
        avg = total / count
avg_g = average()
avg_g.__next__()
avg1 = avg_g.send(10)
avg2 = avg_g.send(20)
print(avg1, avg2)

  上面的实例中avg_g.__next__()的返回值没有什么意义,只是起到了一个激活生成器的效果。为了方便多个生成器的激活,这里就可以使用预激生成器的装饰器

def init(func):
    def inner(*args, **kwargs):
        ret = func(*args, **kwargs)
        ret.__next__()
        return ret
    return inner


@init
def average():
    total = 0
    count = 0
    avg = 0
    while True:
        num = yield avg
        total += num
        count += 1
        avg = total / count
avg_g = average()
print(avg_g.send(10))
print(avg_g.send(20))

  推导式

  格式:满足条件的元素或其相关的操作 for 元素 in 可迭代对象 if 条件

  各种推导式:生成器(),列表[],字典{},集合{}

    1,遍历操作

    2,筛选操作

  列表推导式

egg_lis = ['鸡蛋%s' %i for i in range(10)]
print(egg_lis)

  生成器推导式

g = (i for i in range(10))
for i in g:
    print(i)

  字典推导式

# 将一个字典中的key和value对调
dic = {'k1': 'v1', 'k2': 'v2'}
dic_swop = {dic[k]: k for k in dic}
print(dic_swop)   # {'v2': 'k2', 'v1': 'k1'}

  集合推导式

# 集合推导式  自带结果去重功能
set1 = {i for i in [1, 3, 5, 5, 6, 3, 4]}
print(set1)  # {1, 3, 4, 5, 6}

    

原文地址:https://www.cnblogs.com/zxc-Weblog/p/8184165.html