Уже есть генераторы Python, которые делают эти основные вещи? - PullRequest
3 голосов
/ 19 августа 2011

Я обнаружил, что использую эти 2 пользовательских генератора и думаю: «Должна быть функция itertools или что-то, что уже делает это! Хотя я ничего не нашел. Я что-то упустил?* РЕДАКТИРОВАТЬ: позже я представлял, как overnover можно использовать для генерации последовательности Фибоначчи, и я понял, что ее нужно обобщить, чтобы функция могла иметь более одного аргумента

def overnover(fn,*args):
  while True:
    args = fn(*args)
    return args

Вы можете сделать:

fibInfo = overnover(lambda x,y: (x+y, x), 1, 1)

-> (2,1) ... (3, 2) ... (5, 3) ... (8, 5) ... и затем:

fib = imap(lambda x:x[0], fibInfo)

-> 2 ... 3 ... 5 ... 8 ...

спасибо, ребята!

1 Ответ

5 голосов
/ 19 августа 2011

Первый - chain.from_iterable.

Самое близкое к overnover что-то вроде tabulate:

def tabulate(function, start=0):
    "Return function(0), function(1), ..."
    return imap(function, count(start))

, который является частным случаем вашей функции, когда он выводит последовательные числа. count также принимает step, так что вы можете обобщить это до

def tabulate(function, start=0, step=1):
    "Return function(0), function(0+step), ..."
    return imap(function, count(start, step))

Вот версия overnover, которая позволит вам отправлять значения в последовательность:

def overnover(fn, val):
    while True:
        val = fn(val)
        val = (yield val) or val
...