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

Меня немного смущает map в python. Функция для map принимает 2 параметра: `map(функция, переменные).

Почему приведенный ниже код может принимать 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))

person Susan    schedule 25.09.2018    source источник
comment
Попробуйте multi_func = (multiply,)   -  person andrew_reece    schedule 25.09.2018
comment
Оно работает! Но почему это не слева от параметра карты, ведь это функция?   -  person Susan    schedule 25.09.2018
comment
Я думаю, потому что он принимает как кортеж? Но я все еще в шоке от того, как он может поменяться местами. (Когда я смотрю на использование метода диапазона)   -  person Susan    schedule 25.09.2018
comment
map принимает вызываемый и итерируемый аргументы. Вызываемый объект, который вы ему дали, lambda x: x(i) просто вызывает свой аргумент, а итерируемый объект, который вы пытались передать, является итерируемым из вызываемых объектов (т.е. функций)   -  person juanpa.arrivillaga    schedule 25.09.2018


Ответы (1)


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)
person Mad Physicist    schedule 25.09.2018