2016-08-24 2 views
2

Начав изучать код с помощью C, я всегда считал, что for-loops и while-loops, где необходимо всегда эквивалентно (как всегда, можно воспроизвести поведение одного из них, используя только другой). Но в python при переходе от цикла for к циклу while всегда тривиально, я не мог найти способ добиться обратного.Мимический цикл while с использованием только for-loops в python

Есть ли способ, в python, воспроизвести поведение цикла while (бесконечный цикл), используя только for-loops?

Вот решение, которое не работает (из-за предела рекурсии), используя рекурсивный генератор:

def infinite_loopy(): 
    yield "All work and no play makes Jack a dull boy" 
    for x in infinite_loopy(): 
     yield x 

#here starts the supposedly infinite-loop 
for x in infinite_loopy(): 
    print(x) 
+0

@ Aurora0001 Это не дубликат этого вопроса, поскольку я бы хотел, чтобы ** не использовалось while-loops ** – jadsq

+1

Принятый ответ на этот вопрос не использует циклы while, так что это именно то, что вы хотите, да? Если нет, почему бы и нет? – Kevin

+0

@ Kevin Мой плохой я только проверил вопрос. Но да, это будет считаться решением. – jadsq

ответ

5

Вы можете сделать это, написав non-yield iterator class:

class Infinite(object): 
    def __iter__(self): 
     return self 

    def next(self): # For Python3, replace this with __next__ 
     return 1 

# Loops forever 
for i in Infinite(): 
    pass 

(Вы можете видеть, что это тянет на ideone, если у вас есть терпение - это как смотреть как сохнет краска).

+1

это решение простое и приятное для глаз, +1 – Lost

+0

@Lost Большое спасибо! –

+0

Python 2 only ... –

4

Вы можете использовать itertools.repeat, count или cycle:

import itertools 

for _ in itertools.repeat(None): 
    # infinite loop 

for _ in itertools.count(): 
    # infinite loop 

for _ in itertools.cycle([None]): 
    # infinite loop 

Все из них может быть представленными функциями с использованием цепей while, но модуль itertools реализован в c (в cPython) и не использует while в the source code. Аналогично для jython (java) и даже PyPy (python). То же самое верно для count и cycle.

+1

Все еще возможно, что они внутренне реализованы с использованием 'while', no? Я думаю, что именно OP ответила на комментарий Авроры только под вопросом. –

+0

[doc] (https://docs.python.org/2/library/itertools.html#itertools.repeat) для itertools.repeat указывает, что он примерно эквивалентен функции, содержащей 'while' – jadsq

+0

@jadsq. [источник для 'repeat'] (https://github.com/python/cpython/blob/master/Modules/itertoolsmodule.c#L4119) не использует' while' вообще. – RoadieRich

-1

Вы можете использовать itertools.count() для цикла.

import itertools 

def infinite_loopy(): 
    x = "All work and no play makes Jack a dull boy" 
    for x in itertools.count(): 
     yield x 

for i in infinite_loopy(): 
    print("All work and no play makes Jack a dull boy") 

[Ссылка] Looping from 1 to infinity in Python

5

Вы можете использовать версию с двумя аргументами в iter следующим образом:

for _ in iter(int, 1): 
    print('All your loops are belong to us!') 

2-аргумент форма iter вызывает первый аргумент функции без аргументов. Если возвращаемое значение равно (==), то возникает второй аргумент, StopIteration, иначе возвращается возвращаемое значение. int(), вызываемый без аргументов, возвращает 0, который, конечно, не равен 1, что дает 0 навсегда, и мы имеем бесконечный цикл.

Смежные вопросы