Fluent Pythonノート1
8088 ワード
Blogアドレス:https://www.jiangdog.com/blog/fluent-python-note-1
第一章Pythonデータモデル1つの集合タイプが実装されていない
第二章シーケンス構成の配列可変シーケンス、可変シーケンス;コンテナシーケンス(マルチタイプ)、フラットシーケンス(シングルタイプ). 2.xバージョンリストの導出式で同じ名前の変数を使用すると、変数が漏洩し、前の変数の値が変更される可能性があります.(ジェネレータ式はできないようです.) ジェネレータ式は、単一パラメータとして渡す場合、括弧を省略することができる. namedtupleは実はクラス? Why numbering should start at zero 利用 *を用いてシーケンスを操作する場合、シーケンスが可変オブジェクトで構成されている場合、生成された新しいシーケンスの要素を用いて実際には同じ参照となる.例: 可変シーケンスを繰り返し接合すると、毎回新しいオブジェクトが存在するため効率が低く、解釈器は元のオブジェクトの要素を新しいオブジェクトにコピーしてから新しい要素を追加する必要がある.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つのオブジェクトがハッシュ可能である場合、そのオブジェクトのライフサイクルにおいて、そのハッシュ値は変わらず、このオブジェクトは
str,bytes,数値型,tuple(内部のすべての要素がハッシュ可能である必要がある)、frozenset.
一般的に、ユーザーがカスタマイズしたタイプのオブジェクトはハッシュ可能であり、ハッシュ値はid()関数の戻り値であるため、これらのオブジェクトは比較時に等しくありません.1つのオブジェクトが
実習小記-pythonでハッシュできる相手は何ですか?what is hashable object in python? 内部ステータスは何を表しますか? 2つのハッシュ可能なオブジェクトが等しい場合、それらのハッシュ値は必ず同じ???書き換え collections.defaultdict()はdefaultを受け入れます.呼び出し可能なオブジェクトであるfactoryパラメータ.キーが見つからない場合、 collections.ChainMapはキーを取得するときに最初のマッピングしかクエリーできません.すべてのマッピングをクエリーするにはサブクラスを書く必要があります.詳細 UserDictの継承はdictより便利.
一方、dictから継承するのではなくUserDictから継承する傾向がある主な理由は、後者がいくつかの方法の実装に近道を歩むことがあり、サブクラスでこれらの方法を書き直さなければならないことがありますが、UserDictはこれらの問題をもたらしません.
callable()呼び出し可能オブジェクト、7種類: カスタム関数またはlambda関数( lenのようなC言語実装の内蔵関数.( dict.getなどのC言語実装の組み込み方法.( ジェネレータオブジェクト.( 類. クラスで定義されている関数. 実装_call__()のクラスのインスタンスです.
method_descriptor functionとmethodの違い 強制キーワードパラメータに辞書がある デコライザはデコライザ関数が確定した直後に動作し、通常はpythonがモジュールをロードしたときに実際にインポートされる. 関数内である変数に値を付与する場合、その変数は局所変数とする. list浅いコピー工場関数list、スライス[:]、copy.copy ・
第一章Pythonデータモデル
__contains__
の場合、in
演算子を利用すると、1回の検索が行われる.%s
、print()
、str()
、{!s}
対応__str__
実現;{!r}
,%r
対応__repr__
実現.実装されていない__str__
Pythonが呼び出されると、解釈器は__repr__
で置き換えられる.詳細bool()
呼び出し__bool
;存在しない場合__bool
呼び出すlen()
、0を返すとbool()
Falseを返す.len()
内蔵集合タイプに作用した場合、直接C構造体から長さを読み取る.第二章シーケンス構成の配列
beyond_ascii_tuple = tuple(ord(c) for c in symbols if ord(c) > 127)
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__
.*=
および+=
動作は原子ではない(バイトコードを見てわかる).+=パズル.第三章辞書と集合
1つのオブジェクトがハッシュ可能である場合、そのオブジェクトのライフサイクルにおいて、そのハッシュ値は変わらず、このオブジェクトは
__hash__()
メソッドを実装する必要がある.また、ハッシュ可能なオブジェクトには、他のキーと比較するための__eq__()
メソッドが必要です.2つのハッシュ可能オブジェクトが等しい場合、それらのハッシュ値は必ず同じです.str,bytes,数値型,tuple(内部のすべての要素がハッシュ可能である必要がある)、frozenset.
一般的に、ユーザーがカスタマイズしたタイプのオブジェクトはハッシュ可能であり、ハッシュ値はid()関数の戻り値であるため、これらのオブジェクトは比較時に等しくありません.1つのオブジェクトが
__eq__()
メソッドを実装し、メソッドでこのオブジェクトの内部状態が使用されている場合、これらすべての内部状態が可変でない場合にのみ、このオブジェクトはハッシュ可能である.実習小記-pythonでハッシュできる相手は何ですか?what is hashable object in python? 内部ステータスは何を表しますか?
__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
__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を返します.一方、dictから継承するのではなくUserDictから継承する傾向がある主な理由は、後者がいくつかの方法の実装に近道を歩むことがあり、サブクラスでこれらの方法を書き直さなければならないことがありますが、UserDictはこれらの問題をもたらしません.
types.MappingProxyType = type(type.__dict__)
読取り専用ビュー.
)
)
)
) __kwdefaults__
位置パラメータと通常キーワードパラメータのデフォルト値にタプルがある__defaults
.operator.itemgetter
およびoperator.attrgetter
実際には実装されている__call__()
メソッドのクラスであるため、その例は呼び出し可能なオブジェクトである.partial
和partialmethod
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がバインドされていない値が発見されたため、異常が放出されると考えられる.partial
を利用してオプションパラメトリックトリムを実現.lru_cache()
デコレーション