理解Python函数至关重要

现在我们已经了解了如何自定义Python装饰器,但应该如何理解装饰器呢?到底是什么原理呢?要想理解Python装饰器,首先应该知道Python函数就是对象,看下面的例子:


  1. def shout(word="yes"): 
  2.     return word.capitalize() 
  3. # 输出:Yes 
  4. print(shout()) 
  5. # 将shout函数赋给另一个变量,这里并没有使用圆括号, 
  6. # 所以不是调用函数,而是将函数赋给另一个变量,也就是为函数起一个别名 
  7. scream = shout 
  8.  
  9. # 可以用scream调用shout函数 
  10. # 输出:Yes 
  11. print(scream()) 
  12.  
  13. # 目前,同一个函数,有两个引用:scream和shout,可以使用del删除一个引用 
  14. del shout 
  15. try: 
  16.     # 该引用删除后,就不能通过该引用调用函数了 
  17.     print(shout()) 
  18. except NameError as e: 
  19.     print(e) 
  20.  
  21. # 仍然可以通过另外一个引用调用函数 
  22. # 输出:Yes 
  23. print(scream()) 

这段代码演示了把函数作为对象使用。如果加一对圆括号,就是调用函数,如果不加一对圆括号,函数就是对象,可以赋给另一个变量,也可以作为函数参数值传入函数。

由于Python函数本身是对象,所以可以在任何地方定义,包括函数内容,这就是Python内建函数,代码如下:


  1. def talk(): 
  2.     # 内嵌函数 
  3.     def whisper(word="YES"): 
  4.         return word.lower()+"…" 
  5.  
  6.     # 调用内嵌函数 
  7.     print(whisper()) 
  8.  
  9. # 调用talk,whisper函数在talk内部被调用 
  10. # 输出:yes… 
  11. talk() 
  12.  
  13. try: 
  14.     # 但whisper函数在talk函数外部并不可见,所以调用会哦抛出异常 
  15.     print(whisper()) 
  16. except NameError as e: 
  17.     print(e) 

现在来总结下,Python函数的特性如下:

(1)可以将函数本身赋给一个变量,或作为参数值传入函数(方法);

(2)可以在一个函数(方法)内部定义;

有了这两个特性,就意味着函数可以被另一个函数返回,看下面的代码:


  1. def getTalk(kind="shout"): 
  2.  
  3.     #  定义第1个内嵌函数 
  4.     def shout(word="yes"): 
  5.         return word.capitalize()+"!" 
  6.     # 定义第2个内嵌函数 
  7.     def whisper(word="yes") : 
  8.         return word.lower()+"…" 
  9.  
  10.     # 根据参数值返回特定的函数 
  11.     if kind == "shout"
  12.         # 这里没有使用一对圆括号,所以不是调用函数,而是返回函数本身 
  13.         return shout 
  14.     else
  15.         return whisper 
  16.  
  17.  
  18. # talk是函数本身,并没有被调用 
  19. talk = getTalk() 
  20.  
  21. # 输出函数本身 
  22. # 输出:<function getTalk.<locals>.shout at 0x7f93a00475e0> 
  23. print(talk) 
  24.  
  25. # 调用talk函数(其实是shout函数) 
  26. print(talk()) 
  27. #outputs : Yes! 
  28.  
  29. # 调用whisper函数 
  30. print(getTalk("whisper")()) 

在这段代码中,getTalk函数根据kind参数的值返回不同的内嵌函数,所以getTalk函数的返回值是函数本身,或称为函数对象,如果要调用函数,需要使用一对圆括号,如getTalk()()。

【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章