Проблема с циклом "для if else" python

101
13

У меня проблема в следующем коде:

for n in range(0,i)+range(i+1,len(XY_pos)): # excludes i==n
if distance(XY_temp,i,n)<sigma:
XY_temp[i]=XY_pos[i] # back to before the move
break
else:
XY_pos[i]=XY_temp[i] # move accepted
accepted_moves+=1
NUMBER.append(number(r))
# overlap condition

Эта часть кода - это кодирование, чтобы сделать или не двигаться с моей частицей, расположенной в XY_temp [i]. Я пробовал эту структуру с чем-то более простым и, казалось, работал, но не здесь. У меня нет сообщения об ошибке, но я вижу в результатах, что часть после else никогда не выполняется даже тогда, когда она должна быть. Я мог бы подумать об объяснении, это было бы воинственно приветствовать

Я действительно новичок в Python, поэтому надеюсь, что это не глупый вопрос, но после нескольких часов, глядя в сеть, и я сам, чтобы найти решение, прошу здесь.

Я пробовал с перерывом на том же уровне идентификации, что и "if", и это ничего не меняет.

спасибо

спросил(а) 2014-10-28T02:29:00+03:00 5 лет, 7 месяцев назад
1
Решение
74

Python очень строг на отступы: отступы - это структура кода.

Как написано, else не связан с if, но для for (на том же уровне). Таким образом, вы должны передать ветку else только в том случае, если не было я для повторения цикла for.

ответил(а) 2014-11-07T15:26:00+03:00 5 лет, 6 месяцев назад
38

Для python нет цикла for-if-else, но только for-else. if внутри - это отдельный оператор.

Петля for-else в python немного сложна:

for i in something:
<inside code>
else:
<else code>

<else code> выполняется ТОЛЬКО ЕСЛИ весь цикл завершен без break или исключения. Это означает, что всякий раз, когда <inside code> выдает break или создает исключение, весь цикл заканчивается и <else code> не будет выполнен.

Важно понимать, что ветка else связана с циклом for, а не с if внутри цикла.

Для получения дополнительной информации см. Https://wiki.python.org/moin/ForLoop

ответил(а) 2014-11-07T15:33:00+03:00 5 лет, 6 месяцев назад
39

Вам нужно отложить все else положение и тело на один уровень глубже. В противном случае у вас есть конструкция " for-else " вместо "if-else" внутри цикла "for". "For-else" - это немного странность Python, но она существует, и вы не хотите ее здесь.

ответил(а) 2014-11-07T15:26:00+03:00 5 лет, 6 месяцев назад
40

Вы должны отложить часть else.currently сценарий рассматривает его как часть цикла for.

for n in range(0,i)+range(i+1,len(XY_pos)): # excludes i==n
if distance(XY_temp,i,n)<sigma:
XY_temp[i]=XY_pos[i] # back to before the move
break
else:
XY_pos[i]=XY_temp[i] # move accepted
accepted_moves+=1
NUMBER.append(number(r))
# overlap condition

ответил(а) 2014-11-07T15:26:00+03:00 5 лет, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема