Comments 18
А где goto?
Почему работает 3ий вариант, если область видимости j должна бы быть ограничена вложенным циклом?
Я на Питоне не пишу, но интересуюсь концепциями, и мне удивительно, что в языке нет именованных циклов. У меня в 100-летнем фортране пишется что-то типа "exit Loop_A", где Loop_A - это метка (название) цикла. А вот конструкции типа "break 2" (с номерами ) ввиду очевидной некошерности стали нерекомендованными
еще лет 20 назад
Именно такой конструкции в фортране никогда не было, но был заумный возврат из подпрограммы, после которого управление могло передаваться не только следующему оператору после call, но и в любое место программы, помеченное меткой (список меток прилагался к оператору call). И вот выбор нужной метки осуществлялся как раз по ее номеру. Получился воистину неисчерпаемый источник вдохновения ошибок...
Как не надо писать программы
CALL CHECK(A, *10, *20)
...
10
...
20
...
SUBROUTINE CHECK(X, *, *)
...
50 IF (X) 60, 70, 80
60 RETURN
70 RETURN 1
80 RETURN 2
END
Тут кроме управляемого возврата, еще и арифметический if нарисован. Хотя для совместимости с древним кодом компиляторы эти конструкции еще поддерживают, но писать такое сейчас никто в здравом уме не станет.
Я догадываюсь, что такие конструкции попали в фортран (а возможно, и в некоторые другие ЯВУ) ради эффективности, так как они транслируются буквально в пару команд машинного кода. Но современные оптимизирующие фортран-компиляторы уже давно не нуждаются в подобных подсказках, и позволяют без потери эффективности писать гораздо более человекочитаемые программы.
Если я правильно понял примеры в статье, то создатели Питона (а также PHP) посчитали, что аналогичные конструкции (именованные циклы) в этих языках не нужны. Это потому, что они не востребованы? Или они как-то противоречат философии языка? Я в курсе, что "Должен быть один - и желательно только один - очевидный способ сделать это". Но обертка в функцию, а тем более вариант с флагами как-то не кажутся наиболее естественным выходом...
Я не программист... Моя версия такая Фортран - компилятор, а Питон нет и для Питона вложенные циклы может быть медленно вот их и упростили - чтоб реже использовали :).
Официальный ответ на вопрос про метки:
https://mail.python.org/pipermail/python-3000/2007-July/008663.html
Тут наверное можно ещё yield упомянуть.
Он тоже останавливает итерации цикла.
Не вижу смысла рассматривать подходы в отрыве от практической задачи.
Допустим у нас обход матрицы для поиска строки содержащей "о", тогда того же результата можно добиться с помощью фильтрования списков. Но этот вариант не рассматривается.
board = [
["x", "x", "x", "x", "x"],
["x", "x", "x", "x", "x"],
["x", "x", "x", "x", "x"],
["x", "x", "x", "o", "x"],
["x", "x", "x", "x", "x"]]
for row in board:
for col in row:
if col == "o":
break
else:
continue
break
print(row)
print(list(filter(lambda row: "o" in row, board))[0])
В вашем примере будет очень удобно преписать вложенный цикл на функцию, а точнее использовать метод и не простой, а магический (__contains__).
for row in board:
if "o" in row:
break
else:
continue
break
А если пойти дальше, то и фильтровать можно сразу
print(next(row for row in board if "o" in row))
Можно вместо for использовать while.
i=0
j=0
found=False
while not found and i<5:
while not found and j<5:
#Do something
if something ():
found=True
j=j+1
i=i+1
Элегантное прерывание цикла - это оксюморон.
Хабы: Python, Программирование, Алгоритмы, Машинное обучение, Искусственный интеллект
Нет в статье ничего ни про Машинное обучение, ни про ИИ. Это уже вторая такая статья от вас. Не засоряйте людям ленту
Если используем флаг, то "загрязняем", но альтернативы с брошенным исключением, двойной проверкой и написанием отдельной функции, конечно же, "лучше".
Поправьте меня, если я не прав, но не лучше ли использовать лишнюю переменную и иметь легко читаемый код, чем суметь уместить 10 строчек в 3, а при разборе своего же кода через пару месяцев, тратить на подобные участки в четыре раза больше времени, пытаясь понять, что же там вообще происходит?
П. С. Я уже молчу про чтение чужого кода.
Рекурсия тоже как вариант
5 простых способов выйти из вложенных циклов в Python