教えて!gooを眺めていたら酷い出題を見た。
さぁ、皆はどう答えるだろうか。
ちと考えてみて欲しい。
ポイントは「表示される結果をかきなさい」なんだが・・・・・・。
僕の答えはこうだ。
解答:
そう、「何も表示されない」だ。
随分と酷い出題者だ。Pythonを「良く分かってなくて」出題してる臭がプンプンしてる。
前にプロシージャの話をしたんだけど。
一般には、「オブジェクト指向」でいうメソッドは「手続き指向」だ。
つまり「返り値を持たない」(※1)。
Pythonは割に「フツーの言語」なんで、やはりメソッドは返り値を持たない。
結果、「破壊的変更」前提のメソッド適用で「表示される結果」なんざあり得ないんだ。
Pythonで「破壊的変更前提」のメソッドを用いると「何も表示されない」。何故なら「破壊的変更前提」のメソッドには返り値がない、からだ。
じゃあ、「メソッド適用時」にprintすればどうなるだろうか。
やってみよう。
見た通りだ。Noneが印字される。
PythonでNoneが返る関数、とか「破壊的変更」目的のメソッドは全部「手続き的」あるいは「プロシージャ的」な動作を意味する。
おそらくこの問題は次のようにしてくれ、って意図だとは思う。
しかしながら問題文の指定は曖昧だし、なにより「出題者がPythonを理解してない」畏れがあるわけだ。
そしてハッキリ言っておく。こんなメソッドをプログラミング初心者に教えちゃならない、んだ。もうこの時点でメソッドを使ったプログラミングが面倒臭い、って思わないとならない。わざわざprintで「データを見なきゃならない」時点で面倒臭いし、これじゃあ返り値を利用してプログラミングする、と言う直球勝負な事が出来ない。
粋がって破壊的変更メソッドを使わせようとする、ってのが問題であって、この程度の「動作」なら次のように書いた方がスッキリする。
2番目の式はややこしく見えるだろう。しかし、ここでは実はnumと言う変数自体には全く手が加わってないんで、プログラミングとしては安全なんだ(※2)。
まぁ、とにかく、出題も教えてる事もお話になんない。
学校でこんなの教えて宿題出してるとすれば、学校で教えてる事もアテにならん、と言う一例だと思う(※3)。
※1: 一般的にはそうだ、という話であって、実際はプログラミング言語実装に拠る。
例えばプログラミング言語Rubyの場合だと、
このように、破壊的変更を行っても返り値がある(からインタラクティヴなirb上で「結果が表示される」わけだ)。
Rubyはこういう風に設計されてるんで、Pythonではあまり見かけない「メソッドチェーン」と言う技法が普遍化するわけだ。Rubyでは破壊的操作をしようとPythonで言うと return self しまくってる。
※2: Rustを知ってる人は、mutを付けない変数の動作を考えればいい。
※3: ここで挙げた「破壊的変更をしない」プログラミング法だと確かにメモリを多めに使い、そしてそれらを破棄する為にガベージコレクタが走り回り、その分のコストは間違いなく上昇する。
ただし、だ。それらを避ける為に最初から破壊的変更をする、ってのはドナルド・クヌースが言った「早すぎる最適化」であって、望ましくない。
まず最初は非効率だとしても安全なプログラムを書く。後にパフォーマンスで問題があったら「最適化する」でイイんだ。そういう開発プロセスを教えるべきであり、こういう意味不明な「良くわからん問題をやらせる」事自体が害悪なんだよ。