Высший порядок функций (Карта) - PullRequest
0 голосов
/ 25 сентября 2018

Я немного смущен map в питоне.Функция для 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))

1 Ответ

0 голосов
/ 25 сентября 2018

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...