Обожаю генераторы в Питоне.

Генераторы - это ленивые списки. Их элементы можно перебирать только один за другим, нельзя сразу прыгнуть на середину или получить срез. Генератор не помнит своих предыдущих элементов, он знает только текущее состояние и алгоритм, согласно которому будет получен новый элемент.

Генератор легко получить из функции. Вместо оператора return она должна иметь оператор yield - и тогда вызов функции вернет генератор. В качестве примера возьмем числа Фибонначи. Наша функция вернет генератор, при прохождению по которому мы получим бесконечно много чисел ряда.

def fib(a, b):
    yield a
    yield b
    while True:
        a, b = b, a + b
        yield b

for x in fib(1, 2):
    print x
    if x > 100:
        break

Код выведет числа 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144. Итерацию в данном примере нужно прерывать вручную, иначе уйдем в бесконечный цикл.