Python Academy · レッスン

NamedTupleの基礎

軽量で不変なレコードを作成します

レッスン 3/413 ステップ

「NamedTupleの基礎」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。

NamedTupleとは

名前付きタプルとは、各位置に名前も付いているタプルです。タプルの軽量で不変な性質に加えて、分かりやすい属性アクセスを利用できます。小規模なレコードに最適です。

通常のタプルの問題点

通常のタプルは位置で要素を表すため、それぞれのインデックスが何を意味するのかを覚えておく必要があります。p[0]やp[1]のようなコードは、間違えやすいものです。

point = (1, 2)
print(point[0])  # x?
print(point[1])  # y?

namedtupleでの作成

collections.namedtupleファクトリは、新しいタプルサブクラスを作成します。型名とフィールド名を渡します。

from collections import namedtuple

Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
print(p)

名前によるアクセス

これで、インデックスではなく名前でフィールドを読み取れるため、コードの意味が明確になります。

from collections import namedtuple

Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
print(p.x)
print(p.y)

タプルであることに変わりはない

名前付きタプルは実際のタプルでもあるため、インデックス指定、アンパック、反復処理をすべて通常どおり使用できます。

from collections import namedtuple

Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
print(p[0])
x, y = p
print(x, y)

不変性

すべてのタプルと同様に、名前付きタプルは不変です。フィールドに代入しようとするとAttributeErrorが発生します。

from collections import namedtuple

Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
try:
    p.x = 99
except AttributeError as e:
    print('Cannot modify:', e)

変更後のコピーの作成

変更することはできないため、_replace()メソッドを使って、一部のフィールドを変更した新しいインスタンスを作成します。

from collections import namedtuple

Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
q = p._replace(y=99)
print(p)
print(q)

辞書への変換

_asdict()メソッドはフィールドを辞書として返します。シリアライズやログ出力に便利です。

from collections import namedtuple

Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
print(p._asdict())

フィールドの確認

_fields属性にはフィールド名の一覧が格納されています。レコードのフィールドを反復処理する汎用コードで便利です。

from collections import namedtuple

Point = namedtuple('Point', ['x', 'y'])
print(Point._fields)

デフォルト値

defaults引数でデフォルト値を指定します。デフォルト値は、関数の引数のデフォルト値と同様に、右端のフィールドに適用されます。

from collections import namedtuple

Point = namedtuple('Point', ['x', 'y', 'z'], defaults=[0])
print(Point(1, 2))
print(Point(1, 2, 9))

複数の値の返却

名前付きタプルは、関数の戻り値として特に役立ちます。名前のないタプルを返す代わりに名前付きタプルを返すと、呼び出し側でフィールドを名前によって読み取れます。

from collections import namedtuple

Stats = namedtuple('Stats', ['minimum', 'maximum'])

def analyze(nums):
    return Stats(min(nums), max(nums))

r = analyze([3, 1, 9, 4])
print(r.minimum, r.maximum)

確認問題

名前付きタプルのインスタンスの変更後のコピーは、どのように作成しますか。

まとめ

軽量で不変なレコードを作成する方法を学びました。

  • namedtupleはタプルにフィールド名を追加します。
  • フィールドには名前またはインデックスでアクセスでき、アンパックも引き続き使えます。
  • 変更後のコピーには_replace()を、変換には_asdict()を使います。
  • _fieldsは名前を一覧表示し、defaultsはデフォルト値を設定します。
無料で開始

AI チューターと学ぶ Python — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
76
レッスン
320

よくある質問

「NamedTupleの基礎」レッスンは無料ですか?

はい。「NamedTupleの基礎」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。

「NamedTupleの基礎」で何を学びますか?

軽量で不変なレコードを作成します ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Python Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「NamedTupleの基礎」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPython Academyレッスンでコードを書いて実行できますか?

はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Enumクラス
  2. IntEnumとFlag
  3. NamedTupleの基礎
  4. typing.NamedTuple
← Python Academyに戻る