読者です 読者をやめる 読者になる 読者になる

Psycho-Logic

Psychology, Programming, and more...?

Python3 DAY1:paizaスキルチェック「N倍の文字列」

本記事では問題の解説などは行わず、初学者が「何を考えてどのような間違いをおかすのか」を見ていきます。

また、Python3を使ってプログラミングをするのはpaizaの動画講座以外では初めてでした。

それを前提に読んでいただけるとよろしいかと。
 

問題そのもの載せられないのですが大雑把に言えば、

「入力された数値に等しい個数の" * "をつなげて出力する」

というものです。

 

 回答までにかかった時間は16分3秒。

考えていた時間は5分位で、ほとんど標準入力やメソッドについて調べたり、ラットがもりもりウンチしていたのを観察したりしていました。
それでは、終えたばかりの鮮度の高い状態で最初のコードを参考にして、「誤答時の思考」を辿ろうと思います。
 
 

最初に考えたコード

 
input_lines = input()
a = "*"
b = len(input_lines)
c = a * b
print(“c", end = "")

 

 自分で言うのも何ですがこれは結構面白い間違い方をしていて、初学者の思考を如実に表しているコードだと思います。
1行ずつ思考プロセスを追って見ようと思います。
 
1行目の input_lines = input() のinput部分はあらかじめ用意されています。
次に a = “*” ですが、出力がinputの値だけ * を表示させるものなので真っ先に思い浮かびます。
ここまでは問題なし。
 

1つ目の問題児 b = len(input_lines)

はっきり言って、なぜこんなものを書いたのか理解できないと思います。

これは「標準入力が何か」と「len()メソッドが何か」を理解していないことに起因する誤答です。
 
input_linesで受け取った標準入力をlen()メソッドで数値に置き換えて、bに代入すればいいんだ!」
 
というストーリィを頭のなかで作り上げていました。
確かにinput()で受け取った入力はstr型なので、数値型に変換する必要があります。
それはint()メソッドを使えばいい話です。
len()メソッドについては「引数を数値に置き換えるメソッド」だと勘違いしていました。
実際のlen()メソッドは「引数の要素数を戻り値とするメソッド」です。
つまり、input(6)のとき ****** という出力がほしいのに、私の書いたコードだと * しか出力されません。
 
次の c = a * b ですが、上述のように変数bが誤っていることと冗長性を除けば、変数cを定義することはおかしくないかと思います。
 

2つ目の問題児 print(“c”, end = “”)

 

 

f:id:Mantra:20170209165357j:plain

 
が3つくらい並びそうですが、本当にこのように書きました。
なぜか変数cを定義したにも関わらず、それを用いずにstr型のcを出力するという暴挙。
自ら発明したスマホで釘を打つどころか、スマホを放り投げて肘鉄で釘打ちを試みる始末。
 
これは一般動詞の過去形を学んだばかりの子どもが、なんでも語尾に -ed をつけて過去形としてしまう「過剰な一般化(overgeneralization)」とよく似ています。
(教育心理学や語学など、言語習得の初期段階に普遍的に見られる現象)
 
「print()の引数には” “をつければいいんだろ、へへぇーん」
 
というような発想です。
決してそのようには習っていないのですが、人は学習するときに「自分なりに見出したパターン」をもとに探索します。
初期においてはインプットがそもそも少ないために、こうしたトンデモな間違いを犯してしまうのです。
 
 
なぜこんな初歩的な内容を詳解したのか。
一言で言えば
「できる人にできない人の考えはわからない」
からです(当然逆もしかり)。
このような鮮度の高い状態で出力された「初学者の思考プロセス」があると、何かの助けになることが(万が一くらいに)あるのではないでしょうか。
 (ちなみに、表題のDAY1というのは勉強1日目ということではなく単なるナンバリングです。)

参考サイト

・関数とメソッドの違いがわからなくて少し調べたので自分なりにまとめてみた:http://qiita.com/T-N0121/items/ecf5b911463ac9fa1d3e
・戻り値と返り値の違い:https://oshiete.goo.ne.jp/qa/531721.html
Python 3.5.2 ドキュメント 2.組み込み関数:https://docs.python.jp/3/library/functions.html
・Overgeneralization 過剰一般化:http://blogs.yahoo.co.jp/beyondthecp/11713308.html