Найти - Пользователи
Полная версия: Функции высших порядков
Начало » Python для новичков » Функции высших порядков
1 2
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 …

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

Спасибо
Ferroman
>>> 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]
>>>
appetito
наверно так
 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]
Ferroman
appetito
Этот код работать не будет.
appetito
Ferroman
appetito
Этот код работать не будет.
почему? (у меня работает)
Буду признателен, если укажете на мою ошибку
Ferroman
Да, дейсвительно, в 2.6 заработал. Просто, помнится, у меня ругался когда-то при указании * перед названиями переменной. В любом случае, код очевидно работает не правильно: 1+2+3 != 12 как и 7+8+9!=18
appetito
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
(мануал)
Ferroman
Реализация map вроде бы верная, но что-то точно работает не как ожидается, так как 1+5+8 на самом деле не равняется 15.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB