Python学习--day12

day12

一、装饰器:

1、叠加多个装饰器:

  1. 加载顺序(outter函数的调用顺序):自下而上

  1. 执行顺序(wrapper函数的执行顺序):自上而下

代码:

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')
​
print('======================================================')
index()
​
'''
import time
​
def timmer(func):
    def aaa(*args,**kwargs):
        start=time.time()
        res=func(*args,**kwargs) #最原始那个index的内存地址()
        stop=time.time()
        print('run time is %s' %(stop -start))
        return res
    return aaa
​
def auth(func):
    def bbb(*args,**kwargs):
        name=input('name>>>: ').strip()
        pwd=input('pwd>>>: ').strip()
        if name == 'egon' and pwd == '123':
            print('login successfull')
            res=func(*args,**kwargs)
            return res
        else:
            print('user or pwd error')
    return bbb
​
@timmer
@auth
def index():
    time.sleep(1)
    print('from index')
​
index()
2、有参装饰器:

有参装饰器用于解决两层装饰器无法继续向装饰器内部传入新参数的问题,装饰器最多三层,到了第三层就可以解决装饰器内层所有所需参数的传值要求。

import time
​
current_user={'user':None}
​
def auth(engine='file'):
    def outter(func):
        def wrapper(*args,**kwargs):
            if current_user['user'] is not None:
                res=func(*args,**kwargs)
                return res
​
            user=input('username>>>: ').strip()
            pwd=input('password>>>: ').strip()
​
            if engine == 'file':
                # 基于文件的认证
                if user == 'egon' and pwd == '123':
                    print('login successfull')
                    current_user['user']=user
                    res=func(*args,**kwargs)
                    return res
                else:
                    print('user or password error')
            elif engine == 'mysql':
                # 基于mysql的认证
                print('基于mysql的认证')
            elif engine == 'ldap':
                # 基于ldap的认证
                print('基于ldap的认证')
            else:
                print('不知道engine')
        return wrapper
    return outter
​
@auth('ldap') #@outter #index=outter(index) # index=wrapper
def index():
    time.sleep(1)
    print('from index')
​
@auth('mysql') #@outter # home=outter(home) #home=wrapper
def home(name):
    print('welcome %s' %name)
​
index()
home('egon')

二、三元表达式和生成式:

1、三元表达式的基本格式

条件成立时的返回值 if 条件 else 条件不成立时的返回值

def max2(x,y):
    if x > y:
        return x
    else:
        return y
​
res=max2(10,20)
​
x=10
y=20# res=x if x > y else y  #三元表达式
# print(res)
​
res='OK' if False else 'No'   #三元表达式
print(res)

2、列表生成式:

列表生成式:用于快速生成列表,并尽可能的使表达式简洁。

# l=[]
# for i in range(10):
#     if i > 4:
#         l.append(i**2)
#
#
#
# l=[i**2 for i in range(10) if i > 4]  列表生成式
# print(l)
# names=['egon','alex_sb','kevin_sb','hxx_sb','cxx_sb']
# sbs=[]
# for name in names:
#     if name.endswith('sb'):
#         sbs.append(name)
# sbs=[name.upper() for name in names if name.endswith('sb')]
# print([name.upper() for name in names])
# print([name for name in names if name.endswith('sb')])

2、字典生成式:

# res={i:i**2 for i in range(10) if i > 3}
# print(res)
print({i for i in 'hello'})

三、匿名函数lambda

匿名函数的格式: lambda 参数:返回值

# def func():
#     print('from func')
#
# func()
# func()
# func()
# 匿名函数就是只定义了一个函数的内存地址,主要用于临时使用一次的场景

注:1、匿名函数的精髓就是没有名字的,因此给它赋值是没有意义的;

2、匿名函数的参数规则、作用域关系与有名函数是一样的;

3、匿名函数的函数体通常是一个表达式,该表达式必须要有一个返回值。

匿名函数的实际应用:

# func=lambda x,y:x+y
# print(func)
# print(func(1,2))
# res=(lambda x,y:x+y)(1,2)
# print(res)
​
​
# print(max([10,11,-3,23]))
salaries={
    'egon':3000,
    'alex':100000000,
    'wupeiqi':10000,
    'yuanhao':2000
}
# def func(k):
#     return salaries[k]
# print(max(salaries,key=lambda k:salaries[k]))
# print(min(salaries,key=func))
# for循环的结果         比较依据
# 'egon'                3000
# 'alex'                100000000
# 'wupeiqi'             10000
# 'yuanhao'             2000
# l=[4,2,3]
# l_new=sorted(l,reverse=True)
# print(l_new)
#print(sorted(salaries,key=lambda k:salaries[k],reverse=True))

 

猜你喜欢

转载自www.cnblogs.com/peng-zhao/p/10046318.html