Lazy function

Функция в Python не может быть одновременно генератором и обычной функцией. Если указано слово yield, то функция становится генератором:

def foo(count=0, lazy=True):
if lazy:
for i in range(count):
yield i
else:
return list(range(count))


print(foo(10, False))
<generator object foo at 0x108d9e3c0>

Решить эту проблем можно, если вынести генератор в отдельную функцию:

def _foo_generator(count=0):
for i in range(count):
yield i


def foo(count=0, lazy=True):
if lazy:
return _foo_generator(count)
else:
return list(range(count))


print(foo(10))
<generator object _foo_generator at 0x10113f430>
print(foo(10, False))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Если генератор простой, то можно использовать генераторные выражения:

def foo(count=0, lazy=True):
if lazy:
return (i for i in range(count))
return list(range(count))


Собственно вот что сегодня я узнал…