python — Как правильно выйти из бесконечного цикла
Вопрос задан
Изменён 11 месяцев назад
Просмотрен 253 раза
Столкнулся с проблемой в цикле.
Его нужно прервать по команде "done:"
, но при этом, чтобы вызывалась ошибка «Invalid input» в блоке try / except.
В моем же случае исключение ошибки ввода не позволяет прервать такой цикл строчкой.
largest = 0 smallest = 0 while True: try: num = int(input("Enter a number: ")) except: print("Invalid input") continue if num == "done": break elif largest < num: largest = num elif smallest < num: smallest = num print("Maximum is ", largest) print("Minimum is ", smallest)```
- python
- python-3.
- циклы
- while
- break
12
Попробуйте так
largest = 0 smallest = 0 fl = False while True: try: _input = input("Enter a number: ") num = int(_input) except Exception as e: print(f"Invalid input: {e}") num = _input fl = True #print(f'num = {num}') # # continue if num == "done": break elif fl: fl = False elif largest < num: largest = num elif smallest < num: smallest = num print("Maximum is ", largest) print("Minimum is ", smallest)
Предлагаю Вам так:
largest = 0 smallest = 0 while True: try: answer = input("Enter a number: ") number = int(answer) except (TypeError, ValueError): if answer == "done": break else: print("Invalid input") else: if largest < number: largest = number elif number < smallest: smallest = number print("Maximum is ", largest) print("Minimum is ", smallest)
values = {0} while True: if (reply := input("Enter a number: ")) == 'done': break sign = '' if reply.startswith(('+', '-')): sign, *val = reply reply = ''.join(val) if not reply.isnumeric(): print('Wrong value. Try once more.') continue values.add( int(sign + reply) ) print("Maximum is ", max(values)) print("Minimum is ", min(values))
Если чем-то не устраивает использование max
и min
можно так:
smallest = 0 largest = 0 while True: if (reply := input("Enter a number: ")) == 'done': break sign = '' if reply.startswith(('+', '-')): sign, *val = reply reply = ''.join(val) if not reply.isnumeric(): print('Wrong value. Try once more.') continue smallest, _, largest = sorted([smallest, int(sign + reply), largest]) print("Maximum is ", smallest) print("Minimum is ", largest)
Зарегистрируйтесь или войдите
Регистрация через Google
Регистрация через Facebook
Регистрация через почту
Отправить без регистрации
Почта
Необходима, но никому не показывается
Отправить без регистрации
ПочтаНеобходима, но никому не показывается
Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки
python — Как выйти из двух вложенных циклов
Ищу циклом текущего пользователя компьютера в локальной сети
def scan_Lan(): ip_list = ['192.168.4.'] i = 50 while i <= 240: scan_ip = ip_list[0] + str(i) response = subprocess.Popen(["ping", "-n", "1", "-w", "200", scan_ip]).wait() if(response == 0): try: wql = 'SELECT * FROM Win32_computerSystem' c = wmi.WMI(scan_ip, user='office\admin', password='fff') for item in c.query(wql): currentUser = str(item.UserName) print(currentUser) if(currentUser == "ivanov"): print(scan_ip) break except: print("-") i += 1 print("end") scan_Lan()
Все хорошо работает, но хочу после поиска выходить полностью из цикла while, как это сделать? Поставил вот здесь
print(scan_ip) break
но он по всей видимости выходит только из for, а как сделать глобальный break?
- python
- python-3.x
1
break
прекращает только вложенный цикл. Внешний цикл продолжает работать. Используйте
return
, когда результат найден в вашем случае:
if current_user == 'ivanov': return scan_ip
Можно сделать так
while i <= 240: scan_ip = ip_list[0] + str(i) response = subprocess.Popen(["ping", "-n", "1", "-w", "200", scan_ip]).wait() if(response == 0): try: wql = 'SELECT * FROM Win32_computerSystem' c = wmi.WMI(scan_ip, user='office\admin', password='fff') for item in c.query(wql): currentUser = str(item.UserName) print(currentUser) if(currentUser == "ivanov"): print(scan_ip) break else: i += 1 # сюда зайдет, если цикл завершился полностью(то есть не было найдено) print("end") continue; except: print("-") break; # сюда попадем и прервем большой цикл, если во внутреннем был найден объект
Вот более простой пример для понимания
for x in xrange(10): for y in xrange(10): for z in xrange(10): print x,y,z if x*y*z == 30: break # прерываем внутренний цикл else: continue # продолжаем, если внутренний цикл не был прерван break # внутренний цикл был прерван, прерываем и этот цикл else: continue break
Используйте флаг (булево значение) для выхода из циклов. При входе в условие currentUser == «ivanov» меняйте его значение на положительное, делайте break, а в основном цикле установите условие while i <= 240 and not result, тогда цикл будет завершен, как только result станет истиной.
Глобального break, для выхода из всех циклов, не существует.
a:
list_ = [1, 2, 3, 4, 5] check = True while check: for v in list_: if v == 3: check = False break else: print(v)
b:
list_ = [1, 2, 3, 4] try: while True: for v in list_: if v == 3: raise UserWarning else: print(v) except UserWarning:pass
1
2
Зарегистрируйтесь или войдите
Регистрация через Google
Регистрация через Facebook
Регистрация через почту
Отправить без регистрации
Почта
Необходима, но никому не показывается
Отправить без регистрации
Почта
Необходима, но никому не показывается
Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки
Оператор While.

Редактировать
Твиттер LinkedIn Фейсбук Электронная почта
- Статья
Запускает серию инструкций, пока заданное условие равно True
.
Синтаксис
Пока условие [ заявления ] [Продолжить пока] [ заявления ] [Выйти во время] [ заявления ] Конец пока
Детали
Срок | Определение |
---|---|
состояние | Обязательно. Логическое выражение . Если условие равно Ничего , Visual Basic обрабатывает его как Ложь .![]() |
отчеты | Дополнительно. Один или несколько операторов после While , которые выполняются каждый раз, когда условие равно True . |
Продолжить пока | Дополнительно. Передает управление следующей итерации блока While . |
Выход Пока | Дополнительно. Передает управление из блока While . |
Конец пока | Обязательно. Завершает определение блока . |
Используйте структуру While...End While
, когда вы хотите повторить набор операторов неопределенное количество раз, пока сохраняется условие Правда
. Если вам нужна большая гибкость в отношении того, где вы проверяете условие или какой результат вы проверяете, вы можете предпочесть оператор Do…Loop. Если вы хотите повторить операторы заданное количество раз, оператор For. ..Next обычно является лучшим выбором.
Примечание
Ключевое слово While
также используется в операторе Do…Loop, предложениях Skip While и Take While.
Если условие
равно True
, все операторы
выполняется до тех пор, пока не встретится оператор End While
. Затем управление возвращается к оператору While
, и снова проверяется условие
. Если условие
по-прежнему True
, процесс повторяется. Если это False
, управление переходит к оператору, следующему за оператором End While
.
Оператор While
всегда проверяет условие перед запуском цикла. Цикл продолжается, пока условие остается Правда
. Если условие
равно False
при первом входе в цикл, он не запустится ни разу.
Условие
обычно является результатом сравнения двух значений, но это может быть любое выражение, результатом которого является значение логического типа данных ( True
или False
). Это выражение может включать значение другого типа данных, например числового типа, который был преобразован в
Boolean
.
Можно вкладывать Пока
петель, поместив одну петлю в другую. Вы также можете вкладывать различные типы управляющих структур друг в друга. Дополнительные сведения см. в разделе Вложенные структуры управления.
Exit While
Оператор Exit While может предоставить другой способ выхода из цикла While
. Exit While
немедленно передает управление оператору, следующему за оператором End While
.
Обычно вы используете Exit While
после оценки некоторого условия (например, в Если... Тогда... Иначе
структура). Вы можете выйти из цикла, если обнаружите условие, делающее ненужным или невозможным продолжение итерации, например ошибочное значение или запрос на завершение. Вы можете использовать Exit While
при проверке условия, которое может вызвать бесконечный цикл , который может выполняться чрезвычайно большое или даже бесконечное количество раз. Затем вы можете использовать
Exit While
, чтобы выйти из цикла.
Вы можете поставить любое количество Выйти из операторов While
в любом месте цикла While
.
При использовании во вложенных циклах While
, Exit While
передает управление из самого внутреннего цикла на следующий более высокий уровень вложенности.
Оператор Continue While
немедленно передает управление следующей итерации цикла. Дополнительные сведения см. в разделе Заявление о продолжении.
Пример 1
В следующем примере операторы в цикле продолжают выполняться до тех пор, пока индекс
переменная больше 10.
Dim индекс As Integer = 0 Пока индекс <= 10 Debug.Write(index.ToString & "") индекс += 1 Конец пока Отладка.WriteLine("") ' Вывод: 0 1 2 3 4 5 6 7 8 9 10
Пример 2
В следующем примере показано использование операторов Continue While
и Exit While
.
Размерный индекс Целое число = 0 Пока индекс < 100000 индекс += 1 ' Если индекс находится между 5 и 7, продолжить ' со следующей итерацией. Если индекс >= 5 И индекс <= 8 Тогда Продолжить пока Конец, если ' Показать индекс. Debug.Write(index.ToString & "") ' Если индекс равен 10, выйти из цикла. Если индекс = 10 Тогда Выход во время Конец, если Конец пока Отладка.WriteLine("") ' Вывод: 1 2 3 4 910
Пример 3
В следующем примере считываются все строки в текстовом файле. Метод OpenText открывает файл и возвращает StreamReader, который считывает символы. В условии While
метод Peek StreamReader
определяет, содержит ли файл дополнительные символы.
Private Sub ShowText (ByVal textFilePath As String) Если System.IO.File.Exists(textFilePath) = False Тогда Debug.WriteLine("Файл не найден: " & textFilePath) Еще Dim sr As System.IO.StreamReader = System.IO.File.OpenText(textFilePath) Пока sr.Peek() >= 0 Debug.WriteLine(sr.ReadLine()) Конец пока ср.Закрыть() Конец, если Конец сабвуфера
См. также
- Петлевые конструкции
- Оператор Do...Loop
- Для... Следующей инструкции
- Логический тип данных
- Вложенные управляющие структуры
- Заявление о выходе
- Заявление о продолжении
Обратная связь
Просмотреть все отзывы о странице
python - Как остановить цикл While?
Задавать вопрос
спросил
Изменено 3 месяца назад
Просмотрено 250 тысяч раз
Я написал цикл while
в функции, но не знаю, как его остановить. Когда он не соответствует своему конечному условию, цикл просто продолжается вечно. Как я могу это остановить?
определение_периода (вселенная_массива): период=0 tmp=universe_array пока верно: tmp=apply_rules(tmp)#aplly_rules — это другая функция период+=1 если numpy.array_equal(tmp,universe_array) имеет значение True: break #я хочу, чтобы цикл останавливался и возвращал 0, если #период больше 12 если период>12: # я написал эту строку, чтобы остановить его.. но кажется, что это #не работает....помогите.. вернуть 0 еще: период возврата
- питон
- цикл while
4
просто сделайте правильный отступ в коде:
def define_period(universe_array): период=0 tmp=universe_array пока верно: tmp=apply_rules(tmp)#aplly_rules — это другая функция период+=1 если numpy.array_equal(tmp,universe_array) имеет значение True: период возврата если период>12: # я написал эту строку, чтобы остановить его.. но, похоже, это не работает.... помогите.. вернуть 0 еще: период возврата
Вы должны понимать, что оператор break
в вашем примере выйдет из бесконечного цикла, который вы создали с помощью , в то время как True
. Поэтому, когда условие прерывания равно True, программа выйдет из бесконечного цикла и перейдет к следующему блоку с отступом. Поскольку в вашем коде нет следующего блока, функция завершается и ничего не возвращает. Итак, я исправил ваш код, заменив оператор break
оператором return
.
Следуя вашей идее использовать бесконечный цикл, это лучший способ написать его:
определение_периода (вселенная_массива): период=0 tmp=universe_array пока верно: tmp=apply_rules(tmp)#aplly_rules — это другая функция период+=1 если numpy.array_equal(tmp,universe_array) имеет значение True: перерыв если период>12: # я написал эту строку, чтобы остановить его.. но, похоже, это не работает.... помогите.. период = 0 перерыв период возврата
3
определение_периода (вселенная_массива): период=0 tmp=universe_array в то время как период <12: tmp=apply_rules(tmp)#aplly_rules — это другая функция если numpy.array_equal(tmp,universe_array) имеет значение True: перерыв период+=1 период возврата
5
Оператор is
в Python, вероятно, не делает того, что вы ожидаете. Вместо этого:
, если numpy.array_equal(tmp,universe_array) имеет значение True: перерыв
Я бы написал так:
if numpy.array_equal(tmp,universe_array): перерыв
— это оператор
, проверяющий идентичность объекта, что совсем не похоже на равенство.