Python 函數那不為人知的一面
通常我們定義一個函數,然后調用該函數時,函數相關的代碼才開始執(zhí)行。可是很多人并不知道,當我們定義函數時,一些代碼就開始執(zhí)行了。今天就來說說函數這個不為人知的一面。

通常我們定義一個函數,然后調用該函數時,函數相關的代碼才開始執(zhí)行??墒呛芏嗳瞬⒉恢?,當我們定義函數時,一些代碼就開始執(zhí)行了。今天就來說說函數這個不為人知的一面。
先看一段代碼:
def do_something(opt: print('參數 opt'), arg=print('參數 arg')) -> print('函數的返回值'):
print("do something runing")
if __name__ == '__main__':
pass
上面的代碼我們定義來一個函數,但是并沒有調用它,那么它會輸出信息嗎?
會的,參數里無論是類型提示部分,還是默認賦值部分,還是返回值的類型提示,里面的語句都會被執(zhí)行,結果如下:

這個做法我自己是很少見的。把 print 函數換成打開文件、連接數據庫之類的操作,也都會被執(zhí)行。
不過通常情況下,參數都是不可變類型,如果傳入可變類型,可能每次的函數調用,其結果都會被改變,例如:
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)
運行結果如下:

可以發(fā)現,調用兩次函數 do_something,雖然并沒有傳入 arg 參數,arg 的值已經發(fā)送了變化。如果不注意這點,可能會有 bug 發(fā)生。在 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 函數內容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持本站!
版權聲明:本站文章來源標注為YINGSOO的內容版權均為本站所有,歡迎引用、轉載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網站,禁止在非maisonbaluchon.cn所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內容來源于網友推薦、互聯網收集整理而來,僅供學習參考,不代表本站立場,如有內容涉嫌侵權,請聯系alex-e#qq.com處理。
關注官方微信