typing導入Pythonのデータ型モジュール、collections集合モジュール

16561 ワード

一、typingモジュール
1、typingモジュールの役割
  • タイプチェックで、実行時にパラメータと戻り値タイプが一致しないようにします.
  • は、開発ドキュメントの追加説明として、ユーザが呼び出したときにパラメータタイプを入力および返すのを容易にする.
  • このモジュールが追加された後、プログラムの実行に影響を与えることはなく、正式なエラーは報告されず、注意するしかありません.
  • 注意:typingモジュールはpython 3のみです.5以上のバージョンでのみ使用できますが、pycharmでは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常用タイプ
  • 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次元座標は次のように表すことができます.
    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})