0

if you look at the function below, you might see something strange

def might_be_generator(is_generator: bool = False):
    if is_generator:
        for i in range(5):
            yield i
    else:
        return list(range(5))

Now we will call this function with is_generator=True parameter:

>>> might_be_generator(True)
<generator object might_be_generator at 0x7f717a2396d0>
>>> list(might_be_generator(True))
[0, 1, 2, 3, 4]
>>> type(might_be_generator(True))
<class 'generator'>

Sounds like it's true
But let's try this with is_generator=False parameter:

>>> might_be_generator()
<generator object might_be_generator at 0x7f717a2396d0> # What is going on !?
>>> list(might_be_generator())
[]
>>> type(might_be_generator())
<class 'generator'>

What happened? still a generator. shouldn't be a list?

  • 2
    Having a `yield` anywhere in the function makes it a generator. If you return without actually yielding anything at runtime, it's just an empty generator. – Samwise Aug 03 '22 at 17:20
  • 2
    See https://stackoverflow.com/questions/16780002/return-in-generator-together-with-yield-in-python-3-3 for an explanation of what `return` means in a generator function and how to get the returned value after the generator has been exhausted. – Samwise Aug 03 '22 at 17:21

0 Answers0