day 12

day 12

闭包函数

  1. 通过函数将函数包裹起来

    def f1():  # f1就叫做闭包函数
      def fuck():
        print('sb')
      return fuck
    
  2. 将函数调用的过程封装成一个函数

    def f1(url):
      def fuck():
        print(url)
      return fuck
    baidu=f1('www.baidu.com')
    baidu()
    
  3. 通过将内层函数名作为外层函数的返回值,将内部函数进行定义,将函数的参数放到外层函数的型参位置,将外层函数的调用赋值给一个变量名,因外层函数的返回值为内层函数,故改变量等于一个传过参数的内层函数,使用时直接加括号就行了。

02.装饰器

  1. 装饰器;用函数装饰函数

  2. 使用装饰器的两个规定

    1. 不改变被修饰对象的源代码
    2. 不改变修饰对象的调用方式
  3. 怎么用装饰器

    def sb():
        print('123')
    
    def f1(url):
      def fuck():
        print(233)
        url()
        print(332)
      return fuck
    
    sb=f1(sb)
    sb()
    

    通过一个闭包函数实现对被修饰函数进行修改

  4. 完善装饰器

    如果被修饰函数又返回值的话
    chuy
    def sb():
        return 123
    def f1(url):
      def fuck():
        print(233)
        res=url()
        print(332)
        return res
      return fuck
    
    sb=f1(sb)
    sb()
    
  5. 可以传参的装饰器

    def sb(x,y):
        if x>y:
            print(123)
            return x
        else:
            print(321)
            return y
    def f1(res):
        def f2(*args,**kwargs):
            print('************')
            res(*args,**kwargs)
            print('************')
            return res
        return f2
    sb=f1(sb)
    sb(20,10)
    
  6. 装饰器语法糖;通过在被装饰函数上面加上@装饰函数名来自动进行赋值操作

    def f1(res):
        def f2(*args,**kwargs):
            print('************')
            res(*args,**kwargs)
            print('************')
            return res
        return f2
    @f1
    def sb(x,y):
        if x>y:
            print(123)
            return x
        else:
            print(321)
            return y
    sb(20,10)
    
  7. 对装饰器传参,就是在原有的装饰器基础上再包一层装饰函数

    def f1(z):
        def f2(res):
            if z>10:
                a='大于10'
            else:
                a='小于10'
            def f3(*args,**kwargs):
                print(a)
                ss=res(*args,**kwargs)
                return ss
            return f3
        return f2
    @f1(12)
    def sb(x,y):
        if x>y:
            return x
        else:
            return y
    print(sb(99,88))
    
原文地址:https://www.cnblogs.com/luocongyu/p/11574553.html