Думайте о функциях в Python как о простых объектах. Объекты можно передавать в функции, а также можно возвращать из функций. На самом деле это программирование в функциональном стиле .
В вашей функции map
вы передаете функцию и список или любой другой объект / коллекцию, которые можно повторять. Вы не включаете скобки, потому что это не вызов функции . Вы всегда будете слышать, как переменные хранят данные или ссылки на данные. Но здесь переменная фактически содержит ссылку на код. Когда вы создаете функцию:
def func(arg1, arg2):
...
func
- это объект функции. Это переменная, которая содержит ссылку на код, содержащийся в функции. Если я это сделаю:
x = func
Здесь я не использовал скобки, хотя func
- это функция. Теперь я могу сделать это:
x(1, 2)
Это потому, что я назначил x
как func
. Вызов x
эквивалентен вызову func
.
Это упрощенная форма работы функции карты:
def map(function_to_call, iterable):
result = []
for element in iterable:
r = function_to_call(element)
result.append(r)
return result
Теперь я могу go вперед и вызовите карту следующим образом:
def square(x):
return x * x
map(square, [1, 2, 3, 4])
Функция карты не возвращает список, она возвращает объект карты, который может быть преобразован в список. Здесь я упростил его до не отвлекаться. Итак, map
принимает функцию и последовательность, выполняет итерацию по этой последовательности, вызывает переданную функцию для каждого элемента и создает новую последовательность, содержащую результаты. Map принимает ссылку на функцию только для того, чтобы вызвать эту функцию позже во время выполнения.
add_to_five
аналогично объекту функции. Он передается в map
, чтобы map
мог вызывать его позже несколько раз для каждого элемента.
Это расширенный вариант, поэтому путаница является обычным явлением. Надеюсь, это поможет, дайте мне знать, если что-то неясно.