この記事の内容は、Python が名前をシーケンス要素 (コード) にマッピングする方法に関するものであり、一定の参考価値があります。必要な友人が参照することができます。お役に立てば幸いです。
1. 要件
私たちのコードは位置 (インデックスまたは添え字) を介してリスト タプルにアクセスしますが、これによりコードが少し読みにくくなる場合があります。 。名前によって要素にアクセスできるようにして、構造内の位置への依存を減らしたいと考えています。2. 解決策
通常のタプルと比較して、collections.namedtuple() (名前付きタプル) はこれらの利便性を提供するために追加するオーバーヘッドが非常に少ないだけです。実際、collections.namedtuple() は、Python の標準タプル型のサブクラスを返すファクトリ メソッドです。型名と対応するフィールドを指定すると、インスタンス化可能なクラスが返され、定義したフィールドの値などを渡します。
from collections import namedtuple Subscriber=namedtuple('Subsciber',['addr','joined']) sub=Subscriber("1782980833@qq.com","2018-10-23") print(sub) print(sub.addr) print(sub.joined) print(len(sub)) addr,joined=sub print(addr) print(joined) #下面错误,以为你namedtuple是不可变的 #sub.joined="2019"
結果:
Subsciber(addr='1782980833@qq.com', joined='2018-10-23') 1782980833@qq.com 2018-10-23 2 1782980833@qq.com 2018-10-23
namedtuple のインスタンスは通常のクラス インスタンスのように見えますが、そのインスタンスは通常のタプルと交換可能であり、すべての通常のタプルがサポートされています。グループによってサポートされる操作。
名前付きタプルの主な機能は、コードを制御する要素の位置からコードを分離することです。したがって、データベース呼び出しからタプルの大きなリストを取得し、その位置によって要素にアクセスする場合、フォームに新しい列を追加するとコードはクラッシュしますが、返されたタプルが最初に名前付きタプルに変換される場合は、コードがクラッシュします。問題はありません。
この問題を説明するために、通常のタプルを使用したコードを次に示します:
def compute_cost(records): total=0.0 for rec in records: total+=rec[1]*rec[2] return total
位置によって要素を参照すると、多くの場合、コードの表現力が低下し、レコードの構造の特異性に大きく依存します。
次は名前付きタプルを使用するバージョンです:
from collections import namedtuple Stock=namedtuple('Stock',['name','shares','price']) def compute_cost(records): total=0.0 for rec in records: s=Stock(*rec) total+=s.shares*s.price return total
3. 分析
名前付きタプルの使用方法の 1 つは、辞書の代わりとして使用することです。後で、ユーザーはストレージ用にさらに多くのスペースを必要とします。したがって、大規模なデータ設計辞書を構築する場合は、namedtuple を使用する方が効率的ですが、辞書とは異なり、namedtuple は不変であることに注意してください。
属性を変更する必要がある場合は、namedtupleのinstance_replace()メソッドを使用して変更できます。このメソッドは、新しい名前付きタプルを作成し、対応する値を置き換えます。
from collections import namedtuple Subscriber=namedtuple('Subsciber',['addr','joined']) sub=Subscriber("1782980833@qq.com","2018-10-23") print(sub) sub=sub._replace(joined="2018-10-24") print(sub)
結果:
Subsciber(addr='1782980833@qq.com', joined='2018-10-23') Subsciber(addr='1782980833@qq.com', joined='2018-10-24')
__ replace() メソッドには微妙な使い方があり、名前付き要素にオプションのまたはフィールドが欠落しています。グループ。これを行うには、まずデフォルト値を含むプロトタイプ配列を作成し、次に _replace() メソッドを使用して新しいインスタンスを作成し、対応する値を置き換えます。
from collections import namedtuple Subscriber=namedtuple('Subsciber',['addr','joined','age']) sub=Subscriber("",None,0) def dict_to_stock(s): return sub._replace(**s) a={"addr":"111111@qq.com","joined":"1111-11-11","age":11} a=dict_to_stock(a) print(a) b={"addr":"111111@qq.com","joined":"1111-11-11"} b=dict_to_stock(b) print(b)
Result:
Subsciber(addr='111111@qq.com', joined='1111-11-11', age=11) Subsciber(addr='111111@qq.com', joined='1111-11-11', age=0)
最後に、非常に重要なことですが、目的が効率的なデータ構造を定義することであり、将来的にさまざまなインスタンス プロパティを変更する場合は、namedtuple を使用することに注意してください。代わりに、__slots__ 属性を使用するクラスを検討してください。
以上がPython が名前をシーケンス (コード) の要素にマッピングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。