Pull to refresh

Comments 18

Ну, как-бы реализовать его можно, и не так чтобы некрасиво. Просто зачем?

Почему работает 3ий вариант, если область видимости j должна бы быть ограничена вложенным циклом?

область видимости 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) посчитали, что аналогичные конструкции (именованные циклы) в этих языках не нужны. Это потому, что они не востребованы? Или они как-то противоречат философии языка? Я в курсе, что "Должен быть один - и желательно только один - очевидный способ сделать это". Но обертка в функцию, а тем более вариант с флагами как-то не кажутся наиболее естественным выходом...

Я не программист... Моя версия такая Фортран - компилятор, а Питон нет и для Питона вложенные циклы может быть медленно вот их и упростили - чтоб реже использовали :).

Тут наверное можно ещё yield упомянуть.

Он тоже останавливает итерации цикла.

Не останавливает, а ставит на паузу.

def ttst():
    for i in range(5):
        for j in range(5):
            print(i, j)
            if j == 2 and i == 0:
                yield

t = ttst()
>>> next(t)
0 0
0 1
0 2
>>> next(t)
0 3
0 4
1 0
1 1
1 2
1 3
1 4
...
4 4
Traceback (most recent call last):
...
StopIteration

Не вижу смысла рассматривать подходы в отрыве от практической задачи.

Допустим у нас обход матрицы для поиска строки содержащей "о", тогда того же результата можно добиться с помощью фильтрования списков. Но этот вариант не рассматривается.

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

Элегантное прерывание цикла - это оксюморон.

Если используем флаг, то "загрязняем", но альтернативы с брошенным исключением, двойной проверкой и написанием отдельной функции, конечно же, "лучше".

Поправьте меня, если я не прав, но не лучше ли использовать лишнюю переменную и иметь легко читаемый код, чем суметь уместить 10 строчек в 3, а при разборе своего же кода через пару месяцев, тратить на подобные участки в четыре раза больше времени, пытаясь понять, что же там вообще происходит?

П. С. Я уже молчу про чтение чужого кода.

UFO just landed and posted this here
Sign up to leave a comment.

Articles