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

記事一覧if 篇for 篇配列 篇

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

《著》真樹育未・後藤いるか・小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第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 と似て非なる for 文:C言語流の解法
def ex1():
    s = "ABC"
    for i in range(3):
        print(s[i])

文字列を構成する各要素を参照するのに、添字(インデックス)を利用できます。整数 i の値は、0 から 2 まで変化するので、先頭から末尾に向って各要素(長さ1の文字列)をひとつずつ改行しながら出力します。

>> ex1()
A
B
C
■ 伝統的な for と同等の while 文

Python には、伝統的なC言語風の for 文がありません。そこで、for 文に起因する問題点を、同等の while 文によって指摘します。さらに、事例 ex1 と同等のコードを while で記述すると、次のようになります。

def ex2():
    s = "ABC"
    i = 0
    while i<3:
        print(s[i])
        i += 1

同じ出力が得られます。

>> ex2()
A
B
C
■ 伝統的な 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 文の恩恵のひとつです。むしろ、ここで着目して欲しいのは、添字(インデックス)が不要になることです。そして、制御構造 for..in には目もくれず「オブジェクト」に着目してください。すると「主役」である文字列 s と、それを構成する各要素 e(長さ1の文字列)が際立って見えてきませんか。さらに「脇役」である制御構造 for..in の存在意義を再認識できるようになります。

>> ex3()
A
B
C

次項 に続く…

Tips

オブジェクト指向の視座:制御構造に目を奪われるのではなく「オブジェクト」に着目することで、新たな視点(視座構造)を持てるようになります。

知識社会学と現代―K.マンハイム研究

知識社会学と現代―K.マンハイム研究

視座構造大辞林 第二版 (三省堂
  • マンハイム知識社会学の中心概念の一。人が事実を認識する際、社会的条件は認識の形成過程のみを規定するのではなく、認識の構造そのものにまで組み込まれていることを示す概念。

》作業中です《

Last updated♪2009/07/03