1. 程式人生 > 其它 >python中的型別提示(定義函式時加入箭頭->)

python中的型別提示(定義函式時加入箭頭->)

看到一些程式碼在定義函式時,在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實參,並不會報錯,而是繼續進行函式中的加法運算。如果傳入的兩個實參無法進行函式中規定的運算,則會正常報錯。