Когда лучше всего использовать функцию карты python с функцией, определяемой пользователем, в круглых скобках или без скобок - PullRequest
0 голосов
/ 12 июля 2020

Извините, если это звучит как глупый вопрос, я действительно не понимаю, почему я получаю значения обратно и почему компилятор не кричит об ошибке, сначала приведенный ниже код, функция add_to_five получает (x) в (скобках) и вернуть значение x + 5; однако при вызове в функции карты я передаю только add_to_five без круглых скобок и предоставляю итеративную последовательность l для второго аргумента, а new_value составляет [6, 7, 8, 9, 10]

как получается x назначено, при вызове на карте add_to_five явно не получает явно назначенных круглых скобок, а значение (x) не предоставляется функции, однако некоторым образом l было заменено в круглые скобки add_to_five, поэтому результатом является [ 6, 7, 8, 9, 10].

когда я беру (x +) в return и просто возвращаю только 5, хотя все еще оставил (x) в скобках add_to_five, новое_значение становится [5 , 5,5,5,5], и я не получаю сообщение об ошибке, когда add_to_five упоминается в функции карты.

почему add_to_five работает в функции карты без скобок, а также работал, когда я возвращал только (5 ) и по-прежнему оставьте (x) в круглых скобках без привязки (x) к чему-либо или значению (5).

когда лучше использовать функцию со скобками как я знаю, при вызове (тип add_to_five (5)) он возвращает (int) как тип объекта, а при вызове (тип add_to_five) он возвращает функцию и случайный адрес памяти.

Я знаю, что лямбда - это способ работать вокруг, но не ищу быстрого решения, спасибо.

def add_to_five(x):

        return x + 5
 
    l = [1, 2, 3, 4, 5]

new_value = list(map(add_to_five, l))
print(new_value)

Ответы [ 2 ]

0 голосов
/ 12 июля 2020

Думайте о функциях в 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 мог вызывать его позже несколько раз для каждого элемента.

Это расширенный вариант, поэтому путаница является обычным явлением. Надеюсь, это поможет, дайте мне знать, если что-то неясно.

0 голосов
/ 12 июля 2020

Возможно, это помогает объяснить это:

Карта - это функция сама по себе, как и любая другая функция, вы предоставляете параметры для функции в (скобках) и разделяете их запятыми. Карта работает так же, с той лишь разницей, что вы вставляете не целое число или строку, а функцию, см. Здесь:

def add_to_five(x):

        return x + 5

l = [1, 2, 3, 4, 5]

def map_function(a_function, lst):
    for i, element in enumerate(lst):
        lst[i] = a_function(element)
    return lst

print(map_function(add_to_five, l))
#[6, 7, 8, 9, 10]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...