Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> compose(), может есть реализация? 
:(
    Опции темы
setq
Дата 21.2.2006, 22:29 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Мне по ходу дела понадобилась композиция функций. Вопрос: есть ли такое в стандартных библиотеках или может в виде какого-нибудь хитрого коротенького "питонизма"?

То есть
Код

compose(f, g, h) (x) == h(g(f(x)))

  Вверх
nikzz
Дата 26.2.2006, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 25.2.2006

Репутация: нет
Всего: нет



Имхо, нужно либо писать собственный класс с методом __call__ и там это все реализовывать. Либо, если проще - передавать x в качестве последнего аргумента функции - а в ней рекурсивно вызывать переданные.
PM MAIL   Вверх
Void
Дата 26.2.2006, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 10
Всего: 173



Под рукой Питона нет, проверить не могу, но, по-моему, должен сработать банальный foldr:
Код

def compose(*args):
    return reduce(lambda arg, fun: fun(arg), reversed(args))

>>> compose(cos, sin, 0)
1


P.S. Достал Питон, проверил — работает.
Поначалу написал функцию так:
Код

def compose(*args):
    reduce(lambda arg fun: fun(arg), reversed(args))

Блин, это, наверное, уже не лечится smile

Это сообщение отредактировал(а) Void - 26.2.2006, 23:20


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Void
Дата 26.2.2006, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 10
Всего: 173



Через два часа дошло, что это не совсем то, что хотел автор smile
Ну тогда еще пара символов:
Код

def compose(*funcs):
    return lambda x: reduce(lambda arg, fun: fun(arg), reversed(funcs), x)



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
setq
Дата 27.2.2006, 13:39 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











nikzz, Void, спасибо, комрады. Буду писать собственную реализацию.

Пока получилось вот такое:
Код
def compose(*fs):
    if fs:
        return lambda x: compose(*fs[1:]) (fs[0] (x))
    else:
        return lambda x: x


А про fold я как-то и не сообразил даже сперва. smile
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0682 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.