選択は発信者の観点から厳密に考慮される必要があると思います:消費者がする必要がある可能性が最も高いのは何ですか?
そして、各コレクションの顕著な特徴は何ですか?
- タプルは順番にアクセスされ、不変です
- リストは順番にアクセスされ、変更可能です
- 辞書はキーでアクセスされます
リストとタプルはアクセスと同等ですが、リストは変更可能です。まあ、すぐに結果を解凍する場合は、呼び出し元には関係ありません。
score, top_player = play_round(players)
# or
idx, record = find_longest(records)
ここがリストなのかタプルなのかを気にする理由はここにはなく、タプルはどちらの側も単純です。
一方、返されたコレクションをそのまま保持し、コレクションとして使用する場合:
points = calculate_vertices(shape)
points.append(another_point)
# Make a new shape
その後、リターンが変更可能であることは理にかなっています。均質性も重要な要素です。繰り返しパターンのシーケンスを検索する関数を記述したとします。返される情報は、パターンの最初のインスタンスのシーケンスのインデックス、繰り返しの数、およびパターン自体です。それらは同じ種類のものではありません。ピースをまとめてもかまいませんが、コレクションを変更する理由はありません。これはではありませんlist
。
今度は辞書です。
最後のコードは、出力に名前を付けているため、より読みやすいコードを作成します
はい。フィールドにキーを設定すると、異種混合データがより明確になりますが、ある程度の負担も伴います。繰り返しになりますが、「これから荷ほどきます」の場合、これは
round_results = play_round(players)
score, top_player = round_results["score"], round_results["top_player"]
(キーのリテラル文字列を避けても)、タプルバージョンと比較して不必要な作業です。
ここでの質問は3つあります。コレクションはどれほど複雑で、コレクションはどのくらいの期間保管されますか。また、同じ種類のコレクションをさまざまな場所で使用する必要がありますか?
メンバーが3つ以上ある場合、特にネストがある場合は、キー付きアクセスの戻り値がタプルよりも意味をなすようになることをお勧めします。
shape["transform"]["raw_matrix"][0, 1]
# vs.
shape[2][4][0, 1]
それは次の質問につながります:コレクションはこのスコープをそのままにして、それを作成した呼び出しから離れた場所にいますか?あちこちに鍵付きのアクセスがあれば、理解しやすくなります。
3番目の質問-再利用-は、提示しなかった4番目のオプションとして単純なカスタムデータ型を指しています。
構造は、この1つの機能によってのみ所有されますか?または、多くの場所で同じ辞書レイアウトを作成していますか?プログラムの他の多くの部分がこの構造で動作する必要がありますか?繰り返される辞書のレイアウトは、クラスに分解する必要があります。おまけとして、ビヘイビアを付けることができます。おそらく、データを操作する関数の一部がメソッドとしてカプセル化されます。
5番目の優れた軽量オプションはnamedtuple()
です。これは、本質的に、不変の形式のディクショナリ戻り値です。