zoukankan      html  css  js  c++  java
  • 装饰器,匿名函数

    装饰器

    装饰器的开放封闭原则:

    装饰器对扩展是开放的,对修改源代码是封闭的,不能改变原函数的调用方式

     1 基本完整的装饰器函数示例
     2 import time                                       #时间模块
     3 def warpper(f):                                 #接受被装饰的函数内存地址
     4     def inner(*args,**kwargs):           #接受被装饰函数的参数  inner里面函数是扩展的功能
     5         start_time = time.time()           #计时功能
     6         ret = f(*args,**kwargs)           #调用被装饰的函数,带着被装饰函数的参数
     7         end_time = time.time()             #计时功能
     8         print('%s函数的运行时间:%s'%(f.__name__,end_time-start_time))
     9                                                         #计时功能
    10         return ret                                  #被装饰函数的返回值
    11     return inner                                   #通过这一步令func() = inner()
    12 
    13 @warpper                                         #语法糖,相当于func = warpper(func)
    14 def func(*args,**kwargs):                #被装饰函数
    15     print(args)                                    #主函数功能
    16     print('这是主功能')                          #主函数功能
    17     time.sleep(1)                                #计时功能
    18     return '你好'                                  #被装饰函数的返回值,返回到inner里的ret
    19 #其实语法糖缩写的函数位置在这里,此处相当于有一个func = warpper(func)
    20 ret = func(5)                                    #func(5) = inner(5)  此处的ret来自inner
    21 print(ret)                                          #ret是func的return,但不由func返回
    def wrapper1(func1):  # func1 = f原函数
        def inner1():
            print('wrapper1 ,before func')  # 2
            func1()
            print('wrapper1 ,after func')  # 4
        return inner1
    
    def wrapper2(func2):  # func2 == inner1
        def inner2():
            print('wrapper2 ,before func')  # 1
            func2()  # inner1
            print('wrapper2 ,after func')  # 5
        return inner2
    
    
    @wrapper2  # f = wrapper2(f) 里面的f == inner1  外面的f == inner2
    @wrapper1  # f = wrapper1(f) 里面的f == func1  外面的 f == inner1
    def f():
        print('in f')  # 3
    
    f()  # inner2()
    多个装饰器装饰一个函数
    def wrapper_out(n):
        def wrapper(f):
            def inner(*args,**kwargs):
                username = input('请输入用户名:').strip()
                password = input('请输入密码:').strip()
                with open(n,encoding='utf-8') as f1:
                    for line in f1:
                        user,pwd = line.strip().split('|')
                        if username == user and password == pwd:
                            print('登陆成功')
                            ret = f(*args,**kwargs)
                            return ret
                    return False
            return inner
        return wrapper
    
    """
    看到带参数的装饰器分两步执行:
        1. 执行wrapper_out('腾讯') 这个函数,把相应的参数'腾讯' 传给 n,并且得到返回值 wrapper函数名。
        2. 将@与wrapper结合,得到我们之前熟悉的标准版的装饰器按照装饰器的执行流程执行。
    """
    
    
    @wrapper_out('qq')
    def qq():
        print('成功访问qq')
    
    
    @wrapper_out('tiktok')
    def tiktok():
        print('成功访问抖音')
    
    qq()
    tiktok()
    # 开发思路:增强耦合性
    带参数的装饰器

    内置函数  :

    匿名函数lambda: 为了解决那些功能很简单的需求而设计的一句话函数

    参数可以有多个,用逗号隔开

    匿名函数不管逻辑多复杂,只能写一行,且逻辑执行结束后的内容就是返回值

    返回值和正常的数据一样可以是任意数据类型

    排序函数sorted:

    字典排序返回的就是排序后的key

    和lambda组合使用:

    筛选过滤filter:

    映射函数map

    改写成lambda

    reduce:

    reduce的使用方式

    reduce(函数名,可迭代对象)  这两个参数必须要有,缺一不行

    和lambda一起使用

    在Python2.x版本中recude是直接 import就可以的, Python3.x版本中需要从functools这个包中导入

    龟叔本打算将 lambda 和 reduce 都从全局名字空间都移除, 舆论说龟叔不喜欢lambda 和 reduce

    最后lambda没删除是因为和一个人写信写了好多封,进行交流然后把lambda保住了

     

  • 相关阅读:
    别用言语考验底线
    QQ登陆接口
    cookie设置今日不提醒功能
    Sublime Text 3常用插件
    浏览器的标准模式与怪异模式的设置与区分方法
    JS中offsetTop、clientTop、scrollTop、offsetTop各属性介绍
    javascript中闭包的工作原理
    javascript判断图片是否加载完成方法整理
    社会十二效应法则
    小故事
  • 原文地址:https://www.cnblogs.com/biulo/p/10555345.html
Copyright © 2011-2022 走看看