Python 函數那不為人知的一面
通常我們定義一個函數,然后調用該函數時,函數相關的代碼才開始執行。可是很多人并不知道,當我們定義函數時,一些代碼就開始執行了。今天就來說說函數這個不為人知的一面。
先看一段代碼:
- def do_something(opt: print('參數 opt'), arg=print('參數 arg')) -> print('函數的返回值'):
- print("do something runing")
- if __name__ == '__main__':
- pass
上面的代碼我們定義來一個函數,但是并沒有調用它,那么它會輸出信息嗎?
會的,參數里無論是類型提示部分,還是默認賦值部分,還是返回值的類型提示,里面的語句都會被執行,結果如下:
這個做法我自己是很少見的。把 print 函數換成打開文件、連接數據庫之類的操作,也都會被執行。
不過通常情況下,參數都是不可變類型,如果傳入可變類型,可能每次的函數調用,其結果都會被改變,例如:
- def do_something(opt: print("參數 opt"), arg=[]) -> print("函數的返回值"):
- print("do something runing")
- print(f"{arg = }")
- arg.append(0)
- if __name__ == "__main__":
- do_something(opt=1)
- do_something(opt=1)
運行結果如下:
可以發現,調用兩次函數 do_something,雖然并沒有傳入 arg 參數,arg 的值已經發送了變化。如果不注意這點,可能會有 bug 發生。在 Pythcarm 中,會警告我們 arg 是可變對象:
如果要獲取函數的類型提示、默認值,可以這樣:
- def do_something(opt: 1, arg=2) -> 3:
- print("do something runing")
- 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,)
本文轉載自微信公眾號「Python七號」,可以通過以下二維碼關注。轉載本文請聯系Python七號公眾號。