Как работает map в python?

Задача: На вход программе подается строка с числами новых подписчиков канала по дням, записанных в одну строку через пробел. Необходимо прочитать эти числа и сохранить в списке, как целые числа в порядке их следования в строке. Затем, вывести через пробел на экран максимальное, минимальное и суммарное значения этого списка.

Правильное решение:

i = map(int, input().split())
I = list(i)
print(max(I), min(I), sum(I))

Мое решение:

i = str(input().split())
print(max(i), min(i), sum(i))

Объясните, пожалуйста, на указанном выше примере, как работает функция map? Моя логика такова, что нам по заданию нужно получить список, который можно получить, применив в строке метод .split. Почему это не работает? Какая логика этому противоречит? И особенно мне не понятно, каким образом мы применяем .split к int, если это метод строки, а int - число


Ответы (2 шт):

Автор решения: Medvedev

Согласно документации функция работает следующим образом:

map(function, iterable, *iterables), где аргумент function - функция которая будет применяться к каждому элементу iterable.

То есть в вашем случае, рольfunction выполняет int, роль iterable у input().split(). Значения введенные в input является строкой. split() разделяет эту строку по пробелам и возвращает список из строчных объектов. И далее к каждому элементу этого списка применяется int, который возвращает целое число.

map(int, input().split()) для понимания можно расписать как:

str_list = input().split()

int_list = []
for i in str_list:
    int_list.append(int(i))

print(f'{int_list=}')

Только map() возвращает объект класса map, поэтому необходимо применять list, что бы конвертировать в список.

Ссылка на документацию по map: https://docs.python.org/3/library/functions.html#map

→ Ссылка
Автор решения: Stanislav Volodarskiy

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

# i = map(int, input().split())
_1 = int
_2 = input()                   # '1 2 3'
_3 = _2.split                  # <built-in method split of str object at 0x7f7f0fc725b0>
_4 = _3()                      # ['1', '2', '3']
i = map(_1, _4)                # <map object at 0x7f7f0fc2a9b0>


# I = list(i)
_5 = i                         # <map object at 0x7f7f0fc2a9b0>
I = list(_5)                   # [1, 2, 3]


# print(max(I), min(I), sum(I))
_6 = I                         # [1, 2, 3]
_7 = max(_6)                   # 3
_8 = min(_6)                   # 1
_9 = sum(_6)                   # 6
print(_7, _8, _9)              # None

P.S. Для краткости не все подвыражения раскрыты полностью. Например, вызов функции тоже раскрывается компилятором:

# _9 = sum(_6)
_10 = sum                      # <built-in function sum>
_9 = _10(_6)                   # 6
→ Ссылка