• python-------------生成器和推导式


    #只要有yield关键字的的函数都是生成器函数
    #yield不能和return共用且需要写在函数内
    def generator():
        print(1)
        yield 'a'
    #生成器函数: 执行之后会得到一个生成器作为返回值。
    ret = generator()
    print(ret)
    print(ret.__next__())
    
    def wahaha():
        for i in range(2000000):
            yield '哇哈哈',i

    监听文字输出

    #只要有yield关键字的的函数都是生成器函数
    #yield不能和return共用且需要写在函数内
    def generator():
        print(1)
        yield 'a'
    #生成器函数: 执行之后会得到一个生成器作为返回值。
    ret = generator()
    print(ret)
    print(ret.__next__())
    
    def wahaha():
        for i in range(2000000):
            yield '哇哈哈',i
    
    
    #send的获取下一个值得效果和next基本一致,
    #只是在获取下一个值得时候,给上一值得位置 传递一个数据
    #注意事项:第一次使用生成器必须用next,最后一个yield不能接受外部得值。
    #例子:
    def generator1():
        print(123)
        content = yield 1
    
        print('==================',content)
        print(456)
        yield  2
    
    g = generator1()
    ret1 =  g.__next__()
    print('******',ret1)
    ret2 = g.send('hello')
    print('*********',ret2)
    
    #计算移动平均值
    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 sehndchegqi():
        a = 'abcde'
        b = '12345'
        yield from a
        yield from b
    
    gg = sehndchegqi()
    for i in g:
        print(i)
    
    
    
    #列表推导式
    egg_list = ['鸡蛋%s'%i for i in range(10)]
    print(egg_list)
    #输出结果: ['鸡蛋0', '鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4',
    # '鸡蛋5', '鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9']
    
    
    #生成器表达式
    
    ggg = (i*i for i in range(10))#只能得到一个生成器ggg,
    for i in ggg:
        print(i)
    '''列表推导式和生成器表达式的不同:1.括号不同,2.返回值不同'''
    #相比去列表推导式,其括号不同
    #返回值不一样=====几乎不占用内存。
    
    '''------------各种推导式------------------'''
    #[每一个元素或者是和元素相关的操作 for 元素 in 可迭代数据类型]    #遍历之后挨个处理
    #[满足条件的元素相关的操作 for 元素 in 可迭代数据类型 if 元素相关的条件]   #筛选功能
    
    #列表推导式
    #30以内所有能被3整除的数
    rett = [i for i in  range(30) if i%3 == 0]
    print(rett)
    #30以内所有能被3整除的数
    rett1 = [i*i for i in  range(30) if i%3 ==0]
    print(rett1)
    #找到嵌套列表中名字含有俩个‘e’的所有名字
    names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
              ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
    name = [ name for lst in names for name in lst if name.count('e') ==2]
    print(name)
    
    
    #字典推导式
    
    
    # 例一:将一个字典的key和value对调
    mcase = {'a': 10, 'b': 34}
    # #{10:'a' , 34:'b'}
    msat = {mcase[k]:k for k in mcase}
    print(msat)
    # 例二:合并大小写对应的value值,将k统一成小写
    mcase1 = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
    # #{'a':10+7,'b':34,'z':3}
    mcasedic = {k.lower():mcase1.get(k.lower(),0)+ mcase1.get(k.upper(),0) for k in mcase1}
    print(mcasedic)
    # print(mcase_frequency)
    
    #集合推导式,自带结果去重功能
    squared = {x**2 for x in [1, -1, 2]}
    print(squared)

    习题小解

    def add(n,i):
        return n+i
    
    def test():
        for i in range(4):
            yield i
    
    g=test()
    # for n in [1,10,5]:
    #     g=(add(n,i) for i in g)
    n = 1
    g=(add(n,i) for i in test())
    n = 10
    g=(add(n,i) for i in (add(n,i) for i in test()))
    n = 5
    g=(15,16,17,18)
    
    
    print(list(g))
  • 相关阅读:
    STM32 --- 什么时候打开复用IO的时钟(比如RCC_APB2Periph_AFIO)
    STM32 一直进入串口接收中断
    printf 中的 %.*s
    形参定义为二级指针,可以修改实参指针本身的值
    结构体和联合体配合使用
    自定义注解的实现思路
    log4j application.properties 配置文件
    外观设计模式
    适配器设计模式
    模版方法设计模式
  • 原文地址:https://www.cnblogs.com/xiangrikuidebuluo/p/9482604.html
Copyright © 2020-2023  润新知