python中的型別提示(定義函式時加入箭頭->)
阿新 • • 發佈:2022-03-03
看到一些程式碼在定義函式時,在def那一行後面會加一個-> 。它有個專門的名詞叫 type hint,即型別提示。
官方網站:https://www.python.org/dev/peps/pep-0484/
比如
def add(a:int, b:int) -> int: return a+b
這個表示並沒有多麼的神奇,意思是:告訴你期待的輸入型別和輸出型別。上面程式碼期待的型別為int。
這個網站(https://mypy-lang.org,有牆)對這個功能進行了說明:
其實就是變數型別的動態定義和靜態定義的區別。同樣一個函式可以不加->表示動態定義和加->表示靜態定義
對於上面左邊函式,對n的資料型別不一定為int,也可以為float等等。。而右邊限定了只能int。
這就是動靜態的區別。
我試著尋找這兩者的區別和各自優勢。有以下發現:
1. 將動態型別函式改為靜態型別函式並不能使計算加快;
2. 就算你靜態限定了int,輸入為float的時候也不會報錯,輸出也不會變成期待的int型別。所以在使用上,動靜態型別並沒有區別。
那麼這個type hint看起來是比較雞肋。
它的用處有以下:
1. 增加程式碼可讀性;
2. 比較容易用其他語言改寫。
例子:
#!/usr/bin/python3 # -*- coding:utf-8 -*- def twoSum(num1: int, num2: int=100) -> int: sum= num1 + num2 return sum if __name__ == "__main__": print(twoSum.__annotations__) print(twoSum(1,2)) print(twoSum(1)) print(twoSum('I love ','Arsenal')) #print(twoSum('Arsenal'))
{'num1': <class 'int'>, 'num2': <class 'int'>, 'return': <class 'int'>}3 101 I love Arsenal
幾點解釋:
- 第一行輸出中的__annotations__是函式的保留屬性,儲存的是函式宣告中的註釋內容,比如我們使用的對引數"num1","num2"和返回值的建議型別。
- 第二行輸出是正常用法。
- 第三行輸出驗證了:註釋內容後可以跟等號"=",意思為未傳入實參時,該引數獲得的預設值
- 第四行輸出則驗證了該解釋說明符並非強制檢查,我們傳入了兩個str實參,並不會報錯,而是繼續進行函式中的加法運算。如果傳入的兩個實參無法進行函式中規定的運算,則會正常報錯。