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

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

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

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

Q&A

解決済

3回答

1268閲覧

無限ループを抜けたあともとの無限ループに復帰する方法

kuro_5656

総合スコア17

Python

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

0グッド

0クリップ

投稿2019/06/23 07:22

前提・実現したいこと

KeyboardInterruptで選択肢を出し、noが入力された時に元の無限ループに戻りたい。

発生している問題・エラーメッセージ

noを入力して無限ループを起すことは成功。しかし再びCtrl+cを押すとエラーになる。 上の関数と下の関数は別のものと予想。本来はtryに戻りたい。

該当のソースコード

python

1import time 2import re 3import sys 4from retry import retry 5 6@retry 7def mugen(): 8 while True: 9 time.sleep(1) 10 print('loading...') 11try: 12 mugen() 13 14except KeyboardInterrupt: 15 while True: 16 x = input('終了しますか?') 17 if x == 'yes': 18 print('end') 19 sys.exit() 20 elif x == 'no': 21 mugen() 22 else: 23 continue

試したこと

retryが必要な気がしますが、いまいちこの場合での使い方が不明。

補足情報(FW/ツールのバージョンなど)

Python3系最新、Atomを使用

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

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

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

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

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

guest

回答3

0

try を while ループに入れる。
何処を実行していて、次に実行されるのは何処か、考えましょう。tryの中のmugenが実行され、インターラプトが発生し、exceptに入ります。ここにwhileがあって、mugenが呼ばれます。このmugenはtryされていないので(それを抜けたあとなので)、割り込みを処理するものがありません。

追記

program は、 pro と gram の合成語です。pro は「あらかじめ」、gram は「書かれたもの」です。何をあらかじめ書いてあるのか。「a set of instructions given to a computer to make it perform an operation(コンピュータに何らかの操作をするように与えられる命令の組み合わせ)」です(ロングマン英英辞典より)。つまり、コンピュータに対する動作の指示書です。あなたは、コンピュータに、どのような指示を出したのでしょうか。指示した内容を理解していますか?それに対して、あなたは、コンピュータに、どのような指示を出したいのでしょうか。

Python

1import time 2import re 3import sys 4from retry import retry 5 6# def は「定義」なので、mugen というメソッドを定義する。 7@retry 8def mugen(): 9 while True: 10 time.sleep(1) 11 print('loading...') 12 13# そしてここが実行される。つぎのブロック内を試してみる。 14# 試してみて、何らかのエラーになると except されないものはエラー報告する。 15try: 16 # 定義した mugen を呼び出す。 17 mugen() 18 19except KeyboardInterrupt: 20 # KeyboardInterrupt の場合は通常ルートから除いて以下のブロックを実行する。 21 # この種のものは、try-except で除外されない限り、エラー報告される。 22 while True: 23 x = input('終了しますか?') 24 if x == 'yes': 25 print('end') 26 sys.exit() 27 elif x == 'no': 28 # try の下の mugen でキーボード割り込みが発生し、ここに来ている。 29 # では、この次に実行される mugen でキーボード割り込みが発生したら、どこへ行く? 30 mugen() 31 else: 32 continue

本当にしたいことは、次のようなことではないですか?

while True: try: mugen() except KeyboardInterrupt: 繰り返すか、問い合わせる

投稿2019/06/23 09:06

編集2019/06/23 13:21
Q71

総合スコア995

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

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

kuro_5656

2019/06/23 09:25

defで定義したwhileの中にtryを入れました。しかし、ループ自体が起動しませんでした。 予想では、ループが起動しインターラプトによって復帰を見込みましたが無限ループがしない結果になりました。whileの場所が違うのでしょうか? import time import re import sys from retry import retry @retry def mugen(): while True: time.sleep(1) print('loading...') try: mugen() except KeyboardInterrupt: while True: x = input('終了しますか?') if x == 'yes': print('end') sys.exit() elif x == 'no': mugen() else: continue import time import re import sys from retry import retry @retry def mugen(): while True: time.sleep(1) print('loading...') try: mugen() except KeyboardInterrupt: while True: x = input('終了しますか?') if x == 'yes': print('end') sys.exit() elif x == 'no': mugen() else: continue
guest

0

そのnoが入力されるところまでループに入れればいいのです

投稿2019/06/23 07:25

y_waiwai

総合スコア87774

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

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

kuro_5656

2019/06/23 07:38

KeyboardInterruptをdef mugen()の中に入れるということでしょうか?入れてみたところ無限ループそのものが動かなくなってしまいました。意図と違うコードを書いてしまったら申し訳ありません。 import time import re import sys from retry import retry @retry def mugen(): while True: time.sleep(1) print('loading...') try: mugen() except KeyboardInterrupt: while True: x = input('終了しますか?') if x == 'yes': print('end') sys.exit() elif x == 'no': mugen() else: continue
guest

0

自己解決

回答を参考に以下のように修正したら目的通り動きました。

coding:utf-8
import time
import re
import sys

def mugen():
while True:
time.sleep(1)
print('loading...')
try:
mugen()

except KeyboardInterrupt:
while True:
x = input('終了しますか?')
if x == 'yes':
print('end')
sys.exit()
elif x == 'no':
try:
print('再開')
mugen()
except KeyboardInterrupt:
continue
else:
continue

KeyboardInterruptでnoが入力された時、もう一度同じループをさせ、さらにもう一度KeyboardInterruptしたときはif文を繰り返すということをしました。
教えていただきありがとうございました。

投稿2019/06/23 12:53

kuro_5656

総合スコア17

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問