# generator with yielddef count_up_to(n): count = 1 while count <= n: yield count count += 1for num in count_up_to(3): print(num)#ans: 1, 2, 3
# yield pauses functiondef simple_gen(): yield 1 yield 2 yield 3gen = simple_gen()next(gen)#ans: 1next(gen)#ans: 2
# generator is an iteratordef my_gen(): yield 1 yield 2gen = my_gen()next(gen)#ans: 1#ans: can only iterate oncelist(gen)#ans: [2]list(gen)#ans: []
# infinite sequencedef infinite_counter(): count = 0 while True: yield count count += 1#ans: use with break or take first ncounter = infinite_counter()for i, num in enumerate(counter): if i >= 3: break print(num)#ans: 0, 1, 2
# filter in generatordef even_numbers(n): for i in range(n): if i % 2 == 0: yield ilist(even_numbers(10))#ans: [0, 2, 4, 6, 8]
# delegate to another generatordef generator1(): yield 1 yield 2def generator2(): yield from generator1() yield 3list(generator2())#ans: [1, 2, 3]
# what is returned?def gen(): yield 1result = gen()type(result)#ans: <class 'generator'>
# yield in loop?def gen(): for i in range(3): yield ilist(gen())#ans: [0, 1, 2]
# generator exhaustion?def gen(): yield 1 yield 2g = gen()next(g)#ans: 1next(g)#ans: 2next(g)#ans: StopIteration
# multiple yields?def gen(): yield 1 yield 2 return 3list(gen())#ans: [1, 2] (return value ignored)
# generator vs list?def gen(): yield 1list(gen())#ans: [1]gen()#ans: <generator object>
# fibonacci generator?def fib(n): a, b = 0, 1 for _ in range(n): yield a a, b = b, a + blist(fib(5))#ans: [0, 1, 1, 2, 3]
# yield from list?def gen(): yield from [1, 2, 3]list(gen())#ans: [1, 2, 3]
# generator with return?def gen(): yield 1 return 2g = gen()next(g)#ans: 1next(g)#ans: StopIteration (with value 2)
# send to generator?def gen(): value = yield print(value)g = gen()next(g) # primeg.send("Hello")#ans: prints "Hello"
# generator memory?def gen(): for i in range(1000000): yield i#ans: memory efficient (lazy)lst = [i for i in range(1000000)]#ans: all in memory at once
Google tag (gtag.js)