Я немного смущен 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))
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)
multi_func = (multiply,)