質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

525閲覧

ifを2つ以上使っていて、本来はelifを使うはずなのに、エラーが出ない

gunmed

総合スコア55

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1グッド

0クリップ

投稿2019/01/23 13:22

じゃんけんのifの仕組みをしっかり理解したい。

じゃんけんを作るコードを練習として書いていました。それが以下です。

import random hand_dict = { '1': 'グー', '2': 'チョキ', '3': 'パー' } print('手を入力してください') print('1:グー 2:チョキ 3:パー') player_input = input() list = [1, 2, 3] if int(player_input) not in list: print('入力が正しくありません。') exit() else: player = hand_dict[player_input] print('入力した手: ' + player) com_input = random.choice(['1', '2', '3']) com = hand_dict[com_input] print('コンピューターの手: ' + com) print(player, 'VS', com,sep='') if player == 'グー': if com == 'チョキ': print('あなたの勝ち') if com == 'パー': print('コンピューターの勝ち') if com == player: print('あいこ') if player == 'チョキ': if com == 'パー': print('あなたの勝ち') if com == 'グー': print('コンピューターの勝ち') if com == player: print('あいこ') if player == 'パー': if com == 'グー': print('あなたの勝ち') if com == 'チョキ': print('コンピューターの勝ち') if com == player: print('あいこ')

結果はなぜか正常に扱われました。

プレイヤーがだしてきたグーショキパーに対してcomの対応を決める際に、単純にifですべてつないでしまったのですが、本を見たらifを2つ以上つなげる時はelifを用いるとなっていました。ただし、入れ子ならばifのインデントの中に連続してifを入れることができるらしいです。
今回のコードでは並列してifを3つも使っているので、なぜ正しくコードが出力されたのかわかりません。
お分かりになられた方がいたら、ご教授お願いします。

一応、elifとelseをつかって書き直したのが以下で正しく動きました。

import random hand_dict = { '1': 'グー', '2': 'チョキ', '3': 'パー' } print('手を入力してください') print('1:グー 2:チョキ 3:パー') player_input = input() list = [1, 2, 3] if int(player_input) not in list: print('入力が正しくありません。') exit() else: player = hand_dict[player_input] print('入力した手: ' + player) com_input = random.choice(['1', '2', '3']) com = hand_dict[com_input] print('コンピューターの手: ' + com) print(player, 'VS', com,sep='') if player == 'グー': if com == 'チョキ': print('あなたの勝ち') elif com == 'パー': print('コンピューターの勝ち') else: print('あいこ') elif player == 'チョキ': if com == 'パー': print('あなたの勝ち') elif com == 'グー': print('コンピューターの勝ち') else: print('あいこ') else: if com == 'グー': print('あなたの勝ち') elif com == 'チョキ': print('コンピューターの勝ち') else: print('あいこ')

ifとelifの使い分け

bochan2👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

プレイヤーがだしてきたグーショキパーに対してcomの対応を決める際に、単純にifですべてつないでしまったのですが、本を見たらifを2つ以上つなげる時はelifを用いるとなっていました。

正しくは、『elifを使うと効率が良い場合がある』ですかね。

Python

1num = 0 2 3if num == 0: # 条件を判定して、真なら実行 4 ... 5 6if num == 1: # 条件を判定して、真なら実行 7 ... #

Python

1num = 0 2 3if num == 0: # 条件を判定して、真なら実行 4 ... 5 6elif num == 1: # 直前のif文の中身が実行されたならスキップ、 7 # そうでないなら条件を判定して、真なら実行 8 ...

また、条件に依っては挙動が異なることもあります。

Python

1num = 15 2if num % 3 == 0: 3 print('3の倍数') 4 5if num % 5 == 0: 6 print('5の倍数')

Python

1num = 15 2if num % 3 == 0: 3 print('3の倍数') 4 5elif num % 5 == 0: 6 print('5の倍数')

実行結果を予想してから、実際に試してみると良いでしょう。

ただし、入れ子ならばifのインデントの中に連続してifを入れることができるらしいです。

入れ子であるかどうかは関係ないです。
これについて参考書に間違いがあるとはちょっと考えづらいので、誤読していると思います。

今回のコードでは並列してifを3つも使っているので、なぜ正しくコードが出力されたのかわかりません。

効率的かはともかく、間違っているわけでは全く無いから。

おまけ

elifやelseを使うメリットが無い場合もあります。
例えば、しばしばこんなコードを目にしますが、個人的にはちょっと冗長に思えます。

Python

1def is_aho(num): 2 """3の倍数か3の付く数値なら真を返す""" 3 if num % 3 == 0: 4 print('3の倍数') 5 return True 6 elif '3' in str(num): 7 print('3が付く数') 8 return True 9 else: 10 return False

次のように書き換えられます。

Python

1def is_aho(num): 2 """3の倍数か3の付く数値なら真を返す""" 3 if num % 3 == 0: 4 print('3の倍数') 5 return True 6 7 # ここに来ている時点で3の倍数で無いことは確定 8 if '3' in str(num): 9 print('3が付く数') 10 return True 11 12 # ここに来ている時点で、直前の二条件を満たさないことは確定 13 return False

投稿2019/01/23 13:30

編集2019/01/23 13:49
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gunmed

2019/01/23 13:39

回答ありがとうございます。 なるほど、モヤモヤしていたifとelifの使い分けがきちんとわかりました。 わかりやすい例としてのコードもわかりやすかったです。理解に役立ちました。 ありがとうございました。
gunmed

2019/01/23 14:00

ご指摘ありがとうございます。教科書をもう一度読んでみます。 おまけ、ありがとうございます。時と場合に応じて適切にできるよう意識していきます。
guest

0

条件が同時には成立しない(排他的)な場合は、処理結果はどちらも同じです。
単純なケースを書くと、

Python

1if x > 0: 2 print("正") 3if x < 0: 4 print("負") 5 6if x > 0: 7 print("正") 8elif x < 0: 9 print("負")

正の時に、x < 0の演算をするかどうかの違いがあります。

投稿2019/01/23 13:30

編集2019/01/23 13:31
otn

総合スコア84505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gunmed

2019/01/23 13:37

回答ありがとうございます。 なるほど、ということは、今回のじゃんけんの条件コードは対他的な条件設定だったため、結果は同じになったのですね。 理解できました。ありがとうございました。
otn

2019/01/23 13:40

if x > 0: ~ if y > 0: と、 if x > 0: ~ elif y > 0: は大きく違います。
gunmed

2019/01/23 13:58

なるほど、自分の理解が正しければ、後者はx > 0が成り立った時点で y >0はもう行わない、ということですよね。勉強になります。
guest

0

5 つの勝敗判定方法を書いてみました。

judge_0 は質問文にあるような、全パターンを if で処理しています。
judge_1 は、 else をつかって 比較処理をすこし減らしています。
judge_2 は、さらに手の比較処理を減らしています。
それぞれの方法での比較処理回数の平均を計算してみてください。

judge_3 は if でなく、表を引くようにしています。
表を引くには内部で値の比較処理をしているはずですが、プログラムコード上のは if での比較ロジックは現れません。

judge_4 は、ジャンケンのルールを数値での演算処理に変換したものです。
勝敗判定結果から表示文字をつくる部分には Hash 表をつかっていますが、勝敗判定は数値演算だけで処理しています。

python3

1import random 2 3# if だけで 9 通りを判定 4def judge_0(com, human): 5 if human == 'グー': 6 if com == 'チョキ': 7 print('あなたの勝ち') 8 if com == 'パー': 9 print('コンピューターの勝ち') 10 if com == human: 11 print('あいこ') 12 if human == 'チョキ': 13 if com == 'パー': 14 print('あなたの勝ち') 15 if com == 'グー': 16 print('コンピューターの勝ち') 17 if com == 'チョキ': 18 print('あいこ') 19 if human == 'パー': 20 if com == 'グー': 21 print('あなたの勝ち') 22 if com == 'チョキ': 23 print('コンピューターの勝ち') 24 if com == 'パー': 25 print('あいこ') 26 27# if elif else で 9 通りを判定 28def judge_1(com, human): 29 if human == 'グー': 30 if com == 'チョキ': 31 print('あなたの勝ち') 32 elif com == 'パー': 33 print('コンピューターの勝ち') 34 else: 35 print('あいこ') 36 elif human == 'チョキ': 37 if com == 'パー': 38 print('あなたの勝ち') 39 elif com == 'グー': 40 print('コンピューターの勝ち') 41 else: 42 print('あいこ') 43 else: 44 if com == 'グー': 45 print('あなたの勝ち') 46 elif com == 'チョキ': 47 print('コンピューターの勝ち') 48 else: 49 print('あいこ') 50 51# あいこ と 勝ち の条件を列挙して判定 52def judge_2(com, human): 53 if com == human: 54 print('あいこ') 55 elif ((human == 'グー' and com == 'チョキ') or 56 (human == 'チョキ' and com == 'パー') or 57 (human == 'パー' and com == 'グー')): 58 print('あなたの勝ち') 59 else: 60 print('コンピューターの勝ち') 61 62JUDGE_TABLE = { 63 'グー': {'グー': 0, 'チョキ': 1, 'パー': -1}, 64 'チョキ': {'グー': -1, 'チョキ': 0, 'パー': 1}, 65 'パー': {'グー': 1, 'チョキ': -1, 'パー': 0} 66} 67MESSAGES = { 68 -1: 'コンピューターの勝ち', 69 0: 'あいこ', 70 1: 'あなたの勝ち' 71} 72# 勝敗表を引いて判定 73def judge_3(com, human): 74 print(MESSAGES[JUDGE_TABLE[human][com]]) 75 76MESSAGES_X = { 77 0: 'あいこ', 78 1: 'あなたの勝ち', 79 2: 'コンピューターの勝ち' 80} 81# 数値演算で判定 82def judge_4(com, human): 83 print(MESSAGES_X[(com + 3 - human) % 3]) 84 85hand_dict = { 86 '1': 'グー', 87 '2': 'チョキ', 88 '3': 'パー' 89} 90enable_hands = list(hand_dict.keys()) 91 92# for human_input in enable_hands: 93# human = hand_dict[human_input] 94# for com_input in enable_hands: 95# com = hand_dict[com_input] 96# print(human, 'VS', com) 97# judge_0(com, human) 98# judge_1(com, human) 99# judge_2(com, human) 100# judge_3(com, human) 101# judge_4(int(com_input), int(human_input)) 102 103while True: 104 print('手を入力してください') 105 print('1:グー 2:チョキ 3:パー') 106 107 human_input = input() 108 if human_input not in enable_hands: 109 print('入力が正しくありません。終了します。') 110 break 111 112 human = hand_dict[human_input] 113 print('入力した手: ' + human) 114 115 com_input = random.choice(enable_hands) 116 com = hand_dict[com_input] 117 print('コンピューターの手: ' + com) 118 119 print(human, 'VS', com,sep='') 120 judge_0(com, human) 121 judge_1(com, human) 122 judge_2(com, human) 123 judge_3(com, human) 124 judge_4(int(com_input), int(human_input))

投稿2019/01/24 15:02

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問