この記事を読むことで、PythonのIF文をゴリゴリ使い、elif、elseなどの分岐力が鍛えられます。
IF文を鍛えるための具体例として、暇つぶしの診断チェックの代表格的な「関西人度、関東人度」診断を用います。
標準入力や比較演算子を使い、あなたの関東人ポイントがいくつで、関西人ポイントがいくつで、どちらが多いか比較して【関東人】または【関西人】を判定します。
コードのメンテナンス目的で関数の基本的な説明も掲載しました。
参考にした診断はコチラです。
あなたが「関東人」か「関西人」かを見極める10の質問 隠しても無駄だぞ!!
こちらの10問のうち、7問を使って、プログラミングに出来そうな所をPythonにアレンジしてみました。
まず、私がやってみたコチラの診断結果です。
んーーー、にゃるほど・・・。
千葉生まれ、東京都出身在住なので、まぁこうなるかな。
つまり、自分が選ばなかったものを少し選んでみると、関西人になれそうですね。
まずは、基本的なIF文と標準入力を組み合わせてみます。
YouTubeなどで関西の方が道案内をするとき、「そこ、ガ〜〜〜〜〜〜〜〜〜〜って行って、シュッと曲がって・・・」などと、擬音で案内されることがある様です。
一方関東では、「そこの信号を渡って、左側に曲がって・・・」などといった案内が一般的だと関東人の私は思います。
ここまでの流れをPythonでプログラミングしてみました。
標準入力で数字を扱う場合は、このように記述します。
#標準入力で数字を入れる
ans=int(input())
で、ansに標準入力で1または2の解答を入力します。
#関東人・関西人の質問
print('あなたが道を教える時は?')
print('1:「この横断歩道を渡って・・・」\n2:「そこをガ〜〜〜〜〜って行って・・・」')
print('あなたの解答>>>>',end="")
#標準入力で数字を入れる
ans=int(input())
#関東人・関西人の分岐処理
if ans==1:
print("あなたは【関東人】です。")
elif ans==2:
print("あなたは【関西人】です。")
else:
print('数値の1か2を押して下さい。')
質問1,2の改行は、「\n」で行っています。
macの場合は「option」+「¥」です。
また、
if ans==1:
と「==」としているのは、「=」一つだけだと代入になってしまうので、ansが1なのか判定する時は、「==」と2つ並べて書きます。
このコードでは、「あなたが道を教える時は?」と言う質問に対して、「1:この横断歩道を渡って・・・」と答えるか、「2:そこをガ〜〜〜〜って行って・・・」と答えるかで処理が分岐されます。あなたは、1または2の該当する方を選びます。
1を選んだ場合
2を選んだ場合
それ以外(999)などを押してしまった場合
質問が1つだけだと本当に関東人か関西人か分かりづらいので、関東に該当する答えを選んだ場合は、関東人ポイント(p_east)が加算され、関西に該当する答えを選んだ場合は、関西人ポイント(p_west)が加算され、どちらが多いか比較するプログラムに改良してみます。
まず、p_eastとe_westを0で初期化します。
p_east=0
p_west=0
回答に応じて点数を加算する処理
#回答に応じて関東人、関西人ポイントのそれぞれに加算
if ans==1:
p_east+=1
elif ans==2:
p_west+=1
else:#ポイントを加算する関数
def add_point(x):
return x+1
print('数値の1か2を押して下さい。')
このコードの場合は、答えが1だったら関東人ポイントを
p_east+=1
で、「+=」と、加算代入演算子で使って加えています。
また、トータルで関東人ポイントと関西人ポイントのどちらが多いかの計算結果による判定のコードはこちらになります。
同じ場合は「ハイブリッド」にしました。
変数msgに入れて、最後にprint文で出力することにより、printと書く分量を節約でき、コードが簡潔になりました。
if p_east>p_west:
msg='あなたは【関東人】です'
elif p_west>p_east:
msg='あなたは【関西人】です'
else:
msg='あなたは【ハイブリッド】です'
print(msg)
ここまでを踏まえて、質問の数を2つにします。
#関東人ポイント、関西人ポイントを初期化
p_east=0
p_west=0
#質問1
print('あなたが道を教える時は?')
print('1:「この横断歩道を渡って・・・」\n2:「そこをガ〜〜〜〜〜って行って・・・」')
print('あなたの解答>>>>',end="")
ans=int(input())
#回答に応じて関東人、関西人ポイントのそれぞれに加算
if ans==1:
p_east+=1
elif ans==2:
p_west+=1
else:
print('数値の1か2を押して下さい。')
#質問2
print('納豆は?')
print('1:「くさい!!」\n2:「美味しい」')
print('あなたの解答>>>>',end="")
q=int(input())
#回答に応じて関東人、関西人ポイントのそれぞれに加算
if q==1:
p_west+=1
elif q==2:
p_east+=1
else:
print('数値の1か2を押して下さい。')
#関東人ポイントと関西人ポイントのどちらが多いか
if p_east>p_west:
msg='あなたは【関東人】です'
elif p_west>p_east:
msg='あなたは【関西人】です'
else:
msg='あなたは【ハイブリッド】です'
print(msg)
これでもプログラムは動くのですが、このコードをじっくりと眺めてみて、ちょっと冗長な部分がございました。
例えば、
#回答に応じて関東人、関西人ポイントのそれぞれに加算
if q==1:
p_west+=1
elif q==2:
p_east+=1
else:
print('数値の1か2を押して下さい。')
と、それぞれのポイントを加算している箇所がございます。
質問が2つだけならまだしも、今後質問が増える時にちょっとコードの量が多いので、ここの部分を関数にして見ました。
加算するポイントを引数にして、関数add_pointで加算処理をしています。
#ポイントを加算する関数
def add_point(x):
return x+1
xの中に加算するポイントを入れて、returnで1加えた値を戻り値としています。
呼び出し元です。
#回答に応じて関東人、関西人ポイントのそれぞれに加算
if ans==1:
p_east=add_point(p_east)
elif ans==2:
p_west=add_point(p_west)
また、1か2以外の数字を入れた場合は、関数otherを定義しました。
#1か2以外を入力した場合のエラーメッセージ
def other():
print("数値の1か2を押して下さい。")
呼び出し元です。
(elseの所)
#回答に応じて関東人、関西人ポイントのそれぞれに加算
if ans==1:
p_east=add_point(p_east)
elif ans==2:
p_west=add_point(p_west)
else:
other()
更に、関東か関西か分岐をする処理の箇所で、
#関東人ポイントと関西人ポイントのどちらが多いか
if p_east>p_west:
msg='あなたは【関東人】です'
elif p_west>p_east:
msg='あなたは【関西人】です'
else:
msg='あなたは【ハイブリッド】です'
この部分を関数judgeとして定義しました。
#関東か関西か判定
def judge(e,w):
if e>w:
return "あなたは【関東人】です。"
elif w>e:
return "あなたは【関西人】です。"
else:
return "あなたは【ハイブリッド】です。"
呼び出し元です。
#関東人ポイントと関西人ポイントのどちらが多いか
msg=judge(p_east,p_west)
関数judgeを呼び出す際に引数として、p_eastとp_westを入れて、戻り値としてmsgにポイントが多い方の文字列が入る様にしました。
流れとして、呼び出し元のp_eastが関数judgeの仮引数のeに入り、呼び出し元のp_westが関数judgeの仮引数のwに入って、関東、関西、ハイブリッドの判定をして、その文字列を戻り値として呼び出し元のmsgに入ります。
このゲームで自分は関東ポイントがどれぐらいか、関西ポイントはどうなのか、といった分かりやすさを追及したいので、下記の行を追記しました。
print('あなたの【関東人ポイント】は【'+str(p_east)+'】で、【関西人ポイント】は【'+str(p_west)+'】です。')
ここまでをまとめたコードがこちらになります。
#関東人ポイント、関西人ポイントを初期化
p_east=0
p_west=0
#ポイントを加算する関数
def add_point(x):
return x+1
#1か2以外を入力した場合のエラーメッセージ
def other():
print("数値の1か2を押して下さい。")
#関東か関西か判定
def judge(e,w):
if e>w:
return "あなたは【関東人】です。"
elif w>e:
return "あなたは【関西人】です。"
else:
return "あなたは【ハイブリッド】です。"
#質問1
print('あなたが道を教える時は?')
print('1:「この横断歩道を渡って・・・」\n2:「そこをガ〜〜〜〜〜って行って・・・」')
print('あなたの解答>>>>',end="")
ans=int(input())
#回答に応じて関東人、関西人ポイントのそれぞれに加算
if ans==1:
p_east=add_point(p_east)
elif ans==2:
p_west=add_point(p_west)
else:
other()
#質問2
print('納豆は?')
print('1:「くさい!!」\n2:「美味しい」')
print('あなたの解答>>>>',end="")
q=int(input())
#回答に応じて関東人、関西人ポイントのそれぞれに加算
if q==1:
p_west=add_point(p_west)
elif q==2:
p_east=add_point(p_east)
else:
other()
#関東人ポイントと関西人ポイントのどちらが多いか
msg=judge(p_east,p_west)
print('あなたの【関東人ポイント】は【'+str(p_east)+'】で、【関西人ポイント】は【'+str(p_west)+'】です。')
print(msg)
流石に質問が2つだけだと寂しいので、上記の診断から7つ選んでコードを書きました。
各質問に対する回答の標準入力は、q1,q2,・・・,q7まで用意して、それぞれの回答により関東人ポイントと関西人ポイントの加算処理へと分岐させています。
では、適当に選んでみますね。
コードはこちらです。
#関東人ポイント、関西人ポイントを初期化
p_east=0
p_west=0
#ポイントを加算する関数
def add_point(x):
return x+1
#1か2以外を入力した場合のエラーメッセージ
def other():
print("数値の1か2を押して下さい。")
#関東か関西か判定
def judge(e,w):
if e>w:
return "あなたは【関東人】です。"
elif w>e:
return "あなたは【関西人】です。"
else:
return "あなたは【ハイブリッド】です。"
#質問1
print('いなりずしと言えば?')
print('1:楕円形\n2:三角形')
print('あなたの解答>>>>',end="")
ans=int(input())
#回答に応じて関東人、関西人ポイントのそれぞれに加算
if ans==1:
p_east=add_point(p_east)
elif ans==2:
p_west=add_point(p_west)
else:
other()
#質問2
print('よく見かける揚げせんべいは?')
print('1:ぼんち揚げ\n2:歌舞伎揚げ')
print('あなたの解答>>>>',end="")
ans=int(input())
#回答に応じて関東人、関西人ポイントのそれぞれに加算
if ans==1:
p_west=add_point(p_west)
elif ans==2:
p_east=add_point(p_east)
else:
other()
#質問3
print('コーヒーなどに付いてくるプラスチックの小さい白い容器は?')
print('1:ミルク\n2:フレッシュ')
print('あなたの解答>>>>',end="")
ans=int(input())
#回答に応じて関東人、関西人ポイントのそれぞれに加算
if ans==1:
p_east=add_point(p_east)
elif ans==2:
p_west=add_point(p_west)
else:
other()
#質問4
print('長さを測るものは?')
print('1:ものさし\n2:定規')
print('あなたの解答>>>>',end="")
ans=int(input())
#回答に応じて関東人、関西人ポイントのそれぞれに加算
if ans==1:
p_west=add_point(p_west)
elif ans==2:
p_east=add_point(p_east)
else:
other()
#質問5
print('「ユニバーサル・スタジオ・ジャパン」は?')
print('1:USJ\n2:ユニバ')
print('あなたの解答>>>>',end="")
ans=int(input())
#回答に応じて関東人、関西人ポイントのそれぞれに加算
if ans==1:
p_east=add_point(p_east)
elif ans==2:
p_west=add_point(p_west)
else:
other()
#質問6
print('桜餅と言えば?')
print('1:まんじゅう型\n2:クレープ型')
print('あなたの解答>>>>',end="")
ans=int(input())
#回答に応じて関東人、関西人ポイントのそれぞれに加算
if ans==1:
p_east=add_point(p_east)
elif ans==2:
p_west=add_point(p_west)
else:
other()
#質問7
print('いっせーの、')
print('1:「せっ!」\n2:「でっ!」')
print('あなたの解答>>>>',end="")
ans=int(input())
#回答に応じて関東人、関西人ポイントのそれぞれに加算
if ans==1:
p_east=add_point(p_east)
elif ans==2:
p_west=add_point(p_west)
else:
other()
#関東人ポイントと関西人ポイントのどちらが多いか
msg=judge(p_east,p_west)
print('あなたの【関東人ポイント】は【'+str(p_east)+'】で、【関西人ポイント】は【'+str(p_west)+'】です。')
print(msg)
お疲れ様でした。
ここまでをまとめると、このプログラムでは、関東ポイントの変数p_eastと、関西ポイントの変数p_westを0で初期化して選択肢ごとに分岐することにより、どちらかのポイントを加算する処理を通してIF文をゴリゴリと学んできました。
また、コードの冗長な部分を関数を使ってメンテナンスも行いました。
読んで下さってありがとうございます。
■ 参考文献の紹介 ■
じっくり丁寧にPythonを学びたい方向けの書籍を紹介します。
Pythonを基礎から中級程度まで丁寧に学びたい方におすすめの書籍です。
まずはpaizaラーニングなどの学習コンテンツで1〜2巡(苦手な所は納得がいくまで何巡でも)してからこの本で学ぶと、自分の学習状況をブログなどでアウトプット出来るようになり、また、エラーなどの不明点を調べられる力もついていきます。