この記事の例では、Python での辞書 items() シリーズ関数の使用法について説明します。これは、Python プログラミングの参考になります。具体的な分析は次のとおりです。
まず例を見てみましょう:
import html # available only in Python 3.x def make_elements(name, value, **attrs): keyvals = [' %s="%s"' % item for item in attrs.items()] attr_str = ''.join(keyvals) element = '<{name}{attrs}>{value}</{name}>'.format( name = name, attrs = attr_str, value = html.escape(value)) return element make_elements('item', 'Albatross', size='large', quantity=6) make_elements('p', '<spam>')
このプログラムの機能は非常に単純で、HTML タグを生成することです。HTML モジュールは Python 3.x でのみ使用できることに注意してください。
タグ属性リストを生成する辞書型変数 keyvals が 2 つの %s が 1 つの項目に対応するという興味深い構成になっていることに今気づきましたので、関連情報を調べてみると、多くのことがわかりました。それらをここにまとめます。
注: 以下のすべての Python インタープリターで使用されるバージョンの場合、2.x は 2.7.3 に対応し、3.x は 3.4.1 に対応します
Python 2.x では、公式ドキュメントの items メソッドは次のとおりです。次のような (キー、値) ペアのリストを生成します:
>>> d = {'size': 'large', 'quantity': 6} >>> d.items() [('quantity', 6), ('size', 'large')]
検索プロセス中に、stackoverflow で次の質問を偶然目にしました: dict.items() と dict.iteritems() の違いは何ですか? 、最初の答えは大まかに次のことを意味します:
「最初は items() は上記のように dict のすべての要素を含むリストを返しましたが、これはメモリの無駄が多すぎるため、後で追加しました (注: iteritems()、iterkeys() は Python 2.2 で登場し始めました) itervalues() はメモリを節約するためにイテレータを返す関数のグループですが、3.x では items() 自体がそのようなイテレータを返すため、3.x の items() の動作は 2.x と同じです。 iteritems() の動作は一貫しており、関数の iteritems() グループは廃止されました。
しかし、さらに興味深いのは、この回答が採用されたにもかかわらず、以下のコメントが 3.x の items() の動作が 2.x の iteritems() とは異なることを指摘していることです。実際に返されるのは「完全なシーケンス プロトコル オブジェクト」で、dict の変更を反映できます。その後、別の関数 viewitems() が Python 2.7 に追加されました。これは 3.x の動作と一致しています。
コメントの記述を確認するために、テストで使用された Python のバージョンに注意して次のテストを実行しました。
Python 2.7.3 (default, Feb 27 2014, 19:58:35) [GCC 4.6.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> d = {'size': 'large', 'quantity': 6} >>> il = d.items() >>> it = d.iteritems() >>> vi = d.viewitems() >>> il [('quantity', 6), ('size', 'large')] >>> it <dictionary-itemiterator object at 0x7fe555159f18> >>> vi dict_items([('quantity', 6), ('size', 'large')])
Python 3.4.1 (default, Aug 12 2014, 16:43:01) [GCC 4.9.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> d = {'size': 'large', 'quantity': 6} >>> il = d.items() >>> it = d.iteritems() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'dict' object has no attribute 'iteritems' >>> vi = d.viewitems() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'dict' object has no attribute 'viewitems' >>> il dict_items([('size', 'large'), ('quantity', 6)])
2.x では、iteritems() および viewitems() によって返されるコンテンツは、次の
のように for を使用して走査できます。
>>> for k, v in it: ... print k, v ... quantity 6 size large >>> for k, v in vi: ... print k, v ... quantity 6 size large
>>> it = d.iteritems() >>> vi = d.viewitems() >>> d['newkey'] = 'newvalue' >>> d {'newkey': 'newvalue', 'quantity': 6, 'size': 'large'} >>> vi dict_items([('newkey', 'newvalue'), ('quantity', 6), ('size', 'large')]) >>> it <dictionary-itemiterator object at 0x7f50ab898f70> >>> for k, v in vi: ... print k, v ... newkey newvalue quantity 6 size large >>> for k, v in it: ... print k, v ... Traceback (most recent call last): File "<stdin>", line 1, in <module> RuntimeError: dictionary changed size during iteration
要約すると、2.x では元々 items() メソッドが使用されていましたが、メモリの無駄が多すぎるため、3.x ではイテレータを返す iteritems() メソッドが追加されました。 ) ビュー オブジェクトを返すように動作が変更され、返されたオブジェクトに元のディクショナリの変更も反映できるようになりました。同時に、viewitems() の下位互換性機能が 2.7 で追加されました。
したがって、3.x では、 items() メソッドが 1 つだけ保持されるため、3 つの違いについて心配する必要はありません。