Python.use(better) #list: step13 -- def __delitem__

記事一覧 Python.use(better)《Python3.1》

def __delitem__

《著》小粒ちゃん+∞《監修》小泉ひよ子とタマゴ倶楽部
第0版♪2001/03/02 ● 第1版♪2003/05/25 ● 第2版♪2004/06/01 ● 第3版♪2009/02/28

事例:モジュールを起動する

■ 全項目を確認する

全ステップの「項目」を確認するには、関数 do を利用します。

$ python myList.py
>>> do()
...
13: step13 -- def __delitem__(self, key)
■ 各項目を実行する

各ステップの「動作」を確認するには、関数 do の実引数を指定します。

>>> do(13)
...
>>> # ---------------------------------------- __delitem__
>>> s = myList("ABC"); s, len(s)
(['A', 'B', 'C'], 3)
>>> del s[0]; s, len(s)
(['B', 'C'], 2)
>>> s = myList("ABC"); s, len(s)
(['A', 'B', 'C'], 3)
>>> del s[1]; s, len(s)
(['A', 'C'], 2)
>>> s = myList("ABC"); s, len(s)
(['A', 'B', 'C'], 3)
>>> del s[2]; s, len(s)
(['A', 'B'], 2)
>>> s = myList("ABC"); s, len(s)
(['A', 'B', 'C'], 3)
>>> del s[3]; s, len(s)
IndexError: myList assignment index out of range
>>>

事例:コードの解説

def step13():
    """def __delitem__(self, key)"""

    class myList(object):
        ...
        def __delitem__(self, key):
            prev,node = self.head,self.head.next
            n = 0
            while node:
                if n==key:
                    prev.next = node.next; del node
                    break
                prev,node = node,node.next
                n += 1
            else:
                s = "IndexError: {0} assignment index out of range"
                name = self.__class__.__name__
                raise IndexError(s.format(name))

    ## ----------------------------------------
    global dirs; local = locals()

    dirs += "__delitem__",
    for e in dirs:
        print(">>> #","-"*40,e)
        eval("ex_%s(SPEC, local)"%e)
■ #1: 要素の削除

メソッド __delitem__ は、del 文に呼応して、任意の要素を削除します。

        def __delitem__(self, key):
            prev,node = self.head,self.head.next
            n = 0
            while node:
                if n==key:
                    prev.next = node.next; del node
                    break
                prev,node = node,node.next
                n += 1
            else:
                s = "IndexError: {0} assignment index out of range"
                name = self.__class__.__name__
                raise IndexError(s.format(name))

連結リスト self の各ノード node を順にたどりながら、

  • 変数 n(カウンター)が引数 key と同値なら、
    • ノード node を削除します。

引数 key と同値のものが見つからないなら、

  • 例外 IndexError を生成するとともに、
  • クラスの名前 __class__.__name__ を含むエラーメッセージを出力します。

》こちらに移動中です《
TOP


関連記事

Last updated♪2009/12/07