Как создать цикл for, где значение переменной равно стоп-значению диапазона, когда цикл работает до конца в Python?

У меня возникла концептуальная проблема, переносящая это с C на Python:

int p;
for (p = 32; p < 64; p += 2) {
    if (some condition)
        break;
    do some stuff
}
return p;

Преобразование цикла в for p in range(32,64,2) не работает. Это происходит потому, что после окончания цикла p равен 62 вместо 64.

Я могу сделать это с помощью цикла while:

p = 32
while p < 64:
    if (some condition):
        break
    do some stuff
    p += 2
return p

Но я ищу Pythonic way.

Ответ 1

вы можете использовать else для цикла for в случае, если условие не выполняется, чтобы добавить 2, как в цикле C:

for p in range(32, 64, 2):
   if some_condition:
       break
else:
    # only executed if for loop iterates to the end
    p += 2

Ответ 2

Расширьте диапазон, но включите второе условие "избыточного" прерывания.

for p in range(32, 65, 2):
    if p >= 64 or (some condition):
        break
    # do stuff

(Единственное существенное различие между этим и Ответом Jean-François Fabre - это тот фрагмент логики, который вы дублируете: тестирование, если p вне диапазона, или приращение p.)

Ответ 3

Вариант chepner answer, который позволяет избежать дублирования теста, заключается в использовании itertools.count:

import itertools

for p in itertools.count(32, 2):
    if p >= 64 or (some condition):
        break
    do some stuff
return p

хотя я думаю, что это может быть и так:

p = 32
while True:
    if p >= 64 or (some condition):
        break
    do some stuff
    p += 2
return p

и, как указал tobias_k, затем тривиально преобразуется в:

p = 32
while p < 64 and not (some condition):
    do some stuff
    p += 2
return p

который я лично считаю более понятным.