DEV Community

Super Kai (Kazuya Ito)
Super Kai (Kazuya Ito)

Posted on • Edited on

Generator in Python (4)

Buy Me a Coffee

*Memo:

gi_yieldfrom can return an iterator if the generator is resumed at yield from otherwise it returns None as shown below:

def gen(): yield from [0, 1] yield 2 yield from [3, 4] yield 5 v = gen() while True: try: print(v.gi_yieldfrom, next(v.gi_yieldfrom)) except: print(v.gi_yieldfrom, next(v)) # None 0 # <list_iterator object at 0x000001C66EBFE410> 1 # <list_iterator object at 0x000001C66EBFE410> 2 # None 3 # <list_iterator object at 0x000001C66EBFE410> 4 # <list_iterator object at 0x000001C66EBFE410> 5 
Enter fullscreen mode Exit fullscreen mode

gi_running can check if the generator is currently running as shown below:

<yield>:

def gen(): print(v.gi_running, 'gen') # True gen  yield 0 print(v.gi_running, 'gen') # True gen  yield 1 print(v.gi_running, 'gen') # True gen  yield 2 print(v.gi_running, 'gen') # True gen  v = gen() print(v.gi_running) # False print(next(v)) # 0 print(v.gi_running) # False print(next(v)) # 1 print(v.gi_running) # False print(next(v)) # 2 print(v.gi_running) # False print(next(v)) # StopIteration: 
Enter fullscreen mode Exit fullscreen mode

<yield from>:

def gen(): print(v.gi_running, 'gen') # True gen  yield from [0, 1] print(v.gi_running, 'gen') # True gen  yield from [2, 3] print(v.gi_running, 'gen') # True gen  yield from [4, 5] print(v.gi_running, 'gen') # True gen  v = gen() print(v.gi_running) # False print(next(v)) # 0 print(v.gi_running) # False print(next(v)) # 1 print(v.gi_running) # False print(next(v)) # 2 print(v.gi_running) # False print(next(v)) # 3 print(v.gi_running) # False print(next(v)) # 4 print(v.gi_running) # False print(next(v)) # 5 print(v.gi_running) # False print(next(v)) # StopIteration: 
Enter fullscreen mode Exit fullscreen mode

gi_suspended can check if the generator is currently suspended(paused) as shown below:

<yield>:

def gen(): print(v.gi_suspended, 'gen') # False gen  yield 0 print(v.gi_suspended, 'gen') # False gen  yield 1 print(v.gi_suspended, 'gen') # False gen  yield 2 print(v.gi_suspended, 'gen') # False gen  v = gen() print(v.gi_suspended) # False print(next(v)) # 0 print(v.gi_suspended) # True print(next(v)) # 1 print(v.gi_suspended) # True print(next(v)) # 2 print(v.gi_suspended) # True print(next(v)) # StopIteration: 
Enter fullscreen mode Exit fullscreen mode

<yield from>:

def gen(): print(v.gi_suspended, 'gen') # False gen  yield from [0, 1] print(v.gi_suspended, 'gen') # False gen  yield from [2, 3] print(v.gi_suspended, 'gen') # False gen  yield from [4, 5] print(v.gi_suspended, 'gen') # False gen  v = gen() print(v.gi_suspended) # False print(next(v)) # 0 print(v.gi_suspended) # True print(next(v)) # 1 print(v.gi_suspended) # True print(next(v)) # 2 print(v.gi_suspended) # True print(next(v)) # 3 print(v.gi_suspended) # True print(next(v)) # 4 print(v.gi_suspended) # True print(next(v)) # 5 print(v.gi_suspended) # True print(next(v)) # StopIteration: 
Enter fullscreen mode Exit fullscreen mode

Top comments (0)