Python 函數(shù)那不為人知的一面
通常我們定義一個函數(shù),然后調(diào)用該函數(shù)時,函數(shù)相關(guān)的代碼才開始執(zhí)行。可是很多人并不知道,當我們定義函數(shù)時,一些代碼就開始執(zhí)行了。今天就來說說函數(shù)這個不為人知的一面。
通常我們定義一個函數(shù),然后調(diào)用該函數(shù)時,函數(shù)相關(guān)的代碼才開始執(zhí)行??墒呛芏嗳瞬⒉恢?,當我們定義函數(shù)時,一些代碼就開始執(zhí)行了。今天就來說說函數(shù)這個不為人知的一面。
先看一段代碼:
def do_something(opt: print('參數(shù) opt'), arg=print('參數(shù) arg')) -> print('函數(shù)的返回值'):
print("do something runing")
if __name__ == '__main__':
pass
上面的代碼我們定義來一個函數(shù),但是并沒有調(diào)用它,那么它會輸出信息嗎?
會的,參數(shù)里無論是類型提示部分,還是默認賦值部分,還是返回值的類型提示,里面的語句都會被執(zhí)行,結(jié)果如下:
這個做法我自己是很少見的。把 print 函數(shù)換成打開文件、連接數(shù)據(jù)庫之類的操作,也都會被執(zhí)行。
不過通常情況下,參數(shù)都是不可變類型,如果傳入可變類型,可能每次的函數(shù)調(diào)用,其結(jié)果都會被改變,例如:
def do_something(opt: print("參數(shù) opt"), arg=[]) -> print("函數(shù)的返回值"):
print("do something runing")
print(f"{arg = }")
arg.append(0)
if __name__ == "__main__":
do_something(opt=1)
do_something(opt=1)
運行結(jié)果如下:
可以發(fā)現(xiàn),調(diào)用兩次函數(shù) do_something,雖然并沒有傳入 arg 參數(shù),arg 的值已經(jīng)發(fā)送了變化。如果不注意這點,可能會有 bug 發(fā)生。在 Pythcarm 中,會警告我們 arg 是可變對象:
如果要獲取函數(shù)的類型提示、默認值,可以這樣:
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,)
到此這篇關(guān)于Python 函數(shù)那不為人知的一面的文章就介紹到這了,更多相關(guān)Python 函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pytorch中transform.Compose()用法詳解
PyTorch是一個開源的Python機器學習庫,基于Torch,用于自然語言處理等應用程序,這篇文章主要介紹了pytorch中transform.Compose()用法,需要的朋友可以參考下2023-10-10
基于Python執(zhí)行dos命令并獲取輸出的結(jié)果
這篇文章主要介紹了基于Python執(zhí)行dos命令并獲取輸出的結(jié)果,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-12-12





