Перейти к основному содержимому

Цепочка ленивых вычислений

Используя filter, map и другие генераторные функции, можно повысить читаемость кода и сохранить память путем создания цепочки ленивых вычислений:

numbers = range(10)
odd_numbers = filter(lambda x: x % 2, numbers)
squared_numbers = map(lambda x: x ** 2, odd_numbers)
result = sum(squared_numbers)
print(result)

В данном примере мы не храним промежуточные списки для нечетных чисел и для их квадратов. Вычисления происходят в момент вызова функции sum(), а операции происходят поэлементно. В этом можно убедиться, добавив print'ы:

def is_odd(number):
print('is_odd', number)
return number % 2


def square(number):
print('square', number)
return number ** 2
numbers = range(10)
odd_numbers = filter(is_odd, numbers)
squared_numbers = map(square, odd_numbers)
result = sum(squared_numbers)
print(result)
is_odd 0
is_odd 1
square 1
is_odd 2
is_odd 3
square 3
is_odd 4
is_odd 5
square 5
is_odd 6
is_odd 7
square 7
is_odd 8
is_odd 9
square 9
165

Таким образом, мы не храним промежуточные списки, а все операции происходят поэлементно. Это позволяет сохранить память и повысить читаемость кода.