《33》整列:メソッド reverse〈Python 3.0 版〉

実録:はじめてのプログラミング記事一覧
《33》整列:メソッド reverse

《著》小粒ちゃん+α《監修》小泉ひよ子とタマゴ倶楽部
第3版♪2009/02/28 ● 2009年2月27日(金)

整列:メソッド reverse

組み込み型 list と同様に、メソッド reverse を利用してリスト内の順序を反転できると便利です。

def ex_reverse():
    for e in 'myList("")','myList("ABC")':
        X = 's = {0}; s'.format(e)
        print(">>>",X)
        eval(compile(X,"","single"))
        X = 's.reverse(); s'.format(e)
        print(">>>",X)
        eval(compile(X,"","single"))

その動作(仕様)を確認すると、

>>> ex_reverse()
>>> s = myList(""); s

>>> s.reverse(); s

>>> s = myList("ABC"); s
['A', 'B', 'C']
>>> s.reverse(); s
['C', 'B', 'A']

各ノードの順序(オフセット位置)を反転させるとともに、各要素が逆順に得られるのが分かります。また、組み込み関数 id を利用すると(副作用を期待して)メソッド reverse を適用した前後で、同じオブジェクトを参照しているのを確認できます。

実現:メソッド reverse

メソッド list.reverse に準拠したものを実現します。

class myList(object):
    ...
    def reverse(self):
        s = myList()
        for e in self:
            s.insert(0,e)
        self.head = self.tail
        self.extend(s)

まず、新たな空リスト myList() を用意した後で(メソッド insert を使って)各要素を先頭に挿入することで、順序を反転したリスト s が得られます。次に、先頭のノード self.head は、末尾のノード self.tail と同じ値に再設定します。すると(見せかけだけは)空のリストになります。最後に(メソッド extend を使って)空リストの末尾に、反転したリスト s を連結させます。

受講者への課題

新たなオブジェクト myList() を作成せずに、連結リストの内部構造を変化させるだけで、各要素の順序を反転させるとともに、

    def reverse(self):
        ...

その長所/短所について考察してくたさい。■

Tips

ここで実現したメソッド reverse は、仕様を確認するための暫定版です。実際には、不要になったノード(オブジェクトごとに確保されたリソース)などを解放する必要があります。アジャイル開発では、このような暫定版(プロトタイプ)を用意しておいて、要求仕様が安定した頃に正式版を作成することがあります。正式版については、リファクタリングを実施した後に、関連記事で紹介します。《うさぎ》

Last updated♪09/03/22