s21day13 python笔记

一、装饰器

  1. 目的:在不改变原函数内部代码的基础上,在函数执行之前和之后自动执行某个功能

  2. 应用场景:想要为函数扩展功能时,可以选择用装饰器

  3. 装饰器基本格式:

    def func(arg):
        def inner():
            v = arg()
            return v
        return inner
    
    # 重点:
    # 第一步:执行func函数并将下面的函数参数传递,相当于:func(index)
    # 第二步:将func的返回值重新赋值给下面的函数名。 index = func(index)
    @func
    def index():
        print(123)
        return 666
    
    print(index)
    
    # 注意:
    
  4. 总结

    • 编写格式:
    def 外层函数(参数):
        def 内层函数(*args,**kwargs)
         return 参数(*args,**kwargs)
        return 内层函数
    • 应用格式:
    @外层函数
    def index():             #要装饰的函数
        pass
    
    index()
    # 装饰器的编写
    def x(func):
        def y():
            # 前
            ret = func()
            # 后
            return ret
         return y
    
    # 装饰器的应用
    @x
    def index():
        return 10
    
    # 执行函数,自动触发装饰器了
    v = index()
    print(v)
  5. 示例:

    def func(arg):
        def inner():
            print('before')
            v = arg()
            print('after')
            return v
        return inner
    
    def index():
        print('123')
        return '666'
    
    # 示例一
    v1 = index() # 执行index函数,打印123并返回666赋值给v1.
    
    # 示例二
    v2 = func(index) # v2是inner函数,arg=index函数
    index = 666
    v3 = v2()
    
    # 示例三
    v4 = func(index)
    index = v4  # index ==> inner
    index()
    
    # 示例四
    index = func(index)
    index()

二、推导式

  1. 列表推导式

    # 目的:方便的生成一个列表
    # 格式:
    v1 = [i for i in 可迭代对象 ]
    v2 = [i for i in 可迭代对象 if 条件 ]      #条件为true才进行append
    # 示例:
    v1 = [ i for i in 'alex' ]
    v2 = [i+100 for i in range(10)]
    v3 = [99 if i>5 else 66  for i in range(10)]
    
    def func():
        return 100
    v4 = [func for i in range(10)]
    
    v5 = [lambda : 100 for i in range(10)]
    result = v5[9]()
    
    v6 = [lambda :i for i in range(10)]
    result = v6[5]()
    
    # 新浪微博面试题
    v7 = [lambda x:x*i for i in range(10)]
    # 1.请问 v7 是什么?
    # 2.请问 v7[0](2) 的结果是什么?
    
    # 面试题
    def num():
        return [lambda x:i*x for i in range(4)]
    # num() -> [函数,函数,函数,函数]
    print([ m(2) for m in num() ]) # [6,6,6,6]
  2. 集合推导式

    # 目的:方便的生成一个集合
    # 格式:
    v1 = { i for i in 'alex' }
  3. 字典推导式

    # 目的:方便的生成一个字典
    # 格式:
    v1 = { 'k'+str(i):i for i in range(10)}

三、模块

  1. time:时间模块

    # 计算函数执行时间
    import time
    
    def wrapper(func):
        def inner():
            start_time = time.time()
            v = func()
            end_time = time.time()
            print(end_time-start_time)
            return v
        return inner
    
    @wrapper
    def func1():
        time.sleep(2)
        print(123)
    
    func1()
04-29 05:30