zoukankan      html  css  js  c++  java
  • python 函数高级功能

    闭包

    我们可以将闭包理解为一种特殊的函数,这种函数由两个函数的嵌套组成,且称之为外函数和内函数,外函数返回值是内函数的引用,此时就构成了闭包。

    # 闭包
    # 外部函数的参数被内部函数引用,内部函数对外部参数的参数进行处理,返回一个结果,外部函数返回内部函数(引用内部函数)
    def a_func(n):
        def b_func(m):
           return n*m
        return b_func # 注意是没有(),不是b_func()
        # 外函数返回内函数的引用,这里的引用指的是内函数b_func在内存中的起始地址
    
    a=a_func(3)
    print(a(4))
    print(a(10))
    

    装饰器

    装饰函数,增加被装饰函数的功能

    装饰器不带参数,被装饰参数不带参数

    import time
    
    # 定义装饰函数
    
    def timer(func):
        # 统计执行时间
        def wrapper():
            start_time=time.time()
            func()
            stop_time=time.time()
            print('运行的时间 %s' %(stop_time-start_time))
        return wrapper
    
    # 定义被装饰函数
    @timer
    def i_can_sleep():
        time.sleep(3)
    
    # 调用i_can-sleep方法
    i_can_sleep()
    
    # 执行顺序,首先将i_can_sleep()传给timer,也就是timer(i_can_sleep());
    # 然后执行wrapper()函数
    
    # 装饰器与闭包的不同点,装饰函数传入的参数是一个函数,闭包传入的参数
    

    被装饰函数带参数

    # 被装饰函数带参数,也就是装饰函数的外部函数带参数
    # 发现需要先定义装饰函数
    def tips(func):
        def nei(a,b):  # 装饰函数的内部函数需要接收被装饰函数的参数
            print('start')
            func(a,b)
            print('end')
        return nei
    
    @tips
    def sum(a,b):
        print(a+b)
    
    a=sum(8,9)
    

    装饰器带参数

    ef new_tips(args):
        def tips(func):
            def nei(a,b):  # 装饰函数的内部函数需要接收被装饰函数的参数
                print('start to %s' % args)
                func(a,b)
                print('end to %s' % args)
            return nei
        return tips
    
    @new_tips('add')
    def sum(a,b):
        print(a+b)
    
    a=sum(8,9)
    

    还可以获取被装饰函数的一些信息

    def new_tips(args):
        def tips(func):
            def nei(a,b):  # 装饰函数内部函数需要接收被装饰函数的参数
                print('func %s start to %s' % (func.__name__,args))
                func(a,b)
                print('func %s end to %s' % (func.__name__,args))
            return nei
        return tips
    
    @new_tips('add_module')
    def sum(a,b):
        print(a+b)
    
    a=sum(8,9)
    
    @new_tips('sub_module')
    def sub(a,b):
        print(a-b)
    
    

    全部代码

    # 装饰器
    import time
    
    # 定义装饰函数
    # 统计执行时间
    def timer(func):
        def wrapper():
            start_time=time.time()
            func()
            stop_time=time.time()
            print('运行的时间 %s' %(stop_time-start_time))
        return wrapper
    #
    # # 定义被装饰函数
    @timer
    def i_can_sleep():
        time.sleep(3)
    
    # 调用i_can-sleep方法
    i_can_sleep()
    
    # 执行顺序,首先将i_can_sleep()传给timer,也就是timer(i_can_sleep());
    # 然后执行wrapper()函数
    
    # 装饰器与闭包的不同点,装饰函数传入的参数是一个函数,闭包传入的参数是一个变量
    
    print('----------------------------------------------被装饰参数带参数------------------------------------------------')
    
    # 被装饰函数带参数,也就是装饰函数的外部函数带参数
    # 发现需要先定义装饰函数
    def tips(func):
        def nei(a,b):  # 装饰函数内部函数需要接收被装饰函数的参数
            print('start')
            func(a,b)
            print('end')
        return nei
    
    @tips
    def sum(a,b):
        print(a+b)
    
    a=sum(8,9)
    
    
    print('----------------------------------------------装饰器带参数------------------------------------------------')
    # 装饰器带参数
    def new_tips(args):
        def tips(func):
            def nei(a,b):  # 装饰函数内部函数需要接收被装饰函数的参数
                print('start to %s' % args)
                func(a,b)
                print('end to %s' % args)
            return nei
        return tips
    
    @new_tips('add_module')
    def sum(a,b):
        print(a+b)
    
    a=sum(8,9)
    
    @new_tips('sub_module')
    def sub(a,b):
        print(a-b)
    
    b=sub(102,98)
    
    print('--------------------------------------------获取被装饰函数的一些信息--------------------------------------------------')
    # 还可以获取被装饰函数的一些信息
    def new_tips(args):
        def tips(func):
            def nei(a,b):  # 装饰函数内部函数需要接收被装饰函数的参数
                print('func %s start to %s' % (func.__name__,args))
                func(a,b)
                print('func %s end to %s' % (func.__name__,args))
            return nei
        return tips
    
    @new_tips('add_module')
    def sum(a,b):
        print(a+b)
    
    a=sum(8,9)
    
    @new_tips('sub_module')
    def sub(a,b):
        print(a-b)
    
    b=sub(10,7)
    

    执行结果:

    运行的时间 3.0007877349853516
    ----------------------------------------------被装饰参数带参数------------------------------------------------
    start
    17
    end
    ----------------------------------------------装饰器带参数------------------------------------------------
    start to add_module
    17
    end to add_module
    start to sub_module
    4
    end to sub_module
    --------------------------------------------获取被装饰函数的一些信息--------------------------------------------------
    func sum start to add_module
    17
    func sum end to add_module
    func sub start to sub_module
    3
    func sub end to sub_module
    
    Process finished with exit code 0
    
    
  • 相关阅读:
    深度图像的获取原理
    第二章 排序 || 第19节 最短子数组练习题
    第二章 排序 || 第18节 有序矩阵查找练习题
    tensorflow 之tf.nn.depthwise_conv2d and separable_conv2d实现及原理
    tensorflow 之常见模块conv,bn...实现
    机器学习中的训练数据不平衡问题
    一些智力题
    Pytoch 抽取中间层特征方法
    娱乐一下
    java访问ad域
  • 原文地址:https://www.cnblogs.com/Uni-Hoang/p/13823652.html
Copyright © 2011-2022 走看看