《33》整列:メソッド reverse〈Python 2.x 版〉

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

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

今日の進捗

  • Language Reference: Numeric and Mathematical Modules; functools — Higher order functions and operations on callable objects
  • Python.use(better) -- セミナー研修テキスト
  • 連結リスト課題を「続・ひよ子のきもち」で公開
Comment
本人:野中 暫定版のようにリストを連結するのと違ってひとつずつ順序を逆転させるのは大変ですね。
担当:伊藤/本間 。(^^)

整列:メソッド reverse

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

def ex():
    for s in myList(""),myList("ABC"):
        print "-->",s  ,"\t#",s.__class__.__name__,id(s)
        s.reverse()
        print "<--",s  ,"\t#",s.__class__.__name__,id(s)

>>> ex()
    • > [] # myList 13509872
<-- [] # myList 13509872
    • > ['A', 'B', 'C'] # myList 13510384
<-- ['C', 'B', 'A'] # myList 13510384

各ノードの順序(オフセット位置)を反転させるとともに、各要素の値が逆順に得られるのが分かります。また、組み込み関数 id を利用すると(副作用を期待して)メソッド 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/03