for と別れる50の方法《02》配列と連結リスト, #2

記事一覧if 篇for 篇配列 篇

Python.use(better) # OOP への道 《Python3.1, Jython2.5.0, IronPython2.6.x》
配列と連結リスト, #2

《著》真樹育未・後藤いるか・小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第0版♪1988/10/12 ● 第1版♪1993/05/23 ● 第2版♪2003/05/25

■ 概要

for 文はいくつかの問題を抱え、OOP を実践するときの「障害」になります。

伝統的なC言語風の for 文や悪名高い switch 文、配列の呪縛から解かれ、オブジェクト指向プログラミング〔OOP〕の醍醐味を堪能するための準備を行います。

何が問題か

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:

》作業中です《

Last updated♪2009/07/03

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))