Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 20, 2010 15:23:42

AmF
От:
Зарегистрирован: 2010-09-16
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

Функции высших порядков

Всем привет! Вот бьюсь над такой задачей: надо определить некоторые ф-ции высших порядков: filter(func, ls), sum(ls), max(ls), map(func, ls1, ls2, …), reduce(func, ls, val).
Т.к. лучше всего я разобрался со сверткой, то попытался сделать это для редьюс:

def reduce(func, ls, val):
if ls:
return reduce(func, ls[1:], func(val, ls[0]))
else:
return val
Может, кто-то может проверить этот код на правильность(типа, есть ли ошибки) и подсказать, как определить, например, map …

Спасибо



Отредактировано (Окт. 20, 2010 15:28:08)

Офлайн

#2 Окт. 20, 2010 15:56:19

appetito
От:
Зарегистрирован: 2010-09-28
Сообщения: 147
Репутация: +  2  -
Профиль   Отправить e-mail  

Функции высших порядков

AmF
Всем привет! Вот бьюсь над такой задачей: надо определить некоторые ф-ции высших порядков: filter(func, ls), sum(ls), max(ls), map(func, ls1, ls2, …), reduce(func, ls, val).
Т.к. лучше всего я разобрался со сверткой, то попытался сделать это для редьюс:
def reduce(func, ls, val):
if ls:
return reduce(func, ls[1:], func(val, ls[0]))
else:
return val
Может, кто-то может проверить этот код на правильность(типа, есть ли ошибки) и подсказать, как определить, например, map …

Спасибо
на больших последовательностях ваша reduce не будет работать из-за ограничения на глубину рекурсии, надо делать итеративную функцию.
a map:
def mmap(f, ls):
return [f(i) for i in ls]



Офлайн

#3 Окт. 20, 2010 16:21:27

AmF
От:
Зарегистрирован: 2010-09-16
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

Функции высших порядков

appetito
на больших последовательностях ваша reduce не будет работать из-за ограничения на глубину рекурсии, надо делать итеративную функцию
Мне не нужны большие последовательности - мы недавно начал Питон - надо просто описать принцип работы.
appetito
a map:
def mmap(f, ls):
return [f(i) for i in ls]
Спасибо! А если в map передается неизвестное кол-во переменных? (для 2 переменных я сообразил):
map(func, ls1, ls2, …)

Спасибо



Офлайн

#4 Окт. 21, 2010 00:37:50

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Функции высших порядков

>>> def mmap(f, *args):
... return [ f(i) for i in [k for k in args] ]
...
>>> mmap(sum, [1, 2, 3])
[6]
>>> mmap(sum, [1, 2, 3], [1, 2, 3])
[6, 6]
>>>

Офлайн

#5 Окт. 21, 2010 08:58:45

appetito
От:
Зарегистрирован: 2010-09-28
Сообщения: 147
Репутация: +  2  -
Профиль   Отправить e-mail  

Функции высших порядков

наверно так

 def mmap(f, *args):
return [f(*t) for t in zip(*args)]

mmap(lambda x,y,z:x+y+z,[1,2,3],[4,5,6],[7,8,9])
[12, 15, 18]



Офлайн

#6 Окт. 21, 2010 10:22:17

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Функции высших порядков

appetito
Этот код работать не будет.

Офлайн

#7 Окт. 21, 2010 12:48:49

appetito
От:
Зарегистрирован: 2010-09-28
Сообщения: 147
Репутация: +  2  -
Профиль   Отправить e-mail  

Функции высших порядков

Ferroman
appetito
Этот код работать не будет.
почему? (у меня работает)
Буду признателен, если укажете на мою ошибку



Офлайн

#8 Окт. 21, 2010 14:21:31

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Функции высших порядков

Да, дейсвительно, в 2.6 заработал. Просто, помнится, у меня ругался когда-то при указании * перед названиями переменной. В любом случае, код очевидно работает не правильно: 1+2+3 != 12 как и 7+8+9!=18

Офлайн

#9 Окт. 21, 2010 14:53:14

appetito
От:
Зарегистрирован: 2010-09-28
Сообщения: 147
Репутация: +  2  -
Профиль   Отправить e-mail  

Функции высших порядков

Ferroman
Да, дейсвительно, в 2.6 заработал. Просто, помнится, у меня ругался когда-то при указании * перед названиями переменной. В любом случае, код очевидно работает не правильно: 1+2+3 != 12 как и 7+8+9!=18
код работает в Python 2.5.4, причем аналогично встроенной функции map, т.е. 1+4+7=12 ,2+5+8=15, 3+5+9=18

Apply function to every item of iterable and return a list of the results. If additional iterable arguments are passed, function must take that many arguments and is applied to the items from all iterables in parallel
(мануал)



Отредактировано (Окт. 21, 2010 16:01:28)

Офлайн

#10 Окт. 21, 2010 15:48:01

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Функции высших порядков

Реализация map вроде бы верная, но что-то точно работает не как ожидается, так как 1+5+8 на самом деле не равняется 15.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version