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)