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

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

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

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

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

Python

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

Q&A

解決済

3回答

27632閲覧

exceptでcontinueする時としない時の違い

sasuke_killer

総合スコア42

Python 3.x

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

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

Python

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

0グッド

0クリップ

投稿2018/08/15 12:55

編集2018/08/15 13:02

ちょっとしたプログラムを作ってみたのですが、最後の行にcontinueを入れる時といれない時とでは何か違うのでしょうか?

python3

1kill=[1,2,5,6] 2while True: 3 try: 4 kill_count=int(input("キル数は: ")) 5 if kill_count: 6 kill.append(kill_count) 7 x=len(kill) 8 y=sum(kill) 9 print("平均キル数:{}".format(y/x)) 10 print("やり直しますか? はい/いいえ") 11 w=input("どちらにしますか?: ") 12 if w=="はい": 13 print("注意。結果は保持されません") 14 print("") 15 continue 16 elif w=="いいえ": 17 print("終了します") 18 break 19 else: 20 print("はい/いいえ のどちらかを入力してください") 21 else: 22 print("入力してください") 23 except: 24 print("数字を入力してください") 25 continue

あと、無駄な部分とかあったら教えてくれると嬉しいです。

回答お待ちしております。

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

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

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

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

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

hayataka2049

2018/08/15 12:57

この質問タイトルであれば、実際にreturnが入ったプログラムを示していただけませんか
sasuke_killer

2018/08/15 13:01

あ、間違えました。continueでした!申し訳ないです...
hayataka2049

2018/08/15 13:02 編集

もう回答書いちゃったよ! 私は別にいいんですが、気をつけてくださいね。質問タイトルは修正しておいてください
sasuke_killer

2018/08/15 13:03

はい。答えにくいものも回答していただきありがとうございます...気を付けます!
guest

回答3

0

ベストアンサー

あと、無駄な部分とかあったら教えてくれると嬉しいです。

一番気になるのは、例外を捕捉する範囲が広すぎる点。
tryを利用するのは局所的に、捉える例外は限定的にします。

今回の場合、ループの先頭の方で次のようにするのが丁寧です。

Python

1while True: 2 try: 3 kill_count=int(input("キル数は: ")) 4 except ValueError: 5 print("数字を入力してください") 6 continue 7 8 ...

これは上手い具合に、continueの有無で結果が変わる例にもなっていますね。

書いてみた

仕様を若干変更しても良いなら、私ならこのように書きます。
終了条件はEOFの読み取りです。Windowsなら Ctrl+Z、Mac/Linuxなら Ctrl+D で送出できます。

Python

1def main(): 2 kill = [1, 2, 5, 6] 3 4 while True: 5 try: 6 kill_count = input("キル数は: ") 7 except EOFError: 8 print('終了します') 9 break 10 11 if not kill_count: 12 print('入力してください') 13 continue 14 15 try: 16 kill_count = int(kill_count) 17 except ValueError: 18 print('整数値を入力してください') 19 continue 20 21 kill_tmp = kill + [kill_count] 22 print(f'平均キル数: {sum(kill_tmp) / len(kill_tmp)}') 23 24 25if __name__ == '__main__': 26 main()

元のコードに比べて優位なところはこんな感じですかね。

  • モジュールの名前空間を汚染しない
  • ネストが減って、コードを追いやすくなっている
  • 標準入力がリダイレクトされても上手く捌ける
  • キル数として0を入力したときにエラー表示されるバグの改善
  • 終了条件が(慣れている人にとっては)明確

今は何のことやら分からないかもしれません。
もうちょっと勉強してから見返してみると意味が汲み取れる... かも?

投稿2018/08/15 13:06

編集2018/08/15 13:45
LouiS0616

総合スコア35658

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

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

sasuke_killer

2018/08/15 13:11

Errorって条件式にも使えるんですね! 回答ありがとうございました!
LouiS0616

2018/08/15 13:14

一つ気になるんですけど、『結果は保持されません』と書いているのに実際には結果を溜め込んでいるように見えます。これは想定通りでしょうか?
sasuke_killer

2018/08/15 13:21

あ、本当ですね...もしかしたらkillリストをwhileの中ではなく最初に定義したからでしょうか... とりあえず、書き換えておきます。
sasuke_killer

2018/08/15 13:28

どうやらそのようですね。ありがとうございます!
sasuke_killer

2018/08/15 13:51

ですね、4つ目と5つ目以外全く分かりませんw でも、これが理解できれば新しいことを学べそうな気がします!w 何度もありがとうございます!
guest

0

while の中で kill 数の入力、計算結果の表示、継続有無の入力をしており、行数が多くなっています。
処理を関数として切り出して、 main の while 本体の行数を少なくしました。

キー入力や画面出力と関係せずに 計算処理部分が関数として独立することになりました。
もっと複雑な計算処理になった場合、そのテストコードを書きやすくなったはずです。

python

1def get_number(): 2 while True: 3 try: 4 return int(input("キル数は: ")) 5 except ValueError: 6 print('整数値を入力してください') 7 8 9def ask_quit(): 10 while True: 11 str = input("終了しますか? Y/N:") 12 if str == 'Y': 13 return True 14 if str == 'N': 15 return False 16 print("Y か N のどちらかを入力してください") 17 18 19def calc_average(records, num): 20 return (sum(records) + num) / (len(records) + 1) 21 22def show_average(records, num): 23 print("平均キル数:{}".format(calc_average(records, num))) 24 print("注意。結果は保持されません") 25 26 27kill_records = [1, 2, 5, 6] 28while True: 29 show_average(kill_records, get_number()) 30 if ask_quit(): 31 break 32

投稿2018/08/15 15:12

編集2018/08/15 23:22
katoy

総合スコア22324

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

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

sasuke_killer

2018/08/15 23:12

これが関数型プログラミングってやつですね! 確かに、小さな関数を組み合わせる方法わかりやすいですね。 あ、そうそう、calc_average関数のところ、returnがなかったので平均値がNoneで返ってきてましたよ それでも、こんなコードがすぐに書けるのは凄いです! 頑張ります! 回答ありがとうございました!
katoy

2018/08/15 23:21

return を追加する修正をしました。
katoy

2018/08/16 01:00

質問文にあった "contonue を,,," という問題自体が発生しないように main のの while 本体を構成することが、上の書き換えの本当の意図です。 ("テストしやすさ..." は後からつけた理由です)
guest

0

continueだったとのことで・・・

えっと、結論だけいうと特に何も変わりません。

continueは「ループ内の以後の処理はすっ飛ばすが、ループは続ける」という文ですね。たとえばこんな風に使えます。

python

1>>> # 偶数だけprint 2>>> for x in range(10): 3... if x%2 == 1: # 奇数のときはcontinue 4... continue 5... print(x) # 奇数のときはこのprintは実行されない。偶数のときだけ実行される 6... 70 82 94 106 118

そのプログラムではcontinueのあとに何らかの処理が行われる訳ではないので、あってもなくても同じです。


このケースだと、LouiS0616さんの回答のように活用するとスマートかと。

投稿2018/08/15 13:01

編集2018/08/15 13:10
hayataka2049

総合スコア30933

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

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

sasuke_killer

2018/08/15 13:03

すみません、ド勘違いをしていました...
hayataka2049

2018/08/15 13:08 編集

回答内容を修正しました
sasuke_killer

2018/08/15 13:09

確かにそうですね! 回答ありがとうございました!
katoy

2018/08/16 00:59 編集

削除
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問