for と別れる50の方法《01》配列と連結リスト, #1
Python.use(better) # OOP への道 《Python3.1, Jython2.5.0, IronPython2.6.x》
配列と連結リスト, #1
■ 概要
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 と似て非なる 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
オブジェクト指向の視座:制御構造に目を奪われるのではなく「オブジェクト」に着目することで、新たな視点(視座構造)を持てるようになります。
- 作者: 秋元律郎
- 出版社/メーカー: 早稲田大学出版部
- 発売日: 2002/05
- メディア: 単行本
- この商品を含むブログ (2件) を見る
》作業中です《