for と別れる50の方法《00》K&R の事例から
Python.use(better) # OOP への道 《Python3.1, Jython2.5.0, IronPython2.6.x》
K&R の事例から
■ 概要
for 文はいくつかの問題を抱え、OOP を実践するときの「障害」になります。
伝統的なC言語風の for 文や悪名高い switch 文、配列の呪縛から解かれ、オブジェクト指向プログラミング〔OOP〕の醍醐味を堪能するための準備を行います。
■ 関連記事
- INDEX〈Python〉
- INDEX〈Swing〉
- INDEX〈WPF〉
- Java プログラマーのための Python 導入ガイド
- 例題で学ぶ Jython/Swing デザインパターン《Jython2.5》改訂版
- ゲームに学ぶ Jython/Swing フレームワーク《Jython2.5》改訂版
- IronPython で学ぶ WPF プログラミングの世界《IronPython2.6》改訂版
何が問題か
雛鳥は最初に見た動くものを親だと信じ込む…とされる「刷り込み」と同様に、最初に見たコードから得た知識や経験は、その後のプログラマー人生にも多大な「影響」を及ぼすことは、容易に想像できるでしょう。しかし、それは同時に、新たな知識や経験を獲得 するときの「障害」にもなりかねません。
C言語の「バイブル」の代名詞でもある K&R には、伝統的な for 文を利用した事例を紹介しています。しかし、for 文はいくつかの問題を抱え、OOP を実践 するときの「障害」になりがちです。そこで、その問題点を明らかにするとともに、それを解消する術を紹介します。
事例:K&R, p.13
K&R の読者の多くは、以下の事例によって、for 文を知ることになるでしょう。
main()
{
int fahr;
for (fahr = 0; fahr <= 300; fahr = fahr + 20)
printf("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32));
}
さらに、これと同等の表現が、while 文を利用すると、次のようになります。
fahr = 0;
while (fahr <= 300) {
printf("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32));
fahr = fahr + 20;
Python には、伝統的なC言語風の for 文がありません。そこで、for 文に起因する問題点を、同等の while 文によって指摘します。
《Note》Python にも for 文はあります。しかし、これはC言語風の for 文とは「異質」のものです。C言語における while/for の違いを同義語とするなら、Python の for は、同音異義語(似て非なるもの)のようなものです。
事例:Python3.1 版
話を先に進める前に、K&R の事例と同等のコードを Python で記述すると、次のようになります。
#! /usr/local/bin/python3.1 for fahr in range(0, 301, 20): print("%3d %6.1f"%(fahr, (5.0/9.0)*(fahr-32))) fahr = 0 while fahr <= 300: print("%3d %6.1f"%(fahr, (5.0/9.0)*(fahr-32))) fahr = fahr + 20
Python の for 文(C言語風の for 文とは似て非なるもの)については、少し補足しておく必要があるでしょう。ここでは、組み込み関数 range を利用して、0 以上 301 未満の等差数列(公差 20)を列挙した値を、変数 fahr を介して参照します。
Tips
》作業中です《