简体   繁体   中英

how to get a cycle without using a loop in python?

im teaching my self python and i came across this interesting question which says:

Implement a generator cycle such that if we assign i = cycle() then repeated calls to next(i) return the values me myself i me myself i...

I can't use a for loop but only a generator or stream. I cant use libraries. I need to output it 20 times

what I've tried so far but i cant manage to get the cycle to work:

def cycle(i):   
    saved = []
    for el in m:
        yield el

        saved.append(el)
    while saved:
        for el in saved:
              yield element

This is probably what you want:

def cycle(n=0):
    saved=['me','myself','i']
    while True:
        yield saved[n]
        n = (n+1) % 3

i = cycle()
for _ in range(20):
   print(next(i))

Here is one example with an iterator:

def cycle(arr):
    while True:
        yield from iter(arr)

Test:

c = cycle('abc')
i = 5
while i:
    print(next(c), end=' ')
    i -= 1
# a b c a b 

If you don't want loop s at all, try this:

class cycle:
    def __init__(self,lst,maxstep = 20):
        self.lst = lst
        self.n = 0
        self.len = len(lst)
        self.maxstep = maxstep
    def __next__(self):
        if self.n>=self.maxstep:      # remove this line
            raise StopIteration       # and this line, if you want infinite stream
        ret = self.lst[self.n % self.len]
        self.n += 1
        return ret
obj = cycle(['me','myself','i'])

If you want to be able to call list on it, that is make it iterable :

class cycle():
    def __init__(self,lst,maxstep = 20):
        self.lst = lst
        self.n = 0
        self.i = 0
        self.len = len(lst)
        self.maxstep = maxstep
    def __iter__(self):
        while self.i < self.maxstep:
            yield self.lst[self.i % self.len]
            self.i += 1
    def __next__(self):
        if self.n>=self.maxstep:
            raise StopIteration
        ret = self.lst[self.n % self.len]
        self.n += 1
        return ret
obj = cycle([1, 2, 3])
print(list(obj))
# [1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2]
# or
# print(next(obj))
# 1

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM