Python: есть ли C-подобный цикл for? - PullRequest
13 голосов
/ 28 июля 2010

Могу ли я сделать что-то подобное в Python?

for (i = 0; i < 10; i++):
  if someCondition:
     i+=1
  print i

Мне нужно пропустить некоторые значения, основанные на условии

РЕДАКТИРОВАТЬ: Все решения до сих пор предлагают обрезать начальный диапазон так или иначе, на основе уже известного условия. Это бесполезно для меня, поэтому позвольте мне объяснить, что я хочу сделать.

Я хочу вручную (т.е. без getopt) проанализировать некоторые аргументы строки cmd, где каждое ключевое слово имеет определенное количество параметров, примерно так:

for i in range(0,len(argv)):
    arg = argv[i]
    if arg == '--flag1':
       opt1 = argv[i+1]
       i+=1
       continue
    if arg == '--anotherFlag':
       optX = argv[i+1]
       optY = argv[i+2]
       optZ = argv[i+3]
       i+=3
       continue

    ...

Ответы [ 11 ]

21 голосов
/ 28 июля 2010

Да, вот как бы я это сделал

>>> for i in xrange(0, 10):
...     if i == 4:
...         continue
...     print i,
...
0 1 2 3 5 6 7 8 9

EDIT
Основываясь на обновлении вашего исходного вопроса ... Я бы посоветовал вам взглянуть на optparse

8 голосов
/ 05 февраля 2013
for (i = 0; i < 10; i++)
   if someCondition:
      i+=1
print i

В Python будет написано как

i = 0
while i < 10
   if someCondition
      i += 1
   print i
   i += 1

Итак, вы пишете цикл c for в python.

8 голосов
/ 28 июля 2010

Есть две вещи, которые вы можете сделать, чтобы решить свою проблему:

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

    sys.argv.pop()
    cmd = {}
    while sys.argv:
        arg = sys.argv.pop(0)
        if arg == '--arg1':
            cmd[arg] = sys.argv.pop(0), sys.argv.pop(0)
        elif:
            pass
    print(cmd)
    
5 голосов
/ 28 июля 2010

Странный путь:

for x in (x for x in xrange(10) if someCondition):
    print str(x)
3 голосов
/ 28 июля 2010

Вы должны использовать continue, чтобы пропустить значение, как в C, так и в Python.

for i in range(10):
  if someCondition:
     continue
  print(i)
2 голосов
/ 28 июля 2010

Вам, вероятно, на самом деле не нужны индексы, вам, вероятно, нужны сами предметы.Лучшее решение, вероятно, будет таким:

sequence = 'whatever'
for item in sequence:
    if some_condition:
        continue
    do_stuff_with(item)
1 голос
/ 28 июля 2010

Вы можете сначала превратить список argv в генератор:

def g(my_list):
    for item in my_list:
        yield item

Затем вы можете пошагово просмотреть пункты, вызывая генератор по мере необходимости:

my_gen = g(sys.argv[1:]):
while True:
   try:
      arg = my_gen.next()
      if arg == "--flag1":
         optX = my_gen.next()
         opyY = my_gen.next()
         --do something
      elif arg == "--flag2":
         optX = my_gen.next()
         optY = my_gen.next()
         optZ = my_gen.next()
         --do something else
      ...
    except StopIteration:
       break
0 голосов
/ 16 марта 2018
increament = 4                 #say
for i in range(n):
    #write your code here
    n=n+increment

это может быть простым решением проблемы, если вы просто хотите перебрать массив, пропустив 4 члена

0 голосов
/ 28 июля 2010

Ваша проблема в том, что вы должны зацикливать не необработанные параметры, а проанализированные параметры.Я хотел бы предложить вам изменить свое решение не использовать стандартный модуль (как и другие).

0 голосов
/ 28 июля 2010

Если вам нужно что-то итерировать, и нужен индекс, используйте enumerate ()

for i, arg in enumerate(argv):
    ...

, который делает то же, что и спрашивающий

for i in range(0,len(argv)):
    arg = argv[i]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...