typing導入Pythonのデータ型モジュール、collections集合モジュール
16561 ワード
一、typingモジュール
1、typingモジュールの役割タイプチェックで、実行時にパラメータと戻り値タイプが一致しないようにします. は、開発ドキュメントの追加説明として、ユーザが呼び出したときにパラメータタイプを入力および返すのを容易にする. このモジュールが追加された後、プログラムの実行に影響を与えることはなく、正式なエラーは報告されず、注意するしかありません. 注意:typingモジュールはpython 3のみです.5以上のバージョンでのみ使用できますが、pycharmではtypingチェックがサポートされています.
2、typingモジュールの使用パラメータの入力時に「パラメータ名:タイプ」という形式でパラメータのタイプを宣言する. は、結果のタイプを「->結果タイプ」として宣言した結果を返します.
呼び出し時にパラメータのタイプが正しくないpycharmではアラートが表示されますが、プログラムの実行には影響しません.
リストリストなどについては、より具体的に規定することもできます.「->List[str]」のように、リストを返し、要素が文字列であることを規定します.
4、typing常用タイプ int、long、float:整型、長整形、浮動小数点型 bool、str:ブール型、文字列タイプ List、Tuple、Dict、Set:リスト、タプル、辞書、集合 Iterable、Iterator:反復可能タイプ、反復器タイプ Generator:ジェネレータタイプ 二、collections集合
collectionsはPython内に構築された集合モジュールであり、多くの有用な集合クラスを提供しています.
1、namedtuple:tupleオブジェクトの命名
namedtupleは、カスタムtupleオブジェクトを作成し、tuple要素の個数を規定し、インデックスではなく属性でtupleの要素を参照できる関数です.
namedtuple('名前',[プロパティリスト])
これにより、namedtupleを使用すると、tupleの不変性を備え、属性に基づいて参照することができ、非常に便利なデータ型を簡単に定義することができます.
tupleは不変の集合を表すことができることを知っています.例えば、1つの点の2次元座標は次のように表すことができます.
しかし、(1,2)を見ると、このtupleが座標を表すために使われていることはわかりにくい.
classを定義してまた大きな問題をしました.その時、namedtupleは役に立ちました.
作成されたPointオブジェクトがtupleのサブクラスであることを確認できます.
同様に、座標と半径で円を表す場合は、namedtupleで定義することもできます.
2、deque:両端キュー
リストを使用してデータを格納する場合、インデックスによる要素へのアクセスは速いが、リストが線形格納であるため、リストが大きい場合、挿入と削除の効率は低い.
dequeは、挿入および削除操作を効率的に実現するための双方向リストであり、キューおよびスタックに適しています.
dequeはlistのappend()とpop()に加えてappendleft()とpopleft()をサポートし、ヘッダに要素を非常に効率的に追加または削除することができます.
3、defaultdict:デフォルト辞書
dictを使用する場合、参照するKeyが存在しない場合、KeyErrorが放出されます.キーが存在しない場合は、デフォルト値を返します.defaultdictを使用します.
デフォルト値は呼び出し関数で返され、defaultdictオブジェクトの作成時に関数が入力されます.
キーが存在しない場合にデフォルト値を返す以外は、defaultdictの他の動作はdictと全く同じです.
4、OrderedDict:順序辞書
dictを使用する場合、Keyは無秩序です.dictを反復すると、Keyの順序を決定できません.
キーの順序を維持するには、OrderedDictを使用します.
OrderedDictのキーは、キー自体がソートされていない挿入順に並べられます.
OrderedDictは、FIFO(先行先出)のdictを実現することができ、容量が制限を超えた場合、最初に追加したKeyを削除します.
5、Counter:カウンタ
Counterは簡単なカウンタです.
Counterは実際にはdictのサブクラスでもあり、以下の結果から、文字'g'、'm'、'r'が2回ずつ現れ、他の文字が1回ずつ現れていることがわかります.
たとえば、統計文字の数:
1、typingモジュールの役割
2、typingモジュールの使用
呼び出し時にパラメータのタイプが正しくないpycharmではアラートが表示されますが、プログラムの実行には影響しません.
from typing import List, Tuple, Dict
def add(a: int, c: str, d: float, b: bool) -> Tuple[List, Tuple, Dict, bool]:
list1 = list(range(a))
tup = (c, c, c)
d = {"a": d}
bl = b
return list1, tup, d, bl
print(add(5, "hhhh", 2.3, False))
# ([0, 1, 2, 3, 4], ('hhhh', 'hhhh', 'hhhh'), {'a': 2.3}, False)
リストリストなどについては、より具体的に規定することもできます.「->List[str]」のように、リストを返し、要素が文字列であることを規定します.
from typing import List
def func(a: int, b: str) -> List[int or str] : # or
list1 = []
list1.append(a)
list1.append(b)
return list1
4、typing常用タイプ
collectionsはPython内に構築された集合モジュールであり、多くの有用な集合クラスを提供しています.
1、namedtuple:tupleオブジェクトの命名
namedtupleは、カスタムtupleオブジェクトを作成し、tuple要素の個数を規定し、インデックスではなく属性でtupleの要素を参照できる関数です.
namedtuple('名前',[プロパティリスト])
これにより、namedtupleを使用すると、tupleの不変性を備え、属性に基づいて参照することができ、非常に便利なデータ型を簡単に定義することができます.
tupleは不変の集合を表すことができることを知っています.例えば、1つの点の2次元座標は次のように表すことができます.
p = (1,2)
しかし、(1,2)を見ると、このtupleが座標を表すために使われていることはわかりにくい.
classを定義してまた大きな問題をしました.その時、namedtupleは役に立ちました.
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
p.x # 1
p.y #2
作成されたPointオブジェクトがtupleのサブクラスであることを確認できます.
isinstance(p, Point) #True
isinstance(p, tuple) #True
同様に、座標と半径で円を表す場合は、namedtupleで定義することもできます.
Circle = namedtuple('Circle', ['x', 'y', 'r'])
2、deque:両端キュー
リストを使用してデータを格納する場合、インデックスによる要素へのアクセスは速いが、リストが線形格納であるため、リストが大きい場合、挿入と削除の効率は低い.
dequeは、挿入および削除操作を効率的に実現するための双方向リストであり、キューおよびスタックに適しています.
dequeはlistのappend()とpop()に加えてappendleft()とpopleft()をサポートし、ヘッダに要素を非常に効率的に追加または削除することができます.
from collections import deque
q = deque(['a', 'b', 'c'])
q.append('x')
q.appendleft('y')
q
#deque(['y', 'a', 'b', 'c', 'x'])
3、defaultdict:デフォルト辞書
dictを使用する場合、参照するKeyが存在しない場合、KeyErrorが放出されます.キーが存在しない場合は、デフォルト値を返します.defaultdictを使用します.
デフォルト値は呼び出し関数で返され、defaultdictオブジェクトの作成時に関数が入力されます.
キーが存在しない場合にデフォルト値を返す以外は、defaultdictの他の動作はdictと全く同じです.
from collections import defaultdict
dd = defaultdict(lambda: 'N/A')
dd['key1'] = 'abc'
dd['key1'] # key1
#'abc'
dd['key2'] # key2 ,
#'N/A'
4、OrderedDict:順序辞書
dictを使用する場合、Keyは無秩序です.dictを反復すると、Keyの順序を決定できません.
キーの順序を維持するには、OrderedDictを使用します.
from collections import OrderedDict
d = dict([('a', 1), ('b', 2), ('c', 3)])
d # dict Key
#{'a': 1, 'b': 2, 'c': 3}
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
od # OrderedDict Key
#OrderedDict([('a', 1), ('b', 2), ('c', 3)])
OrderedDictのキーは、キー自体がソートされていない挿入順に並べられます.
od = OrderedDict()
od['z'] = 1
od['y'] = 2
od['x'] = 3
od.keys() # Key
#odict_keys(['z', 'y', 'x'])
OrderedDictは、FIFO(先行先出)のdictを実現することができ、容量が制限を超えた場合、最初に追加したKeyを削除します.
from collections import OrderedDict
class LastUpdatedOrderedDict(OrderedDict):
def __init__(self, capacity):
super(LastUpdatedOrderedDict, self).__init__()
self._capacity = capacity
def __setitem__(self, key, value):
containsKey = 1 if key in self else 0
if len(self) - containsKey >= self._capacity:
last = self.popitem(last=False)
print('remove:', last)
if containsKey:
del self[key]
print('set:', (key, value))
else:
print('add:', (key, value))
OrderedDict.__setitem__(self, key, value)
5、Counter:カウンタ
Counterは簡単なカウンタです.
Counterは実際にはdictのサブクラスでもあり、以下の結果から、文字'g'、'm'、'r'が2回ずつ現れ、他の文字が1回ずつ現れていることがわかります.
たとえば、統計文字の数:
from collections import Counter
c = Counter()
for ch in 'programming':
c[ch] = c[ch] + 1
print(c)
#Counter({'p': 1, 'r': 2, 'o': 1, 'g': 2, 'a': 1, 'm': 2, 'i': 1, 'n': 1})