zoukankan      html  css  js  c++  java
  • 生成器

    一、叠加多个装饰器的加载、运行分析(了解***)

    def deco1(func1): # func1 = wrapper2的内存地址
        def wrapper1(*args,**kwargs):
            print('正在运行===>deco1.wrapper1')
            res1=func1(*args,**kwargs)
            return res1
        return wrapper1
    
    def deco2(func2): # func2 = wrapper3的内存地址
        def wrapper2(*args,**kwargs):
            print('正在运行===>deco2.wrapper2')
            res2=func2(*args,**kwargs)
            return res2
        return wrapper2
    
    def deco3(x):
        def outter3(func3): # func3=被装饰对象index函数的内存地址
            def wrapper3(*args,**kwargs):
                print('正在运行===>deco3.outter3.wrapper3')
                res3=func3(*args,**kwargs)
                return res3
            return wrapper3
        return outter3
    
    
    加载顺序自下而上(了解)
    @deco1      # index=deco1(wrapper2的内存地址)        ===> index=wrapper1的内存地址
    @deco2      # index=deco2(wrapper3的内存地址)        ===> index=wrapper2的内存地址
    @deco3(111) # ===>@outter3===> index=outter3(index) ===> index=wrapper3的内存地址
    def index(x,y):
        print('from index %s:%s' %(x,y))
    
    执行顺序自上而下的,即wraper1-》wrapper2-》wrapper3
    index(1,2) # wrapper1(1,2)
    

    二、生成器的高级玩法之yield挂起函数:yield的表达式形式(了解***)

    x=yield 返回值

    #####一:
     def dog(name):
         print('道哥%s准备吃东西啦...' %name)
         while True:
             # x拿到的是yield接收到的值
             x = yield # x = '肉包子'
             print('道哥%s吃了 %s' %(name,x))
    
    
     g=dog('alex')
     g.send(None) # 等同于next(g)
    
     g.send(['一根骨头','aaa'])
     # g.send('肉包子')
     # g.send('一同泔水')
     # g.close()
     # g.send('1111') # 关闭之后无法传值
    
    
    #####二:
    def dog(name):
        food_list=[]
        print('道哥%s准备吃东西啦...' %name)
        while True:
            # x拿到的是yield接收到的值
            x = yield food_list # x = '肉包子'
            print('道哥%s吃了 %s' %(name,x))
            food_list.append(x) # ['一根骨头','肉包子']
    
     g=dog('alex')
     res=g.send(None)  # next(g)
     print(res)
    
     res=g.send('一根骨头')
     print(res)
    
     res=g.send('肉包子')
     print(res)
     # g.send('一同泔水')
    
    
    
    
    def func():
        print('start.....')
        x=yield 1111  # x='xxxxx'
        print('哈哈哈啊哈')
        print('哈哈哈啊哈')
        print('哈哈哈啊哈')
        print('哈哈哈啊哈')
        yield 22222
    
    g=func()
    res=next(g)
    print(res)
    
    res=g.send('xxxxx')
    print(res)
    

    三:三元表达式

    针对以下需求
    def func(x,y):
        if x > y:
            return x
        else:
            return y
    
    res=func(1,2)
    print(res)
    
    三元表达式
    语法格式:res = 条件成立时返回的值 if 条件 else 条件不成立时返回的值
    
    x=1
    y=2
    
    res=x if x > y else y
    print(res)
    

    四:生成式

    # 1、列表生成式
    l = ['alex_dsb', 'lxx_dsb', 'wxx_dsb', "xxq_dsb", 'egon']
    new_l=[]
    for name in l:
        if name.endswith('dsb'):
            new_l.append(name)
    
    
    new_l=[name for name in l if name.endswith('dsb')]
    new_l=[name for name in l]
    
    print(new_l)
    
    # 把所有小写字母全变成大写
    new_l=[name.upper() for name in l]
    print(new_l)
    
    # 把所有的名字去掉后缀_dsb
    new_l=[name.replace('_dsb','') for name in l]
    print(new_l)
    
    # 2、字典生成式
    keys=['name','age','gender']
    dic={key:None for key in keys}
    print(dic)
    
    items=[('name','egon'),('age',18),('gender','male')]
    res={k:v for k,v in items if k != 'gender'}
    print(res)
    
    # 3、集合生成式
    keys=['name','age','gender']
    set1={key for key in keys}
    print(set1,type(set1))
    
    
    # 4、生成器表达式
    g=(i for i in range(10) if i > 3)
    # !!!!!!!!!!!强调!!!!!!!!!!!!!!!
    # 此刻g内部一个值也没有
    
    print(g,type(g))
    
    print(g)
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    
    
    with open('笔记.txt', mode='rt', encoding='utf-8') as f:
        方式一:
        res=0
        for line in f:
            res+=len(line)
        print(res)
    
        # 方式二:
        res=sum([len(line) for line in f])
        print(res)
    
        # 方式三 :效率最高
        res = sum((len(line) for line in f))
        上述可以简写为如下形式
        res = sum(len(line) for line in f)
        print(res)
    
  • 相关阅读:
    linux 短信收发
    sama5d3 环境检测 adc测试
    【Codeforces 723C】Polycarp at the Radio 贪心
    【Codeforces 723B】Text Document Analysis 模拟
    【USACO 2.2】Preface Numbering (找规律)
    【Codeforces 722C】Destroying Array (数据结构、set)
    【USACO 2.1】Hamming Codes
    【USACO 2.1】Healthy Holsteins
    【USACO 2.1】Sorting A Three-Valued Sequence
    【USACO 2.1】Ordered Fractions
  • 原文地址:https://www.cnblogs.com/linqiaobao/p/12568344.html
Copyright © 2011-2022 走看看