• 生成器进阶


    # def generator():
    # content = yield 1
    # print(content)
    # yield 2
    # g = generator()
    # ret = g.__next__()
    # print(ret)
    # ret = g.send('hollo')
    # send获取下一个值的效果和next基本一致
    # 只是在获取下一个值的时候给上一个yield传递一个参数
    # 使用send的注意事项
    # 1,第一次使用生成器的时候给上一个yield的位置传递一个数据
    # 2,最后一个yield不能接受外部的值的(一般来说想连续是用send,但后面无返回值或者已经不需要的时候可以设置一个yield,后面不用返回值也可以)

    # 获取移动平均值
    # 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)
    # 预计生成器的装饰器
    def init(f):
    def inner(*args,**kwargs):
    set = f(*args,**kwargs)
    set.__next__()
    return set
    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)
    生成器表达式以及列表推导式
    区别
    1,括号不一样
    2,返回的值不一样 ==== 几乎不占内存

    列表表达式和生成器表达式

    1、列表表达式

      简化代码,返回的必须是一个列表

    复制代码
    #普通代码
    result=[]
    for i in [1,2,3]
        result.append[i*i]
    print(result)
    
    #列表表达式
    print([i*i for i in [1,2,3]])
    复制代码

    (1)30内能被3整除的数的实例

    print([i for i in range(1,31) if i%3==0])

    (2)找到嵌套列表中有两个‘e’的名字

    names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'], ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
    print([for list in names for name in list if name.count('e')==2])

    2、生成器表达式

      把列表解析的[]换成()得到的就是生成器表达式;列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存

    laomuji=('鸡蛋%s' %i for i in range(10))        #生成器表达式
    print(laomuji)                                 #返回生成器地址<generator object <genexpr> at 0x000001E17AF23BA0>
    print(next(laomuji))                           #输出结果为:鸡蛋0
    print(laomuji.__next__())                      #输出结果为:鸡蛋1
    print(next(laomuji))                           #输出结果为:鸡蛋2
                                                   #next(laomuji)等价于laomuji.__next__()

    3、字典推导式

    #将字典键与值对调
    mcase = {'a': 10, 'b': 34}
    print({mcase[k]:k for k in mcase})

    4、集合推导式

      自带去重功能,将列表解析式的[]换成{}得到集合推导式

    print({i*i for i in [1,-1,2]})    #结果为{1,4}
  • 相关阅读:
    HDU 3342 Legal or Not
    POJ 3723 Conscription
    HDU 1102 Constructing Roads
    题目1545:奇怪的连通图
    面向对象程序设计寒假作业2(实践题)
    面向对象程序设计寒假作业2(编程题1)
    面向对象程序设计寒假作业1
    面向对象程序设计寒假作业1(编程题)
    面向对象程序设计寒假作业1(实践题)
    面向对象程序设计寒假作业1(问答题)
  • 原文地址:https://www.cnblogs.com/Ebola-/p/8185445.html
Copyright © 2020-2023  润新知