zoukankan      html  css  js  c++  java
  • 装饰器和表达生成式

    from functools import wraps

    叠加多个装饰器:多个装饰器的加载顺序和执行顺序
    1.加载顺序:outter函数的调用过程:自下而上
    2.执行顺序:wrapper函数的执行顺序:自上而下
    @deco 在最上层执行时候在最内层,调用上一层,如果没有上一层则调用index
    def outter1(func1): #func1=wrapper2的内存地址
        print('加载了outter1')
        def wrapper1(*args,**kwargs):
            print('执行了wrapper1')
            res1=func1(*args,**kwargs)
            return res1
        return wrapper1

    def outter2(func2): #func2=wrapper3的内存地址
        print('加载了outter2')
        def wrapper2(*args,**kwargs):
            print('执行了wrapper2')
            res2=func2(*args,**kwargs)
            return res2
        return wrapper2

    def outter3(func3): # func3=最原始的那个index的内存地址
        print('加载了outter3')
        def wrapper3(*args,**kwargs):
            print('执行了wrapper3')
            res3=func3(*args,**kwargs)
            return res3
        return wrapper3

    @outter1 # outter1(wrapper2的内存地址)======>index=wrapper1的内存地址
    @outter2 # outter2(wrapper3的内存地址)======>wrapper2的内存地址
    @outter3 # outter3(最原始的那个index的内存地址)===>wrapper3的内存地址
    def index():
        print('from index')
    index()

    有参装饰器:三层闭包函数
    import time


    login_status={'name':None,'status':False}

    def auth(engine='file'):
        def outter(func):
            def wrapper(*args,**kwargs):
                if login_status['name'] is not None:
                    res = func(*args,**kwargs)
                    return res
                name = input('username>>>:').strip()
                pwd = input('password>>>:').strip()
                if engine == 'file':
                    if name == 'egon' and pwd =='123':
                        print('login successful')
                        login_status['name'] = name
                        login_status['status'] = True
                        res = func(*args,**kwargs)
                        return res
                    else:
                        print('username or password error')
                elif engine == 'mysql':
                    pass
                elif engine == 'ldap':
                    pass
            return wrapper
        return outter


    @auth('file')
    def index():
        time.sleep(2)
        print('welcome to index page')

    index()

    三元表达式
    x=10
    y=20

    x if x > y else y
    生成式
        列表生成式
            l=[]
            for i in range(10)
            l.append(i)
            print(l)
            
            l = [i for i in range(10)]
            
        字典生成式
            l = {}  字典和集合
        元组没有生成式
            
    匿名函数与内置函数
        匿名函数就是只定义了一个函数的内存地址,主要用于临时使用一次的场景
        lambda x,y:x+y

    内置函数
        max()
        sorted 排序

    学习,学习,学习! 学习是为了更好的未来,不要让别人瞧不起你,加油!!!
  • 相关阅读:
    HDU 1495 非常可乐
    ja
    Codeforces Good Bye 2016 E. New Year and Old Subsequence
    The 2019 Asia Nanchang First Round Online Programming Contest
    Educational Codeforces Round 72 (Rated for Div. 2)
    Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises)
    AtCoder Regular Contest 102
    AtCoder Regular Contest 103
    POJ1741 Tree(点分治)
    洛谷P2634 [国家集训队]聪聪可可(点分治)
  • 原文地址:https://www.cnblogs.com/yangyufeng/p/10058571.html
Copyright © 2011-2022 走看看