- How to stop one or multiple for loop(s)
- 9 Answers 9
- The simple Way: a sentinel variable
- The hacky Way: raising an exception
- The clean Way: make a function
- The pythonic way: use iteration as it should be
- The guru way: use any() :
- Операторы break, continue и pass в циклах Python 3
- Оператор break
- Конструкция с else
- Оператор continue в Python
- Оператор pass в Python
How to stop one or multiple for loop(s)
I want to determine if every element in my n x n list is the same. i.e. [[0,0],[0,0]] returns true but [[0,1],[0,0]] will return false. I was thinking of stoping immediately when I find an element that is not the same as the first element. i.e:
n=L[0][0] m=len(A) for i in range(m): for j in range(m): if L[i][j]==n: -continue the loop- else: -stop the loop-
I would like to stop this loop if L[i][j]!==n and return false, otherwise return true. How would I go about implementing this?
9 Answers 9
Use break and continue to do this. Breaking nested loops can be done in Python using the following:
for a in range(. ): for b in range(..): if some condition: # break the inner loop break else: # will be called if the previous loop did not end with a `break` continue # but here we end up right after breaking the inner loop, so we can # simply break the outer loop as well break
Another way is to wrap everything in a function and use return to escape from the loop.
I’m trying to get the function to return a value before the break but I keep getting a warning saying the break will never be reached
+1 for the creative answer, but is it really worth it ? You can simply make if found: break. Shorter, easier to read.
Best thing is, retype it and don’t try to copy&paste — Python screws up badly on indentation problems.
There are several ways to do it:
The simple Way: a sentinel variable
n = L[0][0] m = len(A) found = False for i in range(m): if found: break for j in range(m): if L[i][j] != n: found = True break
Pros: easy to understand Cons: additional conditional statement for every loop
The hacky Way: raising an exception
n = L[0][0] m = len(A) try: for x in range(3): for z in range(3): if L[i][j] != n: raise StopIteration except StopIteration: pass
Pros: very straightforward Cons: you use Exception outside of their semantic
The clean Way: make a function
def is_different_value(l, elem, size): for x in range(size): for z in range(size): if l[i][j] != elem: return True return False if is_different_value(L, L[0][0], len(A)): print "Doh"
pros: much cleaner and still efficient cons: yet feels like C
The pythonic way: use iteration as it should be
def is_different_value(iterable): first = iterable[0][0] for l in iterable: for elem in l: if elem != first: return True return False if is_different_value(L): print "Doh"
pros: still clean and efficient cons: you reinvdent the wheel
The guru way: use any() :
def is_different_value(iterable): first = iterable[0][0] return any(cell != first for col in iterable for cell in col) if is_different_value(L): print "Doh"
pros: you’ll feel empowered with dark powers cons: people that will read you code may start to dislike you
Try to simply use break statement.
Also you can use the following code as an example:
a = [[0,1,0], [1,0,0], [1,1,1]] b = [[0,0,0], [0,0,0], [0,0,0]] def check_matr(matr, expVal): for row in matr: if len(set(row)) > 1 or set(row).pop() != expVal: print 'Wrong' break# or return else: print 'ok' else: print 'empty' check_matr(a, 0) check_matr(b, 0)
Others ways to do the same is:
el = L[0][0] m=len(L) print L == [[el]*m]*m
first_el = L[0][0] print all(el == first_el for inner_list in L for el in inner_list)
To achieve this you would do something like:
n=L[0][0] m=len(A) for i in range(m): for j in range(m): if L[i][j]==n: //do some processing else: break;
In order to jump out of a loop, you need to use the break statement.
n=L[0][0] m=len(A) for i in range(m): for j in range(m): if L[i][j]!=n: break;
Here you have the official Python manual with the explanation about break and continue, and other flow control statements:
EDITED: As a commenter pointed out, this does only end the inner loop. If you need to terminate both loops, there is no «easy» way (others have given you a few solutions). One possiblity would be to raise an exception:
def f(L, A): try: n=L[0][0] m=len(A) for i in range(m): for j in range(m): if L[i][j]!=n: raise RuntimeError( "Not equal" ) return True except: return False
To stop your loop you can use break with label. It will stop your loop for sure. Code is written in Java but aproach is the same for the all languages.
public void exitFromTheLoop() < boolean value = true; loop_label:for (int i = 0; i < 10; i++) < if(!value) < System.out.println("iteration: " + i); break loop_label; >> >
Hello Falco, and welcome to SO. Please, take your time and format code properly in your answer. You can edit it.
I know this question was asked a long time ago, but if that could help anyone else, here’s my answer:
I find it easier to understand with the use of a while loop and it will stop both for loops that way. The code below also return the True/False as asked when the function check_nxn_list() is called. Some parameters may have to be added in the function call.
def check_nxn_list(): state = True n=L[0][0] m=len(A) while state == True: for i in range(m): for j in range(m): if L[i][j]!=n: state = False break return state
The break at the end of the while loop is required to end the loop even if state stays True.
Операторы break, continue и pass в циклах Python 3
При работе с циклами while и for бывает необходимо выполнить принудительный выход, пропустить часть или игнорировать заданные условия. Для первых двух случаев используются операторы break и continue Python , а для игнорирования условий — инструкция pass . Давайте посмотрим на примерах, как работают эти операторы.
Оператор break
Инструкция break в языке программирования Python прерывает выполнение блока кода. Простейший пример:
for j in 'bananafishbones':
if j == 'f':
break
print(j)
Как только программа после нескольких итераций доходит до элемента последовательности, обозначенного буквой f , цикл (loop) прерывается, поскольку действует оператор break . Теперь рассмотрим работу этой инструкции в цикле while :
x = 0
while x < 5:
print(x)
x += 0.5
print('Выход')
Вывод будет следующий (приводим с сокращениями):
Как только перестает выполняться условие и x становится равным 5, программа завершает цикл. А теперь перепишем код с использованием инструкции break :
x = 0
while True:
print(x)
if x >= 4.5:
break
x += 0.5
print('Выход')
Мы точно так же присвоили x значение 0 и задали условие: пока значение x истинно (True), продолжать выводить его. Код, правда, получился немного длиннее, но бывают ситуации, когда использование оператора прерывания оправданно: например, при сложных условиях или для того, чтобы подстраховаться от создания бесконечного цикла. Уберите из кода выше две строчки:
x = 0
while True:
print(x)
x += 0.5
print('Выход')
И перед нами бесконечный вывод:
0
0.5
…
100
100.5
…
1000000
1000000.5
…
И слово в конце (‘Выход’), таким образом, никогда не будет выведено, поскольку цикл не закончится. Поэтому при работе с последовательностями чисел использование оператора break убережет вас от сбоев в работе программ, вызываемых попаданием в бесконечный цикл.
Конструкция с else
Иногда необходимо проверить, был ли цикл исполнен до конца или выход произошел с использованием инструкции break . Для этого добавляется проверка по условию с else . Напишем программу, которая проверяет фразу на наличие запрещенных элементов:
word = input('Введите слово: ')
for i in word:
if i == 'я':
print('Цикл был прерван, обнаружена буква я')
break
else:
print('Успешное завершение, запрещенных букв не обнаружено')
print('Проверка завершена')
Теперь, если пользователь введет, например, «Привет!», программа выдаст следующее:
Успешное завершение, запрещенных букв не обнаружено
Проверка завершена
Но если во введенном слове будет буква «я», то вывод примет такой вид:
Цикл был прерван, обнаружена буква я
Проверка завершена
Небольшое пояснение: функция input принимает значение из пользовательского ввода (выражение ‘Введите слово: ‘ необходимо только для пользователя, для корректной программы хватило бы и такой строки: word = input () ) и присваивает его переменной word . Последняя при помощи for поэлементно (в данном случае — побуквенно) анализируется с учетом условия, вводимого if .
Оператор continue в Python
Если break дает команду на прерывание, то continue действует более гибко. Его функция заключается в пропуске определенных элементов последовательности, но без завершения цикла. Давайте напишем программу, которая «не любит» букву «я»:
word = input('Введите слово: ')
for i in word:
if i == 'я':
continue
print(i)
Попробуйте ввести, например, «яблоко», в этом случае вывод будет таким:
Это происходит потому, что мы задали условие, по которому элемент с определенным значением (в данном случае буква «я») не выводится на экран, но благодаря тому, что мы используем инструкцию continue , цикл доходит до последней итерации и все «разрешенные» элементы выводятся на экран. Но в коде выше есть одна проблема: если пользователь введет, например, «Яблоко», программа выведет слово полностью, поскольку не учтен регистр:
Наиболее очевидное решение в данном случае состоит в добавлении и заглавной буквы в блок if таким образом:
word = input('Введите слово: ')
for i in word:
if i == 'я' or i == 'Я':
continue
print(i)
Оператор pass в Python
Назначение pass — продолжение цикла независимо от наличия внешних условий. В готовом коде pass встречается нечасто, но полезен в процессе разработки и применяется в качестве «заглушки» там, где код еще не написан. Например, нам нужно не забыть добавить условие с буквой «я» из примера выше, но сам этот блок по какой-то причине мы пока не написали. Здесь для корректной работы программы и поможет заглушка pass :
word = input('Введите слово: ')
for i in word:
if i == 'я':
pass
else:
print('Цикл завершен, запрещенных букв не обнаружено')
print('Проверка завершена')
Теперь программа запустится, а pass будет для нас маркером и сообщит о том, что здесь нужно не забыть добавить условие.
Вот и всё, надеемся, скоро break , continue и pass станут вашими верными друзьями в разработке интересных приложений. Успехов!