Python для вопроса о цикле

Я задавался вопросом, как достигнуть следующего в Python:

for( int i = 0; cond...; i++)
  if cond...
    i++; //to skip an run-through

Я попробовал это без удачи.

for i in range(whatever):
  if cond... :
    i += 1
26
задан Joe Dunk 12 March 2010 в 00:00
поделиться

7 ответов

Циклы for в Python отличаются. i переназначается на следующее значение каждый раз в цикле.

Следующее будет делать то, что вы хотите, потому что оно принимает буквальную версию того, что делает C ++:

i = 0
while i < some_value:
    if cond...:
        i+=1
    ...code...
    i+=1

Вот почему:

в C ++ следующие сегменты кода эквивалентны:

for(..a..; ..b..; ..c..) {
    ...code...
}

и

..a..
while(..b..) {
     ..code..
     ..c..
}

тогда как цикл for в Python выглядит примерно так:

for x in ..a..:
    ..code..

превращается в

my_iter = iter(..a..)
while (my_iter is not empty):
    x = my_iter.next()
    ..code..
40
ответ дан 28 November 2019 в 06:39
поделиться

Вы не можете банально «пропустить следующий этап» (вы, конечно, можете пропустить ] этот отрезок с 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 ДЕЙСТВИТЕЛЬНО трудно понять ;-).

1
ответ дан 28 November 2019 в 06:39
поделиться

Вы можете явно увеличить итератор.

whatever = iter(whatever)
for i in whatever:
    if cond:
        whatever.next()

Вам нужно будет поймать StopIteration, если cond может иметь значение True для последнего элемента.

4
ответ дан 28 November 2019 в 06:39
поделиться

Есть ключевое слово continue , которое пропускает текущую итерацию и переходит к следующей (и перерыв ключевое слово, которое пропускает все итерации цикла и выходит из цикла):

for i in range(10):
    if i % 2 == 0:
      # skip even numbers
      continue 
    print i
11
ответ дан 28 November 2019 в 06:39
поделиться

Есть альтернативный подход к этому, в зависимости от задачи, которую вы пытаетесь выполнить. Если cond полностью зависит от входных данных, которые вы перебираете, вы можете попробовать что-то вроде следующего:

def check_cond(item):
    if item satisfies cond:
        return True
    return False

for item in filter(check_cond, list):
    ...

Это способ функционального программирования, вроде LINQ в C # 3.0+. . Я не уверен, что это все питоническое (какое-то время Гвидо ван Россум хотел удалить фильтр, сопоставление и сокращение из Python 3), но это, безусловно, элегантно и так, как я бы это сделал.

2
ответ дан 28 November 2019 в 06:39
поделиться

Помните, что вы выполняете итерацию по элементам в списке, а не по числу.

Например, рассмотрим следующее:

for i in ["cat", "dog"]:
  print i

Что бы произошло, если бы вы сделали там i + 1? Теперь вы можете понять, почему он не пропускает следующий элемент в списке.

Вместо того, чтобы на самом деле перебирать все значения, вы можете попытаться настроить то, что содержится внутри списка, который вы перебираете.

Пример:

r = range(10)
for i in filter(lambda x: x % 2 == 0, r):
  print i

Вы также можете разделить тело for на 2. Первая часть перейдет к следующему элементу с помощью continue , а вторая часть выполнит действие, если вы это сделали. не пропускать.

4
ответ дан 28 November 2019 в 06:39
поделиться
for i in filter(lambda x:x!=2,range(5)):
0
ответ дан 28 November 2019 в 06:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: