• python基础 生成器


    生成器函数进阶

    send

    def generator():
        print(123)
        yield 1
        print(456)
        yield 2
        print(789)
    
    g = generator()
    ret = g.__next__()        #调用一次,输出结果是123,1
    print(ret)
    ret = g.__next__()      #再次调用,结果是456,2
    print(ret)
    ret = g.__next__()        #因为没有yield 所以这次将diaoyong789
    print(ret) 
    def generator():
        print(123)
        content = yield 1
        print('===',content)
        print(456)
        arg = yield 2
    
    g = generator()
    ret = g.__next__()
    print('***',ret)
    ret = g.send('hello')         #send的效果和next一样
    print('***',ret)
    #获取下一个值的效果和next基本一致
    #只是在获取下一个值的时候,给上一个值得位置传递一个数据

    使用send的注意事项:
      第一次使用生成器的时候,使用next获取下一个值
      最后一个yield不能接收外部的值

    例题:计算移动平均值

    #send方法
    avg = sum/count
    def average():
        sum = 0
        count = 0    
        avg = 0
        while True:
            num = yield avg
            sum += num
            count += 1
            avg = sum/count
            
    avg = average()
    avg_g.__next__()
    avg_g.send(10)
    avg1 = avg_g.send(10)
    avg1 = avg_g.send(20)
    print(avg1)
    #用预激生成器的装饰器方法来做计算移动平均值.
    def init(func):
        def inner(*args,**kwargs):
            g = func(*args,**kwargs)     #g = average()
            g.__next__()
            return g
        return inner
    
    @init    
    def average():     #average() ===> inner
        sum = 0
        count = 0    
        avg = 0
        while True:
            num = yield avg
            sum += num
            count += 1
            avg = sum/count
    
    g = average()
    ret = g.send(10)
    ret = g.send(20)
    print(ret)

    yield from

    def generator():                #输出两个字符串的每个字符
        a = 'abcde'
        b = '12345'
        for i in a:
            yield i
        for i in b:
            yield i
    
    g = generator()   
    for i in g:
        print(i
    def generator():                    #用yield from方法比较简洁
        a = 'abcde'
        b = '12345'
        yield from a
        yield from b
    
    g = generator()
    for i in g:
        print(i)

    推导式

    推导式的先决条件:

    [每一个元素或者是和元素相关的操作 for 元素 in 可迭代数据类型] #遍历处理
    [满足元素或者是和元素相关的操作 for 元素 in 可迭代数据类型 if 元素相关的条件]   #筛选处理

    列表推导式

    egg_list = ['鸡蛋%s'%i for i in range(10)]   #列表推导
    print(egg_list)

    生成器表达式

    老母鸡 = ('鸡蛋%s'%i for i in range(10))   #生成器(换个括号)
    forin 老母鸡:
        print(蛋)

    例一:30以内所有能被3整除的数

    multiples = [i for i in range(30) if i % 3 is 0]
    print(multiples)
    # Output: [0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
    multiples = (i for i in range(30) if i % 3 is 0)
    for i in multiples:
        print(i)

    例二:30以内所有能被3整除的数的平方

    multiples = [i*i for i in range(30) if i % 3 is 0]
    print(multiples)
    multiples = (i*i for i in range(30) if i % 3 is 0)
    for i in multiples:
        print(i)

    例三:找到嵌套列表中名字含有两个‘e’的所有名字

    names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
             ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
    
    print([name for lst in names for name in lst if name.count('e') >= 2])  # 注意遍历顺序,这是实现的关键,必须先是最外层
    names = (['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
             ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva'])
    ret = (name for lst in names for name in lst if name.count('e') >= 2)
    for i in ret:
        print(i)

    总结:

    1.把列表解析的[]换成()得到的就是生成器表达式

    2.列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存

    3.Python不但使用迭代器协议,让for循环变得更加通用。大部分内置函数,也是使用迭代器协议访问对象的。

    字典推导式

    例一:将一个字典的key和value对调

    mcase = {'a': 10, 'b': 34}
    mcase_frequency = {mcase[k]: k for k in mcase}
    print(mcase_frequency)

    例二:合并大小写对应的value值,将k统一成小写

    mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
    mcase_frequency = {k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0) for k in mcase.keys()}
    print(mcase_frequency)

    集合推导式

    例:计算列表中每个值的平方,自带去重功能

    squared = {x**2 for x in [1, -1, 2]}
    print(squared)
    # Output: set([1, 4])
  • 相关阅读:
    反射模块与模块之间的通信
    WCF传输协议
    IIs7 报错
    MVC3 ActionResult 返回类型
    三条数据 判断其中最大与最小
    dos批处理命令详解
    十拿九稳过倒桩之(倒桩技巧)
    九项路考(1)铁饼神功
    山鸽子
    九项路考(2)
  • 原文地址:https://www.cnblogs.com/soleZ/p/8183981.html
Copyright © 2020-2023  润新知