random.random random.random()用於生成一個0到1的隨機符點數: 0 <= n < 1.0 random.uniform random.uniform(a, b),用於生成一個指定範圍內的隨機符點數,兩個參數其中一個是上限,一個是下限。 如果a > b,則生成的隨機數n: ...
1.引入為什麼需要TypeVar
PEP484的作者希望藉助typing模塊引入類型提示,不改動語言的其它部分。通過精巧的元編程技術,讓類支持[]運算不成問題。但是方括弧內的T變數必須在某處定義,否則要大範圍改動python解釋器才能讓泛型支持特殊的[]表示法。
鑒於此,我們增加了typing.TypeVar構造函數,把變數名稱引入當前命名空間。
由於java,c#和TypingScript等語言不要求實現聲明類型變數的名稱,因此沒有與python的TypeVar類對應的結構。
2.示例
from collections.abc import Iterable
from typing import TypeVar
T = TypeVar('T')
def mode(data: Iterable[T]) -> T:
return data[1:]
if __name__ == '__main__':
list1 = [1.1,1.2,1.3,1.4,1.5]
list2 = [1,2,3,4,5]
data1 = mode(list1)
data2 = mode(list2)
print(data1)
print(data2)
3.受限的TypeVar
TypeVar還接受一些位置參數,以對類型參數施加限制。
from collections.abc import Iterable
from decimal import Decimal
from fractions import Fraction
from typing import TypeVar
NumberT = TypeVar('NumberT', float, Decimal, Fraction)
def mode(data: Iterable[NumberT]) -> NumberT:
...
4.有界的TypeVar
from collections.abc import Iterable, Hashable
def mode(data: Iterable[Hashable]) -> Hashable:
現在的問題是,返回的項是Hashable類型。Hashable是一個抽象基類。只實現了__hash__方法。因此,除了調用hash(),類型檢查工具不會允許對返回值做其它任何操作。
所以,這麼做沒有任何意義。解決方法是使用TypeVar的另一個可選參數,即關鍵字參數bound。這個參數會為可接受的類型設定一個上邊界。
下麵的實例使用bound=Hashable指明,類型參數可以是Hashable或它的任何子類型。
from collections import Counter
from collections.abc import Iterable, Hashable
from typing import TypeVar
#Python學習交流群:711312441
HashableT = TypeVar('HashableT', bound=Hashable)
def mode(data: Iterable[HashableT]) -> HashableT:
pairs = Counter(data).most_common(1)
if len(pairs) == 0:
raise ValueError('no mode for empty data')
return pairs[0][0]