Как использовать цикл цикла C в Python?

Я хочу использовать традиционный цикл C в стиле python. Я хочу прокручивать символы строки, но также знать, что это такое, и иметь возможность прыгать через символы (например, i = 5 где-то в коде).

для диапазона не дает мне гибкости фактического цикла.

  • Исключение Python с помощью Tor
  • Облачные конечные точки с несколькими классами служб
  • Неожиданный аргумент ключевого слова «контекст» при использовании appcfg.py
  • Воссоздание предложения с его позиций
  • Динамическая инстанция Python из имени строки класса в динамически импортированном модуле
  • Что такое Pythonic способ найти самый длинный общий префикс списка списков?
  • IbPy: как извлечь ответ API в переменную
  • Есть ли лучший способ получить названную серию констант (перечисление) в Python?
  • 6 Solutions collect form web for “Как использовать цикл цикла C в Python?”

    Простой ответ заключается в том, что нет простого, точного эквивалента выражения C for Python. Другие ответы были рассмотрены с использованием инструкции Python for диапазона с диапазоном. Если вы хотите изменить переменную цикла в цикле (и повлиять на последующие итерации), вам нужно использовать цикл while:

     i = 0 while i < 7: if someCondition(i): i = 5 i += 1 

    Но в этом цикле оператор continue не будет иметь тот же эффект, что и оператор continue в цикле C. Если вы хотите continue работать так, как это делается на C, вам нужно сделать команду try / finally :

     i = 0 while i < 7: try: if someCondition(i): i = 5 elif otherCondition(i): continue print 'i = %d' % i finally: i += 1 

    Как вы можете видеть, это довольно уродливо. Вы должны искать более питоновский способ написать свой цикл.

    ОБНОВИТЬ

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

    Пример «C-стиль» для цикла:

     for i in forrange(10): print(i) if i == 3: i.update(7) 

    Вывод:

     0 1 2 3 8 9 

    Трюк forrange использует подкласс int который добавляет метод update . Реализация forrange :

     class forrange: def __init__(self, startOrStop, stop=None, step=1): if step == 0: raise ValueError('forrange step argument must not be zero') if not isinstance(startOrStop, int): raise TypeError('forrange startOrStop argument must be an int') if stop is not None and not isinstance(stop, int): raise TypeError('forrange stop argument must be an int') if stop is None: self.start = 0 self.stop = startOrStop self.step = step else: self.start = startOrStop self.stop = stop self.step = step def __iter__(self): return self.foriterator(self.start, self.stop, self.step) class foriterator: def __init__(self, start, stop, step): self.currentValue = None self.nextValue = start self.stop = stop self.step = step def __iter__(self): return self def next(self): if self.step > 0 and self.nextValue >= self.stop: raise StopIteration if self.step < 0 and self.nextValue <= self.stop: raise StopIteration self.currentValue = forrange.forvalue(self.nextValue, self) self.nextValue += self.step return self.currentValue class forvalue(int): def __new__(cls, value, iterator): value = super(forrange.forvalue, cls).__new__(cls, value) value.iterator = iterator return value def update(self, value): if not isinstance(self, int): raise TypeError('forvalue.update value must be an int') if self == self.iterator.currentValue: self.iterator.nextValue = value + self.iterator.step 

    В C :

     for(int i=0; i<9; i+=2) { dosomething(i); } 

    В python3 :

     for i in range(0, 9, 2): dosomething(i) 

    Вы просто выражаете ту же идею на разных языках.

     for i in range(n): 

    … является эквивалентом Python C …

     for (i = 0; i < n; i++){ 

    Или хорошо, вы можете использовать:

     for i in range(a, n, s): 

    … что эквивалентно …

     for (i = a; i < n; i+=s){ 

    В качестве протеста я предлагаю следующее совершенно уместное решение. Обратите внимание, что «break» и «continue» не будут работать. Также обратите внимание, что тело цикла не должно быть отступом.

     class For: def __init__(self, **loop_vars): self.loop_vars = loop_vars def __call__(self, arg): if not hasattr(self, 'condition'): self.condition = arg return self if not hasattr(self, 'update'): self.update = arg return self while eval(self.condition, self.loop_vars, self.loop_vars): exec arg in self.loop_vars exec self.update in self.loop_vars For(i = 1, j = 1)('i * j < 50')('i += 1; j += 1')(''' print i, j ''') 

    Вы можете сделать следующее, учитывая массив a:

     for i in range(len(a)): a[i] = i 

    Это ближайший Python может попасть в циклы C-стиля.

    Вы также можете дать команде range больше аргументов; например,

    for i in range(2, len(a), 3)

    начнется с i = 2 и увеличит его на 3 до тех пор, пока результат будет меньше len (a).

    Цикл Python for всегда имеет семантику foreach. Вы можете, однако, сделать следующее:

     for i in xrange(10): print i 

    Это очень похоже на цикл C. xrange (или range , так как он был переименован в Python 3), является конструктором для объекта Python, который выполняет итерацию через ряд чисел. Дополнительную информацию см. В документах.

    Python - лучший язык программирования в мире.