0. はじめに
「そろそろ寝ようかな?」と思っていざ寝ようとしたら記事を投稿することを忘れていることに気づき、慌てて記事投稿しました。危ない、危ない。
毎日1問、Pythonの問題を出題します。出題範囲は特に定めていませんがはじめの1ヶ月くらいは『入門Python3 第2版』の第1~11章までのことが分かれば解ける問題にしたいと思います。「こういう問題を作って欲しい」などのリクエストがございましたら初心者ながら頑張って作問します。また「別解を思いついた」、「間違えを見つけた」などがありましたら遠慮なくコメント欄にて教えて下さい。記事を執筆している当人もこの記事を読んでくださった方も新たなことを学ぶことができるので。
##1. 問題
以下のプログラムにおいて入力値が0の場合、最初のif文が実行される。しかし明示的にブール値Falseとされていなくても整数のゼロ(0)のBool値はFalseである。なぜ0はFalseとみなされるのにinput()関数が受け取る値が0のとき、きちんと最初のif文が実行されるのだろうか。その理由を説明しなさい。
print("pythonが楽しいと思う人は1を、楽しくないと思う人は0を入力してください。")
ans = int(input())
if ans == 0:
print("私も!")
elif ans == 1:
print("そいういときもあるよ")
else:
print("正しい数を入力してください")
##2. 解答
整数0のブール値ではなく条件式であるans == 0のブール値をif文は確認しているから。
##3. ヒント
if文は何のブール値を判断して条件分岐をしているのでしょうか?ちなみにブール値とはTrueかFalseのことです。
##4. 解説
今回の説明問題は今日の授業中にふと疑問に思ったことをそのまま問題として出題しました。if文がチェックしているのはif文のすぐ次に書かれている条件式です。つまり変数ansの値が0かどうかをif文は判断しているのであって「0」がTrueかFalseかを判断しているわけではありません。「なんでこんなことで自分は1時間も引っかかったのだろうか」と記事を執筆している今は思うのですが、問題文のようにカタカナと専門用語多めで説明されると引っ掛かってしまった人もいるのではないでしょうか?
##5. ans == Falseならどうなるか? (発展編)
さて、ここからは発展編です。では次の場合、整数の0を入力するとどうなるでしょうか?
print("pythonが楽しいと思う人は1を、楽しくないと思う人は0を入力してください。")
ans = bool(input())
if ans == False:
print("私も!")
# 以下省略
今回もうまくいくかと思いきや、「私も!」とは表示されずうまくいきません。理由はわかりますか?答えは「inputで入力された整数0は文字列の0に変換されるから」です。整数の0や浮動小数点0.0はそれ自身がFalseとみなされるのですが、文字列の0は単なる文字なのでTrueと見なされます。そのためif文の左辺「変数ansのブール値はTrue:、右辺は「False」となりif文は実行されません。
print("pythonが楽しいと思う人は1を、楽しくないと思う人は0を入力してください。")
ans = bool(input())
print(type(ans)) # ->文字列の0と認識されるのでTrue
if ans == False:
print("私も!")
# 以下省略
もう1つ事例を考えてみましょう。次の場合、0を入力するとどうなるでしょうか?
print("pythonが楽しいと思う人は1を、楽しくないと思う人は0を入力してください。")
ans = bool(int(input()))
print(ans)
if ans == False:
print("私も!")
# 以下省略
今回は「私も!」と表示されうまくいきました。上手く言ったのは入力値を整数に変えてからブール値を求めたからです。
##6. まとめ
・if文はその後に書かれた条件式のブール値を確認して処理する。
→・「if文自体が bool関数を使って True か False を判断してくれる」
コメント欄にて教えていただいたのでまとめを変更しました。
@shiracamus様、本当にありがとうございます!
##7. おまけトーク
この疑問を思いついたのは授業中なのですが、その授業はPythonに関する授業じゃなかったんですよ。何の授業だったと思いますか?
・・・
実は古代ローマ史の授業でした。はい。最後まで読んでいただき本当にありがとうございます。
##参考文献
「Bill Lubanovic著『入門Python3 第2版』(オライリー・ジャパン、ISBN978-4-87311-932-8)