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.

x - циклы
- 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.
..End While — Visual BasicРедактировать
Твиттер 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):
перерыв
— это оператор , проверяющий идентичность объекта, что совсем не похоже на равенство.


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))
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()

IO.StreamReader = System.IO.File.OpenText(textFilePath)
Пока sr.Peek() >= 0
Debug.WriteLine(sr.ReadLine())
Конец пока
ср.Закрыть()
Конец, если
Конец сабвуфера
array_equal(tmp,universe_array) имеет значение True:
период возврата
если период>12: # я написал эту строку, чтобы остановить его.. но, похоже, это не работает.... помогите..
вернуть 0
еще:
период возврата
array_equal(tmp,universe_array) имеет значение True:
перерыв
если период>12: # я написал эту строку, чтобы остановить его.. но, похоже, это не работает.... помогите..
период = 0
перерыв
период возврата