Как работает 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 шт):
Согласно документации функция работает следующим образом:
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
Код разбит на элементарные подвыражения, в том порядке в каком они вычисляются. Комментарии над блоком - строки исходного кода. Комментарии справа - промежуточные результаты вычислений:
# 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