Fluent Pythonノート1

8088 ワード

Blogアドレス:https://www.jiangdog.com/blog/fluent-python-note-1
第一章Pythonデータモデル
  • 1つの集合タイプが実装されていない__contains__の場合、in演算子を利用すると、1回の検索が行われる.
  • %sprint()str(){!s}対応__str__実現;{!r},%r対応__repr__実現.実装されていない__str__Pythonが呼び出されると、解釈器は__repr__で置き換えられる.詳細
  • bool()呼び出し__bool;存在しない場合__bool呼び出すlen()、0を返すとbool()Falseを返す.
  • len()内蔵集合タイプに作用した場合、直接C構造体から長さを読み取る.

  • 第二章シーケンス構成の配列
  • 可変シーケンス、可変シーケンス;コンテナシーケンス(マルチタイプ)、フラットシーケンス(シングルタイプ).
  • 2.xバージョンリストの導出式で同じ名前の変数を使用すると、変数が漏洩し、前の変数の値が変更される可能性があります.(ジェネレータ式はできないようです.)
  • ジェネレータ式は、単一パラメータとして渡す場合、括弧を省略することができる.beyond_ascii_tuple = tuple(ord(c) for c in symbols if ord(c) > 127)
  • namedtupleは実はクラス?
  • Why numbering should start at zero
  • 利用slice()スライス名.
  • *を用いてシーケンスを操作する場合、シーケンスが可変オブジェクトで構成されている場合、生成された新しいシーケンスの要素を用いて実際には同じ参照となる.例:
    nested_l = [[]]
    nested_l_3 = nested_l * 3
    print(nested_l_3)  # [[], [], []]
    nested_l_3[0].append(1)
    print(nested_l_3)  # [[1], [1], [1]]
    
    dict_l = [
        {'a': 1},
        {'b': 2},
    ]
    dict_l_3 = dict_l * 3
    print(dict_l_3)  # [{'a': 1}, {'b': 2}, {'a': 1}, {'b': 2}, {'a': 1}, {'b': 2}]
    dict_l_3[0]['a'] = 100
    print(dict_l_3)  # [{'a': 100}, {'b': 2}, {'a': 100}, {'b': 2}, {'a': 100}, {'b': 2}]
  • +=実際に呼び出された__iadd__メソッドであり、なければステップダウン用__add__.*=対応__imul__.
  • 可変シーケンスを繰り返し接合すると、毎回新しいオブジェクトが存在するため効率が低く、解釈器は元のオブジェクトの要素を新しいオブジェクトにコピーしてから新しい要素を追加する必要がある.strは例外で、文字列に+=をするのはあまりにも一般的なので、CPythonはそれを最適化しました.strのメモリを初期化すると、プログラムは拡張性の余分なスペースを残します.そのため、インクリメンタル操作を行う場合、元の文字列を新しい位置にコピーするなどの操作はありません.
  • 可変オブジェクトをタプル内に置かない.disモジュールを用いてバイトコード指令情報を取得する.*=および+=動作は原子ではない(バイトコードを見てわかる).+=パズル.
  • Timesortアルゴリズムは並べ替えられ、位置は比較的安定している.
  • memoryviewコピーを減らし、コンテンツをコピーしない.
  • array.Array()高効率
  • フラットシーケンス:同一タイプ(文字、バイト、数値などのベースタイプ)、格納値、連続メモリ領域.array.array,bytearray,str,bytes,memoryviewコンテナシーケンスは、異なるタイプで参照を格納できます.list, tuple, collections.deque
  • 可変シーケンス:修正可能、修正時に元メモリ上で直接修正する.list, array.array, bytearray, memoryview, collections.Queue可変シーケンス:変更不可、変更時に新しいシーケンスが生成され、新しいシーケンスを指します.tuple, str, bytes

  • 第三章辞書と集合
  • ハッシュ可能タイプのみがマッピングタイプのキーになります.
  • ハッシュ可能タイプ:
    1つのオブジェクトがハッシュ可能である場合、そのオブジェクトのライフサイクルにおいて、そのハッシュ値は変わらず、このオブジェクトは__hash__()メソッドを実装する必要がある.また、ハッシュ可能なオブジェクトには、他のキーと比較するための__eq__()メソッドが必要です.2つのハッシュ可能オブジェクトが等しい場合、それらのハッシュ値は必ず同じです.
    str,bytes,数値型,tuple(内部のすべての要素がハッシュ可能である必要がある)、frozenset.
    一般的に、ユーザーがカスタマイズしたタイプのオブジェクトはハッシュ可能であり、ハッシュ値はid()関数の戻り値であるため、これらのオブジェクトは比較時に等しくありません.1つのオブジェクトが__eq__()メソッドを実装し、メソッドでこのオブジェクトの内部状態が使用されている場合、これらすべての内部状態が可変でない場合にのみ、このオブジェクトはハッシュ可能である.
    実習小記-pythonでハッシュできる相手は何ですか?what is hashable object in python? 内部ステータスは何を表しますか?
  • 2つのハッシュ可能なオブジェクトが等しい場合、それらのハッシュ値は必ず同じ???書き換え__eq__()両オブジェクトが等しい場合、ハッシュ値が等しいことを確認する必要がありますか?
     class A:
        __hash__ = object.__hash__
    
        def __init__(self, n=1):
            self.n = n
    
        def __eq__(self, other):
            if other.n == self.n:
                return True
    
    
    a1 = A()
    a2 = A()
    print(hash(a1) == hash(a2))  # False
    print(a1 == a2)  # True
  • collections.defaultdict()はdefaultを受け入れます.呼び出し可能なオブジェクトであるfactoryパラメータ.キーが見つからない場合、__missing__メソッドでdefault_が呼び出されます.factory.ただしdefault_factoryという呼び出し可能なオブジェクトは__getitem__見つからないキーにぶつかったときに呼び出され、__getitem__あるデフォルト値を返します.d[k]のように、d.get(k)は呼び出されません.
  • __missing____getitem__でしか呼び出せない、対get()__contains__とは関係ありません.
  • in対応__contains__方法.py 3 dict.keys()はビューを返し、py 2はlistを返します.
  • collections.ChainMapはキーを取得するときに最初のマッピングしかクエリーできません.すべてのマッピングをクエリーするにはサブクラスを書く必要があります.詳細
  • UserDictの継承はdictより便利.
    一方、dictから継承するのではなくUserDictから継承する傾向がある主な理由は、後者がいくつかの方法の実装に近道を歩むことがあり、サブクラスでこれらの方法を書き直さなければならないことがありますが、UserDictはこれらの問題をもたらしません.
  • types.MappingProxyType = type(type.__dict__)読取り専用ビュー.
  • callable()呼び出し可能オブジェクト、7種類:
  • カスタム関数またはlambda関数()
  • lenのようなC言語実装の内蔵関数.( )
  • dict.getなどのC言語実装の組み込み方法.( )
  • ジェネレータオブジェクト.( )
  • 類.
  • クラスで定義されている関数.
  • 実装_call__()のクラスのインスタンスです.

  • method_descriptor
  • functionとmethodの違い
  • 強制キーワードパラメータに辞書がある__kwdefaults__位置パラメータと通常キーワードパラメータのデフォルト値にタプルがある__defaults.
  • operator.itemgetterおよびoperator.attrgetter実際には実装されている__call__()メソッドのクラスであるため、その例は呼び出し可能なオブジェクトである.
  • partialpartialmethod
  • デコライザはデコライザ関数が確定した直後に動作し、通常はpythonがモジュールをロードしたときに実際にインポートされる.
  • 関数内である変数に値を付与する場合、その変数は局所変数とする.
    b = 10
    
    def f(a):
        print(a)
        print(b)
        b = 20
    
    try:
        f(3)
    except UnboundLocalError as e:
        print(e)  # local variable 'b' referenced before assignment
    pythonコンパイルf()関数体の場合、b局所変数は、関数に値が付与されているため、局所変数bの取得中にbがバインドされていない値が発見されたため、異常が放出されると考えられる.
  • list浅いコピー工場関数list、スライス[:]、copy.copy
  • partialを利用してオプションパラメトリックトリムを実現.
  • lru_cache()デコレーション