首页 > 编程语言 > 详细

菜鸟学Python第十二天

时间:2018-11-30 23:45:00      阅读:192      评论:0      收藏:0      [点我收藏+]

叠加多个装饰器

  • 叠加多个装饰器

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

    2. 执行顺序(wrapper函数的调用顺序):从上到下

    # 叠加多个装饰器
    # 1. 加载顺序(outter函数的调用顺序):自下而上
    # 2. 执行顺序(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()

    技术分享图片

有参装饰器

  • 应用场景:当装饰器函数内除要传入被装饰对象外还要传入其他参数时,就需要用到有参装饰器。

# 实现一个基于函数验证的装饰器,其后台数据存 放方式有多种
?
from functools import wraps
tag = 0
?
def auth(engin):  # 函数用到除func以外函数,故再套一层函数
    def outer(func):
        @wraps(func)  # wraps函数,相当是一个装饰器将原始被装饰对象的name、和注释传给了wrapper函数
        def wrapper(*args,**kwargs):
            global tag  # 全局声明,要使用全局中的名字
            if tag:  # tag 为True 时,即不再需要验证,通过改变全局变量的方式更改tag的值
                res = func(*args, **kwargs)
                return res
            name = input(username:).strip()
            pwd = input(password:).strip()
            if engin ==file:
                if name == jason and pwd == 123:
                    print(login successful !)
                    res = func(*args, **kwargs)
                    tag = 1  # 将tag变为True
                    return res
                else:
                    print(name or password !)
            elif engin ==mysql:
                print(执行MySQL认证功能)
            elif engin == ldap
                print(执行ldap认证功能)
            else:
                print(输入有误)
        return wrapper
    return outer
    
    
@auth(file)  # engine=file,@outer   # outer = outer(welcome)    # welcome=wrapper
def welcome():
    print(welcome to XXX bank !)
        
@auth(file)
def check():
    print(查看余额)

三元表达式

取代 if …… else……的简单表达方式

技术分享图片

技术分享图片


#  常规写法
x = 1
y = 2
?
if x>y:
    print(x)
else:
    print(y)
?
#三元表达式写法
res = x if x > y else y

注意:只能判断最最基础的if else语句,不适用于elif 语句。

生成式

  1. 列表生成式

    简化新建列表的方法

    # 常规用法
    l = []
    for i in range(10):
        if i > 4:
            l.append(i)
    print(l)  # [5,6,7,8,9]
    ?
    # 生成式写法
    l = [i for i in range(10) if i>4]
    print(l) # [5,6,7,8,9]
    ?
    ?
    ?
    #列表生成式的强大用法(睁大眼睛看着哦)
    msg = [Jason, l_tony, l_rose, l_allen]  # 提取列表中以‘l‘开头的元素放入列表,并大写
    res = [i.upper() for i in msg if i.startswith(l)]  # 一行代码解决
    print(res)  # [‘L_TONY‘, ‘L_ROSE‘, ‘L_ALLEN‘]
    ?
    ?
    #语法表达式
    [expression for item1 in iterable1 if condition1
    for item2 in iterable2 if condition2
    ...
    for itemN in iterableN if conditionN
    ]  # [表达式 循环+条件筛选语句]
  2. 字典生成式

    res = {i: i**2 for i in range(10) if i > 3}
    print(res)  # 字典生成式
    ?
    ?
    print({i for i in hello}) # 集合生成式

     

匿名函数与内置函数

  • 匿名函数(lambda)

用匿名函数只定义了一个函数的内存地址,主要用于临时使用一次的场景

技术分享图片

技术分享图片

  • 内置函数

    max:max(* args , key= none)

    # 找出工资最高的那个人
    ?
    salaries = {
        a: 3000,
        b: 100000000,
        c: 10000,
        d: 2000
    }
    ?
    print(max(salaries,key=lambda k:salaries[k]))

    min:用法同max

    sorted:排序(从小到大)def sorted(*args,**kwargs)

    l = [3,6,2,8,5]
    l1 = sorted(l)
    print(l1)

菜鸟学Python第十二天

原文:https://www.cnblogs.com/liusijun113/p/10046799.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!