for と別れる50の方法《02》配列と連結リスト, #2
Python.use(better) # OOP への道 《Python3.1, Jython2.5.0, IronPython2.6.x》
配列と連結リスト, #2
■ 概要
for 文はいくつかの問題を抱え、OOP を実践するときの「障害」になります。
伝統的なC言語風の for 文や悪名高い switch 文、配列の呪縛から解かれ、オブジェクト指向プログラミング〔OOP〕の醍醐味を堪能するための準備を行います。
■ 関連記事
- Java プログラマーのための Python 導入ガイド
- 例題で学ぶ Jython/Swing デザインパターン《Jython2.5》改訂版
- ゲームに学ぶ Jython/Swing フレームワーク《Jython2.5》改訂版
- IronPython で学ぶ WPF プログラミングの世界《IronPython2.6》改訂版
⇔ 承前
何が問題か
OOP の「障害」になる for 文の問題点を明らかにするために、K&R を離れて、別の事例を紹介します。
《Note》Python にも for 文はあります。しかし、これはC言語風の for 文とは「異質」のものです。C言語における while/for の違いを同義語とするなら、Python の for は、同音異義語(似て非なるもの)のようなものです。
事例:連結リスト
■ 伝統的な for と同等の while 文
Python には、伝統的なC言語風の for 文がありません。そこで、for 文に起因する問題点を、同等の while 文によって指摘します。さらに、事例 ex1 と同等のコードを while で記述すると、次のようになります。
def ex4(): s = ["AB", "C", "DEF"] s = LinkedList(s) e = s.head while e != None: print(e.item) e = e.next print(s)
《Note》Python にも、伝統的なC言語風の for 文があったなら…
# C言語風の for 擬があったなら… for (e = s.head; e != None; e = e.next): print(e.item)このような感じになるかもしれません。しかし、これでは「先祖返り」するようなもので、伝統的な for 文と同じ病巣を抱えてしまいます。
次のような出力が得られます。
>> ex4() AB C DEF LinkedList(A,BC,DEF)
次のような出力が得られます。
■ 伝統的な for と似て非なる for 文:Python 流の解法
さらに、事例 ex1 と同等のコードを while で記述すると、次のようになります。
def ex3(): s = "ABC" for e in s: # (=.=) Where do you see? print(e)
同じ出力が得られます。このコードの断片を見て、ともすると「for 文の簡潔な表現」に目を奪われて、その本質を見過ごしてしまいがちです。
def ex3(): s = "ABC" for e in s: # (@.@) Keep your eyes! print(e)
確かに、それも for 文の恩恵のひとつです。むしろ、ここで着目して欲しいのは、添字(インデックス)が不要になることです。
>> ex3() A B C LinkedList(A,BC,DEF)
Tips:
》作業中です《
class LinkedList(object): def __repr__(self): s = [] e = self.head while e.next: s.append(e.item) e = e.next return "%s(%s)"%(self.__class__.__name__,",".join(s))