Высший порядок функций (Карта)

1

Я немного смущен map в python. Функция для map принимает 2 параметра: 'map (function, variables).

Почему приведенный ниже код способен multiply и add качестве переменных, но второй код не может? В обычном случае multiply должно быть передано как функция, проверьте диапазон.

def multiply(x):
    return x * x

def add(x):
    return x + x

funcs = [multiply, add]

for i in range (1, 5):
    value = list(map(lambda x: x(i), funcs))
    print(value)

Это второй код:

def multiply(x):
    return x * x

def add(x):
    return x + x

funcs = (add, multiply)
multi_func = (multiply)

for i in range (1, 5):
    value = list(map(lambda x: x(i), multi_func))
    print(value)

Можно ли использовать 1 функцию и использовать ее в радиусе действия?

Использование диапазона:

map(multiply, range(1, 5))
  • 4
    Попробуйте multi_func = (multiply,)
  • 0
    Оно работает! Но почему он не находится слева от параметра карты, поскольку является функцией?
Показать ещё 2 комментария
Теги:
python-3.x
map-function
higher-order-functions

1 ответ

3

map применяет свой первый аргумент, который является функцией, каждому элементу итерабельного, который является вторым аргументом. Функция применяется лениво. Это означает, что это делается только тогда, когда вы перебираете объект карты, например, когда вы создаете его список.

Позвольте взглянуть на ваш первый код. funcs = [multiply, add] создает список, который является итерируемым, из двух элементов. Оба элемента являются функциями. Это нормально в Python, потому что функции являются просто регулярными объектами и могут передаваться, назначаться, иметь атрибуты и т.д. Цикл

for i in range (1, 5):
    value = list(map(lambda x: x(i), funcs))
    print(value)

Повторяет форму с 1 по 4. На каждой итерации она отображает lambda x: x(i) на функции в funcs. Когда i = 1, карта заканчивается multiply(1), add(1). Когда i = 2, он multiply(2), add(2) и т.д.

Второй код не работает из-за опечатки. (x) является просто x, но (x,) является одноэлементным кортежем, первым элементом которого является x. map требует, чтобы второй аргумент был итерабельным, поэтому передача функции не будет выполняться. Если вы хотите сопоставить одну функцию, вам нужно предоставить итерабельность одним элементом: multi_func = (multiply,).

После исправления вторая версия будет печатать multiply(1) когда i = 1, multiply(2) i = 2 и т.д.

Что-то вроде list(map(multiply, range(1, 5))) на самом деле будет более простым способом написать вторую версию. Вы также можете сделать что-то подобное с первым кодом, используя zip:

zip(map(func, range(1, 5)) for func in funcs)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню