zoukankan      html  css  js  c++  java
  • python关于函数调用作为参数的说明&&装饰器

    python关于函数调用作为参数的说明&&装饰器

    简单的:

    先看代码:

    def out():
        print('out')
        
        def inner():
            return 'inner'
        
        return inner()
    
    
    if __name__ == '__main__':
        print(type(out()))
    

    输出结果:

    out
    <class 'str'>
    

    我们看到type函数的参数是out(),执行的过程就是:out() --> inner() --> type(inner()),type里的参数实际上是inner, 最后的打印结果就是<class 'str'>。代码通过执行out函数,得到最终的参数。若改成print('inner')结果就是None类型。

    复杂的:

    代码:

    import time
    import functools
    
    
    def timing(status='Train'):
        print('1')
    
        def dec(func):
            print('2')
    
            @functools.wraps(func)
            def wrapper(*args, **kwargs):
                start = time.time()
                func1 = func(*args, **kwargs)  
                print('[%s] time: %.3f s ' % (status, time.time() - start))
                return func1
    
            return wrapper
    
        return dec
    
    
    @timing(status='Train')
    def Training():
        time.sleep(3)
        print('over')
    
    if __name__ == '__main__':
        print('main')
        print('*' * 10)
        print(type(Training()))
    
    

    输出结果:

    1
    2
    main
    **********
    over
    [Train] time: 3.000 s
    <class 'NoneType'>
    

    关于这段带代码,可能疑问点在于在main前面的‘1’‘1’,导致这个的原因是因为timing()函数作为装饰器时执行函数的预处理功能,先timing()函数的执行,先返回dec然后执行dec(),且Training()作为该函数的参数,即dec(Training()),然后就是wrapper()函数。此时Training = timing(dec(Training())),这就是其中的‘1’‘2’的由来,也就是预处理完毕。然后就执行main函数的代码。当执行print(type(Training()))时,就就执行wrapper(),然后就是func1 = fun() = Training() = None。因为Training()函数是打印一句话,所以说返回值为None,所以最后的结果就是None Type。

  • 相关阅读:
    volcanol的工控博客
    volcanol的工控博客
    volcanol的工控博客
    volcanol的工控博客
    volcanol的工控博客
    volcanol的工控博客
    volcanol的工控博客
    volcanol的工控博客
    volcanol的工控博客
    volcanol的工控博客
  • 原文地址:https://www.cnblogs.com/JonnyJiang-zh/p/13210390.html
Copyright © 2011-2022 走看看