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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> О функциональном программировании на Python 
:(
    Опции темы
Cr@$h
Дата 28.8.2006, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

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



Цитата(pythonwin @  28.8.2006,  08:18 Найти цитируемый пост)
Cr@$h, спасибо! 

Развлекайтесь. Мне самому первая статья понравилась очень.
PM MAIL ICQ   Вверх
Artemios
Дата 28.8.2006, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

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



Цитата(Cr@$h @  28.8.2006,  15:25 Найти цитируемый пост)
Развлекайтесь. Мне самому первая статья понравилась очень. 


Ну тогда вот продолжения того же автора:

http://www.citforum.ru/programming/python/python8.shtml

http://www.citforum.ru/programming/python/python9.shtml

В этих двух статьях он рассматривает специфический модуль для ФП. Модуль достаточно древний, 2001 г., но интересный, наверно не потребуется и этого:
Цитата(pythonwin @  27.8.2006,  15:48 Найти цитируемый пост)
предлагаю написать функции, которые эмулировали работу со списками или написать класс потомок списка и класс потомок словаря, у которых были бы специфические методы и свойства.



http://www.citforum.ru/programming/python/python10.shtml

А здесь тот же автор рассматривает появившиеся с питона 2.2 итераторы и отложенные вычисления ФП, а также сетует на отсутствие в питоне по аналогии со списковыми включениями итераторных включений. Только, с питона 2.5, кажется эта проблема решена - т.н. генераторные включения, если не ошибаюсь, сам не пользовал - у меня 2.4.3.



--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
Cr@$h
Дата 28.8.2006, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

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



Цитата(Artemios @  28.8.2006,  21:41 Найти цитируемый пост)
В этих двух статьях он рассматривает специфический модуль для ФП. Модуль достаточно древний, 2001 г.

Возможно, с Python 2.5+ некоторые средства модуля ФП уже являются родными для языка и реализовывать их руками нет смысла. Спасибо за ссылки, почитаю. ++
PM MAIL ICQ   Вверх
Artemios
Дата 28.8.2006, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

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



Цитата(albertn @ 25.8.2006,  08:41)
А также можно сделать, чтобы условия не пересикались, тогда результат будет аналогичным
Код

print x==0 and y or x==1 and y+1 or x==2 and y+2 or (x<0 or x>2) and y+3

Но это тоже не всегда удобно.

albertn, прости, сразу невнимательно смотрел, пропустил.
Твой пример возвращает False по первому элементу последней пары, а по логике COND первые элементы вообще невозвращаются, нам был нужен 0 по второму элементу второй пары.


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
setq
Дата 28.8.2006, 23:49 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Artemios, генераторные включения есть в 2.4

Код

>>> (x for x in [1,2,3]).next()
1
>>> 


  Вверх
Artemios
Дата 29.8.2006, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

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



Цитата(setq @ 28.8.2006,  23:49)
Artemios, генераторные включения есть в 2.4

Код

>>> (x for x in [1,2,3]).next()
1
>>> 

О как! Спасибо огромнейшее, не забуду. Или кто-нибудь плз ++setq.


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
Cr@$h
Дата 29.8.2006, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

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



Цитата(Artemios @  29.8.2006,  01:51 Найти цитируемый пост)
О как! Спасибо огромнейшее, не забуду. Или кто-нибудь плз ++setq. 


M
Cr@$h
Ну, конечно ++.

PM MAIL ICQ   Вверх
Artemios
Дата 1.9.2006, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

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



из: http://forum.vingrad.ru/index.php?showtopi...st&p=838866
Цитата(albertn @ 31.8.2006, 08:57)
Но если присмотреться, то есть функции чисто императивные, я подчеркну, что это именно функции (операторы простительно), такие как sort, reverse, и другие, которые не возвращают результат, а все операции производят над исходным списком.

Так это вроде бы и не функции - методы класса list ... 


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
albertn
Дата 1.9.2006, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

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



Цитата(Artemios @ 1.9.2006,  01:04)
Так это вроде бы и не функции - методы класса list ...

Многие функции функционального программирования реализуются через методы класса list. Ведь не все же функции, имеющиеся в этом классе реализованы как отдельные функции, поэтому я говорю, что они реализованы как чисто императивные.
PM WWW ICQ   Вверх
Artemios
Дата 1.9.2006, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

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



albertn, прости пожалуста, я наверно тебя не очень понимаю, так как не очень хорошо знаком с ФП.

Как я понимаю ФП, это суперпозиция функций первого и более высших порядков от списочных аргументов, в идеале функции неимеют побочных эффектов.

А в ООП - нечто противоположное - методы объекта - для работы с данными объекта и их изменения, то есть все и завязано на побочных эффектах методов, если их рассматривать как функции от объектов.

То есть, для достижения функциональности, как мне кажется, должна быть некоторая внутренне императивная обертка вроде:
Код

def fp_sort(lst,cmp=None):
        lst1 = lst[:]
        return lst1.sort(cmp=cmp) or lst1


Это сообщение отредактировал(а) Artemios - 1.9.2006, 11:37


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
albertn
Дата 1.9.2006, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

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



Цитата(Artemios @ 1.9.2006,  11:36)
albertn, прости пожалуста, я наверно тебя не очень понимаю, так как не очень хорошо знаком с ФП.

Как я понимаю ФП, это суперпозиция функций первого и более высших порядков от списочных аргументов, в идеале функции неимеют побочных эффектов.

А в ООП - нечто противоположное - методы объекта - для работы с данными объекта и их изменения, то есть все и завязано на побочных эффектах методов, если их рассматривать как функции от объектов.

То есть, для достижения функциональности, как мне кажется, должна быть некоторая внутренне императивная обертка вроде:
Код

def fp_sort(lst,cmp=None):
        lst1 = lst[:]
        return lst1.sort(cmp=cmp) or lst1

Ты все верно понимаешь. Если бы в Python эти функции были реализованы, то тогда о нем можно было-бы говорить как о  ФП. А так в нем есть только включения, упрощающие функционального программирования.

Конечно можно дописать эти недостоющие функции, но дописать их можно и в любом другом языке без особых проблем.

А про побочные действия это ты зря. Там скорее не про побочные действия, а про то, что никакая функция не должна изменять переданные ей аргументы, а возвращать новый измененный аргумент.
PM WWW ICQ   Вверх
Void
Дата 1.9.2006, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


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

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



Цитата(albertn @  1.9.2006,  14:10 Найти цитируемый пост)
Там скорее не про побочные действия, а про то, что никакая функция не должна изменять переданные ей аргументы, а возвращать новый измененный аргумент.

Второе есть необходимое, но не достаточное условие первого.

Давайте разделять понятия: Питон позволяет писать в функциональном стиле, поскольку функции в нём являются первоклассными объектами, есть замыкания и функции высшего порядка. Питон не является чисто функциональным языком, поскольку не только позволяет побочные эффекты, но и не препятствует им. До звания функционального языка он, на мой взгляд, не дотягивает из-за отсутствия оптимизации хвостовой рекурсии (я тут приводил пример, как её реализовать с помощью декораторов, но это хак и притом медленный хак).


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

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



Цитата(Void @  1.9.2006,  17:07 Найти цитируемый пост)
До звания функционального языка он, на мой взгляд, не дотягивает из-за отсутствия оптимизации хвостовой рекурсии (я тут приводил пример, как её реализовать с помощью декораторов, но это хак и притом медленный хак). 

Нашел там же еще примерчики:
Tail Recursion Decorator
Tail Call Optimization Decorator


Это сообщение отредактировал(а) Artemios - 2.9.2006, 00:52


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
Artemios
Дата 2.9.2006, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

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





--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
Artemios
Дата 4.9.2006, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

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



Цитата(Artemios @  1.9.2006,  01:04 Найти цитируемый пост)
Но если присмотреться, то есть функции чисто императивные, я подчеркну, что это именно функции (операторы простительно), такие как sort, reverse


Цитата(Artemios @  1.9.2006,  11:36 Найти цитируемый пост)
для достижения функциональности, как мне кажется, должна быть некоторая внутренне императивная обертка вроде:


С питона 2.4, оказывается есть и функциональные аналоги: sorted, reversed:
Цитата

class reversed(object)
 |  reversed(sequence) -> reverse iterator over values of the sequence

sorted(...)
    sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list



Тихо сам с собою я веду беседу, 
не мешайте разговаривать с умным человеком smile


Это сообщение отредактировал(а) Artemios - 4.9.2006, 16:30


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




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


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

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