• Python学习————叠加多个装饰器及yield表达式、三元表达式、生成式


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

    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表达式

    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)
    

    三、三元表达式

    语法格式: 条件成立时要返回的值 if 条件 else 条件不成立时要返回的值

    x=1
    y=2
    
    res=x if x > y else y
    print(res)
    
    res=111111 if 'egon' == 'egon' else 2222222222
    print(res)
    

    应用举例

    def func():
    
    if 1 > 3:
    
    x=1
    
    else:
    
    x=3
    
    ​    x = 1 if 1 > 3 else 3
    

    四、生成式

    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)
    
  • 相关阅读:
    POJ1239
    HDU 2829 四边形不等式优化
    返回数字二进制的最高位位数o(n)
    矩阵快速幂 模板
    HDU4718 The LCIS on the Tree(LCT)
    HDU4010 Query on The Trees(LCT)
    HDU3487 Play With Chains(Splay)
    CF444C DZY Loves Colors
    HDU4836 The Query on the Tree(树状数组&&LCA)
    HDU4831&&4832&&4834
  • 原文地址:https://www.cnblogs.com/x945669/p/12568730.html
Copyright © 2020-2023  润新知