python – 闭包使用 -装饰器

    Python编程 wuya 33次浏览 已收录 0个评论

    闭包使用

    • 定义:
      • 外部函数中定义一个内部函数
      • 内部函数中使用外部函数的局部变量
      • 外部函数将内部函数作为返回值返回
      • 返回的函数就称为闭包
    • 示例:
      def wai(n):
          # 定义一个内部函数
          def nei():
              # 使用外部函数的局部变量
              return n*n
          # 将内部函数作为返回值返回
          return nei
      
      # f1、f2都是闭包
      f1 = wai(3)
      f2 = wai(5)
      
      print(f1())
      print(f2())
    • 总结:闭包可以认为是具有执行环境的函数

    装饰器

    • 作用:当需要修改函数功能时,不能或不想改原函数,可以通过装饰器进行解决。
    • 使用:
      • 装饰器其实就是一个函数,该函数有一个参数是函数类型,返回值是一个闭包
      • 在闭包中调用传递进来的函数,在调用函数的前后都可以添加内容
    • 示例:
      def zhuangshiqi(func):
          def wrapper():
              print('=====')
              func()
              print('*****')
          return wrapper
      
      @zhuangshiqi # 相当于执行了 test = zhuangshiqi(test)
      def test():
          print('for test')
          
      # test()
      # t2 = zhuangshiqi(test)
      # t2()
      # test = zhuangshiqi(test)
      test()
    • 标准装饰器
      # 装饰任意的函数:参数与返回值不限
      def zhuangshiqi(func):
          def wrapper(*args, **kwargs):
              print('前面装饰')
              result = func(*args, **kwargs)
              print('后面装饰')
              return result
          return wrapper
      
      @zhuangshiqi
      def test():
          print('for test')
      
      # test()
      
      @zhuangshiqi
      def show(a, b):
          # print(a, b)
          return a+b
        
      print(show(1, 2))
    • 函数名字修正
      import functools
      
      def zhuangshiqi(func):
          # 专门用来修正被装饰的函数的名字
          @functools.wraps(func)
          def wrapper(*args, **kwargs):
              print('前面装饰')
              result = func(*args, **kwargs)
              print('后面装饰')
              return result
          # 修正装饰之后的函数名,不够优雅
          # wrapper.__name__ = func.__name__
          return wrapper 
      
      @zhuangshiqi
      def test():
          print('test func')
            
      test()
      print(test.__name__)

    练习:

    • 自己实现列表的排序方法,算法不限,支持升序和降序,还支持任意类型元素的排序
    • 实现一个字符串的逆序
    • 计算一个字符串中的所有数字的和,(选做:连续数字当成一个整体)
    • 找出列表中第二大的数(选做:不可改变原列表)
    • 返回一个列表中出现次数最多的元素
    • 封装函数实现:1^2 + 2^2 + ... + n^2
    • 传入字符D,打印如下图形:
      DDDDDDD
      DCCCCCD
      DCBBBCD
      DCBABCD
      DCBBBCD
      DCCCCCD
      DDDDDDD


    学海无涯 , 版权所有丨如未注明 , 均为原创丨转载请注明python – 闭包使用 -装饰器
    喜欢 (0)
    发表我的评论
    取消评论
    表情 加粗 删除线 居中 斜体 签到

    Hi,您需要填写昵称和邮箱!

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址