当前位置: 首页 > 科技观察

Python函数的隐藏面

时间:2023-03-21 00:46:37 科技观察

通常我们定义一个函数,然后当我们调用这个函数的时候,和这个函数相关的代码就开始执行了。但是很多人不知道,当我们定义一个函数的时候,一些代码就开始执行了。今天,我们就来说说函数不为人知的一面。先看一段代码:defdo_something(opt:print('parameteropt'),arg=print('parameterarg'))->print('函数返回值'):print("dosomethingrunning")if__name__=='__main__在上面的代码':pass中,我们定义了一个函数,但是没有调用它,那么它会输出信息吗?是的,无论是类型提示部分,默认赋值部分,还是参数中返回值的类型提示,里面的语句都会被执行,结果如下:这种做法对我来说是很少见的。将打印功能替换为打开文件和连接数据库等操作也会被执行。但是,在正常情况下,参数是不可变类型。如果传入变量类型,则每次函数调用的结果可能会发生变化,例如:defdo_something(opt:print("参数opt"),arg=[])->print("函数的返回值"):print("dosomethingrunning")print(f"{arg=}")arg.append(0)if__name__=="__main__":do_something(opt=1)do_something(opt=1)的结果如下:可以发现函数do_something被调用了两次,虽然没有传入arg参数,但是arg的值已经改变了。如果不注意这一点,可能会出现错误。在Pythcarm中,我们会被警告arg是一个可变对象:如果你想得到函数的类型提示和默认值,你可以这样做:defdo_something(opt:1,arg=2)->3:print("dosomethingrunning")print(f"{arg=}")arg.append(0)if__name__=="__main__":print(f"{do_something.__annotations__=}")print(f"{do_something.__defaults__=}")#do_something.__annotations__={'opt':1,'return':3}#do_something.__defaults__=(2,)本文转载自微信公众号「Python7号」,可以通过关注以下二维码。转载本文请联系Python七号公众号。