Цикл от 1 до бесконечности в Python - PullRequest
47 голосов
/ 27 марта 2012

В C я бы сделал это:

int i;
for (i = 0;; i++)
  if (thereIsAReasonToBreak(i))
    break;

Как мне добиться чего-то похожего в Python?

Ответы [ 8 ]

90 голосов
/ 27 марта 2012

Использование itertools.count:

import itertools
for i in itertools.count():
    if there_is_a_reason_to_break(i):
        break

В Python2 xrange() ограничено sys.maxint, которого может быть достаточно для большинства практических целей:

import sys
for i in xrange(sys.maxint):
    if there_is_a_reason_to_break(i):
        break

В Python3 range() может идти намного выше, но не до бесконечности:

import sys
for i in range(sys.maxsize**10):  # you could go even higher if you really want
    if there_is_a_reason_to_break(i):
        break

Так что, вероятно, лучше использовать count().

11 голосов
/ 27 марта 2012
def to_infinity():
    index=0
    while 1:
        yield index
        index += 1

for i in to_infinity():
    if i > 10:break
4 голосов
/ 27 марта 2012

Повторный комментарий thg435:

from itertools import takewhile, count

def thereIsAReasonToContinue(i):
    return not thereIsAReasonToBreak(i)

for i in takewhile(thereIsAReasonToContinue, count()):
    pass # or something else

Или, возможно, более кратко:

from itertools import takewhile, count

for i in takewhile(lambda x : not thereIsAReasonToBreak(x), count()):
    pass # or something else

takewhile имитирует «хорошо себя ведущий» цикл C for: у вас есть условие продолжения, но у вас есть генератор вместо произвольного выражения. Есть вещи, которые вы можете сделать в цикле C for, которые «плохо себя ведут», такие как изменение i в теле цикла. Можно также подражать тем, кто использует takewhile, если генератор является замыканием по некоторой локальной переменной i, с которой вы затем связываетесь. В некотором смысле, определение этого замыкания делает особенно очевидным, что вы делаете что-то, что потенциально может привести к путанице с вашей структурой управления.

4 голосов
/ 27 марта 2012

Самый простой и лучший:

i = 0
while not there_is_reason_to_break(i):
    # some code here
    i += 1

Может быть заманчиво выбрать наиболее близкую аналогию с кодом C, возможным в Python:

from itertools import count

for i in count():
    if thereIsAReasonToBreak(i):
        break

Но будьте осторожны, изменение i не повлияет на цикл , как это было бы в C. Следовательно, использование цикла while на самом деле является более подходящим выбором для переноса этого кода C на Python.

2 голосов
/ 27 марта 2012

Если вы делаете это в C, то ваше суждение там такое же облачное, как и в Python: -)

Лучший способ C будет:

int i = 0;
while (! thereIsAReasonToBreak (i)) {
    // do something
    i++;
}

или:

int i;  // *may* be better inside the for statement to localise scope
for (i = 0; ! thereIsAReasonToBreak (i); i++) {
    // do something
}

Это переведет на Python:

i = 0
while not thereIsAReasonToBreak (i):
    # do something
    i += 1

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

0 голосов
/ 16 октября 2017

Вы также можете сделать следующее:

list=[0] for x in list:
    list.append(x+1)
    print x

Это приведет к бесконечному for loop.

0 голосов
/ 26 июля 2017
while 1==1:  
    if want_to_break==yes:  
       break  
    else:
       # whatever you want to loop to infinity  

Этот цикл с бесконечным ходом.

0 голосов
/ 27 марта 2012
a = 1
while a:
    if a == Thereisareasontobreak(a):
        break
    a += 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...