zoukankan      html  css  js  c++  java
  • 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}

        

  • 相关阅读:
    敏捷开发宣言
    OpenGL SL 优化要点
    Cocoa Touch 开发框架
    MSIL详解
    Android之Services
    Android之ActivityII
    Android之Activity
    托管执行过程
    Android之Content ProviderII
    Android之Content Providers
  • 原文地址:https://www.cnblogs.com/zxc-Weblog/p/8184165.html
Copyright © 2011-2022 走看看