class Range: def __init__(self, start, stop): self._current = start self._stop = stop def __iter__(self): return self def __next__(self): if self._current < self._stop: result = self._current self._current += 1 return result else: raise StopIteration for e in Range(0, 3): print(e) i = Range(0, 3) print(next(i)) print(next(i)) i = iter(i) print(next(i)) print(next(i)) def range(start, stop): current = start while current < stop: yield current current += 1 g = range(0, 3) for e in g: print(e) g = range(0, 3) print(next(g)) print(next(g)) print(next(g)) print(next(g)) def range(start, stop): current = start while current < stop: reset = yield current if reset is not None: current = reset - 1 current += 1 g = range(0, 3) print(next(g)) print(next(g)) print(g.send(0)) print(next(g)) def range(start, stop): current = start while current < stop: reset = yield current if reset is not None: current = reset - 1 current += 1 def two_ranges(start, stop): for x in range(start, stop): yield x for x in range(start, stop): yield x g = two_ranges(0, 3) print(next(g)) print(next(g)) print(next(g)) print(next(g)) print(next(g)) print(next(g)) g = two_ranges(0, 3) print(next(g)) print(next(g)) print(g.send(-1)) print(next(g)) print(next(g)) print(next(g)) print(next(g)) def range(start, stop): current = start while current < stop: reset = yield current if reset is not None: current = reset - 1 current += 1 def two_ranges(start, stop): yield from range(start, stop) yield from range(start, stop) g = two_ranges(0, 3) print(next(g)) print(next(g)) print(next(g)) print(next(g)) print(next(g)) print(next(g)) g = two_ranges(0, 3) print(next(g)) print(next(g)) print(g.send(-1)) print(next(g)) print(next(g)) print(next(g)) print(next(g)) g = (x for x in [1, 2, 3]) print(next(g)) print(next(g)) print(next(g)) print(next(g)) g = (x * x for x in [1, 2, 3]) for e in g: print(e) g = (x * x for x in range(10) if x % 2 == 0) list(g) g = (x * y for x in range(3) for y in range(4)) list(g) a = [x * x for x in [1, 2, 3]] a s = {x * x for x in [1, 2, 3]} s d = {x: x * x for x in [1, 2, 3]} d import itertools i = itertools.chain(range(3), range(5), range(2)) for e in i: print(e) i = itertools.combinations(range(4), 3) list(i) i = itertools.permutations(range(4), 3) list(i) i = itertools.cycle(range(4)) print(next(i)) print(next(i)) print(next(i)) print(next(i)) print(next(i)) print(next(i)) print(next(i)) print(next(i)) print(next(i)) i = itertools.product("abcdefgh", range(1, 9)) list(i)