Python 函数那不为人知的一面

开发 后端
通常我们定义一个函数,然后调用该函数时,函数相关的代码才开始执行。可是很多人并不知道,当我们定义函数时,一些代码就开始执行了。今天就来说说函数这个不为人知的一面。

[[434013]]

通常我们定义一个函数,然后调用该函数时,函数相关的代码才开始执行。可是很多人并不知道,当我们定义函数时,一些代码就开始执行了。今天就来说说函数这个不为人知的一面。

先看一段代码:

  1. def do_something(opt: print('参数 opt'), arg=print('参数 arg')) -> print('函数的返回值'): 
  2.     print("do something runing"
  3.  
  4. if __name__ == '__main__'
  5.     pass 

上面的代码我们定义来一个函数,但是并没有调用它,那么它会输出信息吗?

会的,参数里无论是类型提示部分,还是默认赋值部分,还是返回值的类型提示,里面的语句都会被执行,结果如下:

这个做法我自己是很少见的。把 print 函数换成打开文件、连接数据库之类的操作,也都会被执行。

不过通常情况下,参数都是不可变类型,如果传入可变类型,可能每次的函数调用,其结果都会被改变,例如:

  1. def do_something(opt: print("参数 opt"), arg=[]) -> print("函数的返回值"): 
  2.     print("do something runing"
  3.     print(f"{arg = }"
  4.     arg.append(0) 
  5.  
  6.  
  7. if __name__ == "__main__"
  8.     do_something(opt=1) 
  9.     do_something(opt=1) 

运行结果如下:

可以发现,调用两次函数 do_something,虽然并没有传入 arg 参数,arg 的值已经发送了变化。如果不注意这点,可能会有 bug 发生。在 Pythcarm 中,会警告我们 arg 是可变对象:

如果要获取函数的类型提示、默认值,可以这样:

  1. def do_something(opt: 1, arg=2) -> 3: 
  2.     print("do something runing"
  3.     print(f"{arg = }"
  4.     arg.append(0) 
  5.  
  6.  
  7. if __name__ == "__main__"
  8.     print(f"{do_something.__annotations__ = }"
  9.     print(f"{do_something.__defaults__ = }"
  10.  
  11. #do_something.__annotations__ = {'opt': 1, 'return': 3} 
  12. #do_something.__defaults__ = (2,) 

本文转载自微信公众号「Python七号」,可以通过以下二维码关注。转载本文请联系Python七号公众号。

 

责任编辑:武晓燕 来源: Python七号
相关推荐

2013-05-15 10:08:27

2021-06-23 14:12:40

算法队列

2014-04-11 14:22:25

前端前端知识

2015-12-21 09:39:23

2013-07-16 13:59:15

空姐事件移动市场华强北生态链

2010-08-05 11:14:12

Flex优势

2020-02-20 12:02:32

Python数据函数

2010-09-03 08:52:38

CSS

2010-04-19 16:09:22

Oracle控制文件

2013-08-09 09:27:08

vCentervSphere

2018-11-15 14:52:18

Windows 10Windows升级

2023-11-09 08:05:40

IDEA开发工具

2024-05-17 13:08:46

Python代码

2011-10-19 16:19:27

iOS 5苹果

2012-11-30 14:13:01

2011-11-14 10:06:16

IBM大型机支持Windows系统POWER7

2010-09-06 14:19:54

CSS

2021-02-05 09:58:52

程序员Windows系统

2017-03-28 08:40:14

2011-11-08 13:41:27

苹果siri人工智能数据中心
点赞
收藏

51CTO技术栈公众号