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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1945閲覧

if:条件NG時の再計算

motto

総合スコア12

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/08/15 14:44

###質問事項
質問タイトルがわかり辛くすみません。

pythonの基礎勉強をしています。
下記補足に記したように、whileループの中にif文を2つ作り、各々ifの条件次第で、各々のif文の頭に戻るようにしたいのですが、良いやり方がわかりません。

1つ目のif文に関してはcontinueによりwhileの次のループに行けば良いと考えたのですが、2つ目のif文ではどのように記載すれば良いか分からず、補足に記したように、2つ目のif文を(無意味に)whileループで囲い、こちらもcontinueを用いました。

結果、期待通りに動作するのですが、もっとsmartな書き方があるのだろうと想像しています。
何か、スッキリした書き方はないでしょうか?
すみませんが、ご教示の程、よろしくお願いします。

##補足

python

1i = 1 2out = [] 3while i>0: 4 print('i= '+str(i)) 5 ##if(1) 6 in1 = input('go or exit: ') 7 if in1 == 'go': 8 i += 1 9 elif in1 == 'exit': 10 break 11 else: 12 print('Invalid input.') 13 continue 14 ##if(2) 15 while i>0: 16 in2 = input('Enter a or b: ') 17 if in2 == 'a': 18 out.append('a') 19 break 20 elif in2 == 'b': 21 out.append('b') 22 break 23 else: 24 print('Invalid input.') 25 continue 26 print ('out= ',out)

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

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

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

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

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

guest

回答2

0

ベストアンサー

スマートに見えないのは、メインループと入力ループが同じ場所にあるからかと思います。
以下の様に入力ループを関数に切り出してあげると幾分読みやすいコードになるかと思います。

python

1def input_item(ask, cand): 2 while True: 3 inp = raw_input(ask) 4 # 候補にある場合だけ結果を返す 5 if inp in cand: 6 return inp 7 print('Invalid input.') 8 9def main(): 10 i = 1 11 out = [] 12 while True: 13 print('i= '+str(i)) 14 inp = input_item('go or exit: ', ('go', 'exit')) 15 if inp == 'exit': 16 break 17 i += 1 18 inp = input_item('Enter a or b: ', ('a', 'b')) 19 out.append(inp) 20 print ('out= ',out) 21 return out 22 23main()

投稿2017/08/15 17:16

mattn

総合スコア5030

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

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

motto

2017/08/15 23:40

入力ループを切り出すと、メインがスッキリしますね!メインも読みやすくなりました。ありがとうございました!
guest

0

入力の検証を別のメソッドに切り分けて、その中でループさせるようにしてください。
以下の例では再帰を用いて、正しい結果が返るまでループさせています。

python

1def validate_input(msg, ls): 2 inp = input(msg) 3 if inp in ls: 4 return inp 5 else: 6 return validate_input(msg, ls) 7 8i = 1 9out = [] 10while i>0: 11 print('i= '+str(i)) 12 ##if(1) 13 in1 = validate_input('go or exit: ', ('go','exit')) 14 if in1 == 'go': 15 i += 1 16 elif in1 == 'exit': 17 break 18 ##if(2) 19 in2 = validate_input('Enter a or b: ', ('a', 'b')) 20 if in2 == 'a': 21 out.append('a') 22 elif in2 == 'b': 23 out.append('b') 24 print ('out= ',out)

投稿2017/08/15 15:26

編集2017/08/15 17:29
tsuemura

総合スコア663

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

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

chelsy7110

2017/08/15 16:54

validate_inputの中のvalidate_input(msg, ls)にはreturnをつけないとおかしな動作になると思います。 また、この場合は再帰を使うのはあまり適当でないのでは無いでしょうか。 validate_inputの中のelse以下を削除して、 inp in ls がtrueとなるまでvalidate_inputメソッドの中でループさせる方がスマートでしょう。 あと、in2の方はbreakいらないと思います。
tsuemura

2017/08/15 17:33

ご指摘ありがとうございます。修正しました。 > また、この場合は再帰を使うのはあまり適当でないのでは無いでしょうか。 > validate_inputの中のelse以下を削除して、 inp in ls がtrueとなるまでvalidate_inputメソッドの中でループさせる方がスマートでしょう。 これを言われてしまうと、僕は別途「ループと再帰どっちがスマートですか?」という質問を立てなくてはいけなくなってしまいます(w ただ、本質はメソッドの切り出しにあるので、再帰をことさらに強調する必要はないですね。説明文に補記しました
motto

2017/08/15 23:44

>TakuyaSuemuraさん 入力検証を切り出すことでスッキリしました!こういう場面でも、再帰が使えるのですね、勉強になりました。どうもありがとうございました。 >chelsyさん 追加コメントありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問