Мне было интересно, как выполнить следующее в python:
for( int i = 0; cond...; i++)
if cond...
i++; //to skip an run-through
Я пробовал это без везения.
for i in range(whatever):
if cond... :
i += 1
Мне было интересно, как выполнить следующее в python:
for( int i = 0; cond...; i++)
if cond...
i++; //to skip an run-through
Я пробовал это без везения.
for i in range(whatever):
if cond... :
i += 1
Питоны для петель разные. i
каждый раз переписывается в следующее значение через цикл.
Следующее будет делать то, что вы хотите, потому что оно принимает буквенную версию того, что делает С++:
i = 0
while i < some_value:
if cond...:
i+=1
...code...
i+=1
Вот почему:
в С++, следующие сегменты кода эквивалентны:
for(..a..; ..b..; ..c..) {
...code...
}
и
..a..
while(..b..) {
..code..
..c..
}
тогда как цикл python для цикла выглядит примерно так:
for x in ..a..:
..code..
превращается в
my_iter = iter(..a..)
while (my_iter is not empty):
x = my_iter.next()
..code..
Существует ключевое слово continue
, которое пропускает текущую итерацию и переходит к следующей (и ключевое слово break
, которое пропускает все итерации цикла и выходит из цикла):
for i in range(10):
if i % 2 == 0:
# skip even numbers
continue
print i
Помните, что вы повторяете элементы в списке и не повторяете число.
Например, рассмотрим следующее:
for i in ["cat", "dog"]:
print i
Что произойдет, если вы там я + 1? Теперь вы можете видеть, почему он не пропускает следующий элемент в списке.
Вместо фактического повторения всех значений вы можете попытаться настроить то, что содержится внутри списка, который вы выполняете.
Пример:
r = range(10)
for i in filter(lambda x: x % 2 == 0, r):
print i
Вы также можете рассмотреть разбиение тела на 2. Первая часть перейдет к следующему элементу с помощью continue
, а вторая часть выполнит действие, если вы не пропустите.
Вы можете явно увеличить итератор.
whatever = iter(whatever)
for i in whatever:
if cond:
whatever.next()
Вам нужно будет поймать StopIteration, если cond может быть True в последнем элементе.
Существует альтернативный подход к этому, в зависимости от задачи, которую вы пытаетесь выполнить. Если cond
полностью зависит от входных данных, которые вы зацикливаете, вы можете попробовать что-то вроде следующего:
def check_cond(item):
if item satisfies cond:
return True
return False
for item in filter(check_cond, list):
...
Это способ функционального программирования для этого, вроде LINQ в С# 3.0+. Я не уверен, что все это pythonic (какое-то время Guido van Rossum хотел удалить фильтр, карту и уменьшить его с Python 3), но он, конечно, изящный и способ, которым я это сделаю.
Вы не можете тривиально "пропустить следующую ногу" (вы можете пропустить эту ногу с помощью continue
). Если вы действительно настаиваете, что можете сделать это с помощью вспомогательного bool
, например
skipping = False
for i in whatever:
if skipping:
skipping = False
continue
skipping = cond
...
или для общности с вспомогательным int
:
skipping = 0
for i in whatever:
if skipping:
skipping -= 1
continue
if badcond:
skipping = 5 # skip 5 legs
...
Однако было бы лучше инкапсулировать такую сложную логику цикла в соответствующий генератор - трудно привести примеры, если вы не можете быть более конкретным относительно того, что вы хотите (что "псевдо-C" с двумя предположительно 100% разные применения одного и того же логического cond
ДЕЙСТВИТЕЛЬНО трудно следовать; -).
for i in filter(lambda x:x!=2,range(5)):