Python 函式那不為人知的一面

2022-09-24 14:33:24 字數 1286 閱讀 6289

通常我們定義乙個函式,然後呼叫該函式時,函式相關的**才開始執行。可是很多人並不知道,當我們定義函式時,一些**就開始執行了。今天就來說說函式這個不為人知的一面。

通常我們定義乙個函式,然後呼叫該函式時,函式相關的**才開始執行。可是很多人並不知道,當我們定義函式時,一些**就開始執行了。今天就來說說函式這個不為人知的一面。

先看一段**:

def do_something(opt: print('引數 opt'), arg=print('引數 arg')) -&g程式設計客棧t; print('函式的返回值'):

print("do something runing")

if __name__ == '__main__':

pass

上面的**我們定義來乙個函式,但是並沒有呼叫它,那麼它會輸出資訊嗎?

會的,引數裡無論是型別提示部分,還是預設賦值部分,還是返回值的型別提示,裡面的語句都會被執行,結果如下:

這程式設計客棧個做法我自己是很少見的。把 print 函式換成開啟檔案、連線資料www.cppcns.com庫之類的操作,也都會被執行。

不過通常情況下,引數都是不可變型別,如果傳入可變型別,可能每次的函式呼叫,其結果都會被改變,例如:

def do_something(opt程式設計客棧: print("引數 opt"), arg=) -> print("函式的返回值"):

print("do something runing")

print(f"")

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.append(0)

if __name__ == "__main__":

print(f"")

print(f"")

#do_something.__annotations__ =

#do_something.__defaults__ = (2,)

前端不為人知的一面

如果說上面那條小秘密知道的人還算多的話,這條秘笈知道的人就要少一些了,在非ie核心的瀏覽器位址列可以直接執行html 比如在位址列輸入以下 然後回車執行,會出現指定的頁面內容。還是瀏覽器位址列上做文章,將以下 貼到位址列執行後瀏覽器變成了乙個原始而簡單的編輯器,與windows自帶的notepad一...

各種排序不為人知的真相

常用的排序演算法有 交換排序 氣泡排序 快速排序 選擇排序 直接選擇排序 堆排序 插入排序 直接插入排序 二分插入排序 希爾排序 歸併排序 基數排序 直接選擇排序和氣泡排序的比較 void bubblesort vector list void choosesort vector list swap...

不為人知的NodeJS 1

2.filename變數與 dirname變數 3.事件機制 用於進行標準輸出流的輸出,即在控制台中顯示一行字串用於進行標準錯誤輸出流的輸出,即向控制台輸出一條錯誤資訊用於檢視乙個物件中的內容並且將物件的資訊輸出到控制台中 console.time 標記開始時間 console.timeend 標記...