#python #loops #exception #keyboardinterrupt
Вопрос:
Я построил хронометр с помощью python, сначала довольно простой, а затем добавил команду «пауза/возобновление». Итак, в первом отрывке KeyboardInterrupt работает просто отлично, но когда я перезапускаю процесс, он перезапускается, переходит в цикл, но когда я прерываю выполнение, он просто завершает программу, не переходя к предыдущему оператору и далее. Я хочу понять, почему это происходит, пожалуйста, напишите код ниже: я немного изменился после ответа здесь, но это тоже не сработало. Поэтому я передаю измененный код ниже моего первоначального кода.
«‘питон
def start_chronometer(passed: float = 0):
import time
beginning = time.time()
n = 0
try:
while True:
n = 1
except KeyboardInterrupt:
past = (time.time() - beginning) passed
possibilities = ['Y', 'N']
while (choice := input('Wish to resume counting ? y - Yes / n - No: ').title()) not in possibilities:
print('Valor precisa ser "s" ou "n"')
if choice == possibilities[0]:
start_chronometer(passed=past)
else:
if 60 <= past < 3600:
print(f'The time passed since the beginning of the counting was: {past / 60} minutes')
elif 3600 <= past:
print(f'The time passed since the beginning of the counting was: {past / 3600} hours')
else:
print(f'The time passed since the beginning of the counting was: {past} seconds')
start_chronometer()
def start_chronometer(passed: float = 0):
while True:
aux = passed
import time
beginning = time.time()
n = 0
try:
while True:
n = 1
except KeyboardInterrupt:
past = (time.time() - beginning) aux
possibilities = ['Y', 'N']
while (choice := input('Wish to resume counting ? y - Yes / n - No: ').title()) not in possibilities:
print('Valor precisa ser "s" ou "n"')
if choice == possibilities[0]:
passed = past
pass
else:
break
if 60 <= past < 3600:
print(f'The time passed since the beginning of the counting was: {past / 60} minutes')
elif 3600 <= past:
print(f'The time passed since the beginning of the counting was: {past / 3600} hours')
else:
print(f'The time passed since the beginning of the counting was: {past} seconds')
start_chronometer()
»’
Комментарии:
1. не могу воспроизвести проблему, пожалуйста, будьте более конкретны
2. когда я перезапущу процесс , вы имеете в виду, что на самом деле снова запустите программу? Или вы имеете в виду, что отвечаете «y» на запрос вопроса?
3. Вот и все, я отвечаю Y, а затем он снова вызывает функцию, хорошо? Таким образом, он «запускается заново» и работает нормально до цикла de while, когда я вызываю прерывание де второй клавиатуры, программа просто останавливается
4. Когда я вызываю второе отключение клавиатуры, он должен снова спросить меня, хочу ли я возобновить подсчет, но этого не происходит, просто останавливается
Ответ №1:
Это потому except
, что блок обработки находится вне while True:
цикла.
Когда вы нажимаете ctrl-C в первый раз и выбираете продолжить, start_chronometer
выполняется рекурсивно во второй раз. Но когда рекурсивная функция завершается, исходное выполнение продолжается и достигает конца функции, потому что она больше не находится в цикле.
Измените свой код так, чтобы он while True
охватывал все:
while True:
try:
n = 1
except:
...
Также вам нужно будет добавить break
инструкцию, когда пользователь решит остановиться, чтобы цикл завершился.
Комментарии:
1. Я понимаю ваше решение, я вижу, что оно также возможно, но оно все еще не работает… Та же проблема. Программа просто останавливается при втором прерывании
2. Я не понимаю, как это возможно. Можете ли вы обновить вопрос своим новым кодом?