《19》連結リスト課題〈Python 2.x 版〉
実録:はじめてのプログラミング《記事一覧》
《19》連結リスト課題
今日の進捗
Comment | |
---|---|
本人:野中 | 今日から福岡でメールを使ってアドバイスを受けます。英文のドキュメントにも慣れてきました。 |
担当:伊藤/本間 | Language Referenceにも目を通しておいてください。今回の課題では、重要な役割を占めるだけでなく、基本的な理解が不可欠になります。《うさぎ》 |
資料
No. | title | note |
---|---|---|
(4) | The Python Language Reference — Python v3.0 documentation | Download Python | Python.org から入手可能です。 |
連結リスト課題
デザインパターンを学習するための題材として、連結リストを作成します。また、組み込み型 list と同等の機能を実現することで、その理解を深めます。
def ex(): s = list() ; print s,"\t#",s.__class__.__name__ for e in "ABC": s.append(e) ; print s >>> ex() [] # list ['A'] ['A', 'B'] ['A', 'B', 'C']
組み込み型 list は、任意の要素からなるシーケンス(リスト)を扱うのに便利な機能を提供します。メソッド append は、指定した要素をリストの末尾に追加します。
def ex(): s = myList() ; print s,"\t#",s.__class__.__name__ for e in "ABC": s.append(e) ; print s >>> ex() [] # myList ['A'] ['A', 'B'] ['A', 'B', 'C'] >>> myList("ABC") ['A', 'B', 'C']
この課題で作成するクラス myList は、連結リストの概念を実現したもので、組み込み型 list に準拠します。そこで、この「連結リスト課題」では、list を利用できる状況ならいつでも、myList で代用できることを目指します。
連結リスト課題の仕様を確認したので、次回から、クラス myList が完成するまでの過程を紹介します。
class myList(object): def __init__(self): self.head = self.tail = Node() def append(self, item): node = Node(item, self.tail.next) self.tail.next = node self.tail = node def __str__(self): # ver.1 s = [] node = self.head.next while node: s.append(repr(node.item)) node = node.next return "[%s]"%", ".join(s)
クラス myList は、連結リストを実現したものです。メソッド __init__ は、クラス呼び出し myList() などに呼応して、生成したばかりのインスタンスを初期設定します。属性 .head が先頭のノードを、属性 .tail が末尾のノードを参照するとともに、各ノード(要素)を保持します。
メソッド __str__ は、組み込み関数 str に呼応します。組み込み型 list に準拠させるために、repr を利用します。組み込み関数 repr を利用すると、オブジェクトに固有の文字列表現が得られます。
class Node(object): def __init__(self, item=None, next=None): self.item = item self.next = next
クラス Node は、連結リストを構成する各ノードを実現したものです。属性 .item が各項目(要素)を保持するとともに、属性 .next を介して次のノードを参照します。
Tips
組み込み型 list に準拠するクラスを作成する過程を通して、list に関する理解を深めるとともに、プログラムだけではなく、プログラミングに関する理解を深めるのが、この課題の主目的です。それによって、プロダクト指向から「プロセス指向」への扉を開きます。《ひよ子》