Python基础知识_Day13_装饰器和推导式

路飞学城Python开发21天入门
侵权删!


Day13

今日内容

  • 装饰器
  • 推导式
  • 模块

内容回顾

1、函数

  • 参数

    • def(a1,a2): pass

    • def(a1,a2=None): pass 默认参数推荐用不可变类型,慎用可变类型

    • def(*arg,**kwargs): pass

    • 注意:位置参数>关键字参数

    • 面试题

      • 函数可以做参数

        def func(arg):
            arg()
        def show():
            pass
        func(show)
        
      • 函数的参数传递的是什么

        v = [11,22,33,44]
        
        def = func(arg):
            print(id(arg))
            
        print(id(v)) # 列表的内存地址
        func(v)
        
        # 传递的是内存地址
        
      • *args 和 **kwargs的作用

  • 返回值

    • 常见的数据类型

    • 函数也可以返回

      def func():
          def inner():
              pass
          return inner
      
      v = func()
      
    • 特殊

      • 默认没返回就是None
      • return 1,2,3, 等价于返回元组(1,2,3,)
  • 执行函数

    • 函数不调用,内部代码永远不执行

      def func():
          return 1
      func_list = []
      for i in range(10):
          func_lsit.append(func)
          
      print(i)
      v = func_list[0]()
      v = func_list[4]()
      
      func_list = []
      for i in range(10):
          func_list.append(lambda :i)
          
      print(func_list)
      func_list[2]()
      
    • 执行函数的时候,会新创建一块内存保存自己函数执行的信息(闭包)

总结:

  • 传参:位置参数在前,关键字在后
  • 函数不调用,内部代码永远不执行
  • 每次调用函数时,都会为此调用开辟一块内存。内存中可以保存自己以后想要用的值
  • 函数是作用域,如果自己的作用域中没有,就往上级作用域找。

2、内置和匿名函数

3、模块

  • getpass
  • random
  • hashlib

内容详细

1、作业讲解

2、装饰器

def func(arg):
    def inner():
        print('before')
        v = arg()
        print('after')
        return v
    return inner

def index():
    print('123')
    return '666'

index = func(index)
index()
# 在不改变index函数内部的情况下,在前后加上before和after代码段
def func(arg):
    def inner():
        print('before')  #
        v = arg()
        print('after')   #
        return v
    return inner
# 第一步:执行func函数并将下面的函数当做参数传递。相当于func(index)
# 第二步:将func的返回值重新赋值给下面的函数名。index = func(index)
@func 
def index():
    print('123')
    return '666'

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

应用:

# 计算函数执行时间
import time

def wrapper(func):
    def inner():
        start_time = time.time()
        v = func()
        end_time = time.time()
        print(start_time - end_time)
        return v
    return inner

@wrapper
def func1():
    time.sleep(1)
    print(123)
    
func1()

总结

  • 目的:不改变原函数的基础上,在函数执行前后自定义一些功能。

  • 编写装饰器 和应用:

    # 编写
    def x(func):
        def y():
            ret = func()
            return ret
        return y
    # 应用
    @x
    def index():
        pass
    # 执行
    v = index()
    print(v)
    
  • 应用场景:想要为函数扩展功能时,可以选择装饰器。

  • 记住:

    • 装饰器编写格式

      def 外层函数(参数):
          def 内层函数(*args,**kwargs):
              return 参数(*args,**kwargs)
          return 内层函数
      
    • 装饰器应用格式

      @外层函数
      def index():
          pass
      
      index()
      
    • 为什么要加*args,**kwargs

3、推导式

  • 列表推导式

    • 基本格式

      '''
      目的:方便的生成一个列表
      格式:
      	v1 = [i for i in 可迭代对象 ]
      	v2 = [i for i in 可迭代对象 if 条件] # 条件为True才append
      '''
      变量 = [ for循环的变量 for循环一个可迭代对象 ]
      value = [ i for i in 'alex' ]
      # ['a','l','e','x']
      v2 = [i+100 for i in range(10)]
      v2 = [99 if i>5 else 66 for i in range(10)]
      
      def func():
          return 123
      v3 = [func for i in range(10)]
      
      v4 = [lambda :100 for i in range(10)]
      result = v4[0]()
      
      v5 = [lambda :100+i for i in range(10)]
      result = v5[0]()
      
      # 面试题一
      v6 = [lambda x:x*i for i in range(10)]
      result = v6[0]()
      # 1.请问 v6 是什么?
      # 2.请问 v6[0](2) 是什么?
      
      # 面试题二
      def num():
          return [lambda x:i*x for i in range(4)]
      print([ m(2) for m in num() ])
      
      # 筛选 先循环再判断再append
      v7 = [i for i in range(10) if i>5]
      
  • 集合推导式

    类比列表推导式即可

  • 字典推导式

    v1 = {
            'k'+str(i):i for i in range(3) }
    # v1 = {'k0':0,'k1':1,'k2':2}
    

总结

  • 装饰器

    • 编写格式:双层嵌套函数
    • 应用格式:@外层函数
  • 推导式

  • 模块

    import time
    
    v = time.time() # 获取当前时间
    time.sleep(2) # 睡两秒
    

你可能感兴趣的:(Python,python)