作者: 機械伯爵
日時: 2002/4/22(10:04)
 機械です。

> #---Python版 四則演算(+,-,*,/)ドリル ---
> # 単にPythonの多機能をひけらかすだけの
> # 「教育上好ましくない」コードを若干
> # 含んでいます(笑)

 ついでなんで、何について「好ましくない」のか、説明しておき
たいと思います。
 
> import whrandom , operator

 まずこれは、最初に

import whrandom
import operator

 とすべきでしょう(タプルを使うと、C言語のincludeによるヘッダ
導入の際、混乱が予想されます)
 
> ope = {                         # オペレーター関数?
>     "+" : operator.add ,
>     "-" : operator.sub ,
>     "*" : operator.mul ,
>     "/" : operator.div
> }

 演算子モジュールなんてナニに使うんだろう? と私自身が思ってた
くらい、使用頻度の低い(と思われる)代物ですから、これをいきなり
出すのはあんまりでしょう。

def add(a,b):
  x = a + b
  return x

 と、関数定義するのが普通でしょうね。

※しかもこれだと、割り算の際の処理がここで行える・・・

 まぁ、省略しても、

def add(a,b):return a+b

 ってトコでしょうか・・・

 どちらにせよ、辞書(連想配列、ハッシュテーブル)による関数オブジェ
クトの呼び出しなんてできる言語は、現在では限られているので、この方法
自体あまり誉められたものではありません。

※Pythonではcase文が無いので、if-elif-elseが妥当でしょうか・・・

 なお、このあとLispの学習につなげる、という特殊な例でない限り・・・

ope["+"] = lambdha x,y : x + y

 という、無名関数を用いた例は最悪になります・・・

■Lispは面白そうですし、いろいろ応用が利きそうなので、そういう目的が
 ある場合は上のような例もアリかと思います。

>   a = whrandom.randint(1,100)

 whrandomモジュールのrandint関数(実はメソッド・・・よって初期化しなく
ても問題ないんですな、コレが・・・)のような直感的な乱数関数があれば問題
無いのですが、フツーはもうちょっと使いづらいものが標準なので、これを使う
かどうかは好みによると思われます。

※昨今は低級言語ばかりでもないし・・・

>   if a < b : (a , b) = (b , a)  # タプルを利用したスワップ(カッコは実は不要)

 a , b = b , a

 でスワップができる文法は、直感的で便利だと思いますが、現在の段階では
まだマイナーですね。

 a→tmp , b→a , tmp→b

 という方法から入ったほうが無難かもしれません。

>   que = whrandom.choice(ope_list)

 リストの中からランダムに要素を呼び出す関数ですが、こんなモノが用意され
ている言語自体少ないと思いますので、インデックスで呼び出す方がいいでしょ
うね。

 もちろん、直感的に使えますので、これを導入として、その他の言語での場合
を教えてもかまわないと思います。

>   if que == "/" and b <> 1:     # 整数倍チェック(1以外)

 今では<>はマイナーかしらん(汗)

 Pythonは!=も使えますので、どちらでも結構です。

 あと、文字比較は高級言語なら可能ですが、低級言語の場合は引っかかる
可能性がありますので、ステップアップの先を見据えて、教える、教えない
は考えた方がいいかもしれません。

>   # Pythonの機能濫用出力(・・・良くない例)
>   print "%d問目 %d ? %d = %d" % ((11 - cnt) , a , b , ope[que](a,b))

 最悪なのは、もちろん・・・

 ope[que](a,b)

 大体、C言語のprintf出力形式さえ、タプル連結でほとんど使う必要が無い
のに、辞書から関数オブジェクトを呼び出して実行し、返り値をフォーマット
するという、わけのわからんことを行っていますので、こういうのは(面白く
とも)入門書に書くべき例ではないでしょう。

 関数が「引数を渡せば値になる」ということがしっかり理解できたと思われる
あとには、用例として使えるかもしれませんけどね。

>     if ans in ope_list : break

 メンバーテストについても、他スクリプト言語に進むなら問題なし、低級
言語なら、すこし説明がいるでしょう。

>     hit += 1
>   cnt -= 1

 古いPythonユーザに配慮するなら、PEP表記は使わない方がいいですね(汗)

 というわけで、とりわけ「概念の洪水」から入門者を守るため、やや高度な
(実際はそうでもないけど)概念を用いたコードや、言語に依存するコードは
極力避けたほうが良いと思われます。

 時々「基本的なCのコードが書けるものとして」というのを前提にした本など
ありますが、Cのコードが書けるなら、それは「その言語の未体験者」であって
も、「プログラミングの初心者」でありえるわけがないので、そういうものは、
そもそも「入門者/初心者向け」という本にはなりません。

 あと・・・数学の先生や工学関係者の「常識」って、ほぼ「非常識」です
(偏見です)のでフツーの人は学生時代にそんなに数学をまじめにやってこな
かった、という認識だけはもってほしいと切に思います。

   "元劣等生現講師(笑)" 機械伯爵