http://www.codecademy.com
このサイトでpythonを勉強しているんだけれども、ハマった。
面白い、とかのほうのハマるじゃなくて行き詰まるの方のハマる。
整数がいくつか含まれているリストを引数にとってメジアンを計算するという課題があった。
[0,1,2]だったら1、[2,2,7,8]だったら4.5みたいな。
リストに含まれる数が奇数この時はいいんだけれども、偶数この時におかしくなる。[4,4,5,5]だったら4.5になるはずが、4を返してしまう。
真ん中2つの平均をとらず、単に合計とするとちゃんと9が帰ってくるので、計算自体は間違っていないはずで、どういうわけか小数点以下切り捨てされて整数になってしまってる…。
メジアンを格納する変数medianの宣言は
median = 0.0
という感じで宣言してるから、ちゃんと浮動小数点型になっているはずなのに…。
自分はjavaに最初に触れたので、変数の型は一度決まったら変わらないものだ、と思い込んでいた。しかし、pythonは動的型付けなので、最初に宣言した時に0.0(浮動小数点型)になっていても、その後で格納する値によって整数型になったり文字列型になったりするそうだ。(逆に、Javaは静的型付けというんだとか)
つまりメジアンの計算で、
median = { (整数型) + (整数型) } / 2
とした段階で宣言した時には確かに浮動小数点型であった変数medianが整数型に変化してしまうというのだ。(そもそも割り算なのに答えが整数型っていうのもおかしいような気が。)
ここでようやく問題は解決できて、割り算をする際に分子側をfloat()で囲って「これは浮動小数点型ですよ~」としてやることでようやく結果も浮動小数点型になってくれる。
僕はほんとにド素人なので知ったようなことはいえないんだけどもこれって何かメリットがあるんですか???
なんか、ものすごい無駄なことをやっている気がするんだけれども、どこがどう無駄な気がするのか説明できないのがつらい。
個人的には、変数の宣言も戻り値引数も全部型を明示的に示して、一度宣言したら型は変わらないといったほうが書いている時も整理しながら書けるし、あとで読むときも楽だと思うんだけれども。