機械です。
> #---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のコードが書けるなら、それは「その言語の未体験者」であって
も、「プログラミングの初心者」でありえるわけがないので、そういうものは、
そもそも「入門者/初心者向け」という本にはなりません。
あと・・・数学の先生や工学関係者の「常識」って、ほぼ「非常識」です
(偏見です)のでフツーの人は学生時代にそんなに数学をまじめにやってこな
かった、という認識だけはもってほしいと切に思います。
"元劣等生現講師(笑)" 機械伯爵