Что делает функция map() в Python?

Ответ

Функция map() применяет указанную функцию к каждому элементу итерируемого объекта (списка, кортежа и т.д.) и возвращает итератор с результатами.

Синтаксис: map(function, iterable, ...)

Основное использование:

# 1. Преобразование списка чисел в их квадраты
numbers = [1, 2, 3, 4]
squared = map(lambda x: x ** 2, numbers)
print(list(squared))  # [1, 4, 9, 16]

# 2. Использование именованной функции
def to_upper(s):
    return s.upper()

words = ["hello", "world"]
upper_words = map(to_upper, words)
print(list(upper_words))  # ['HELLO', 'WORLD']

# 3. Работа с несколькими итерируемыми объектами (функция должна принимать столько аргументов, сколько итерируемых объектов передано)
list1 = [1, 2, 3]
list2 = [10, 20, 30]
sums = map(lambda x, y: x + y, list1, list2)
print(list(sums))  # [11, 22, 33]

Ключевые особенности:

  • Возвращает объект map (итератор), поэтому для получения списка часто используется list(map(...)).
  • Вычисления происходят «лениво» (lazy evaluation) — элементы обрабатываются по мере необходимости.
  • Альтернатива — генераторные выражения: Во многих случаях они предпочтительнее из-за лучшей читаемости.
    # Эквивалент map с помощью генераторного выражения
    squared_gen = (x ** 2 for x in numbers)
    print(list(squared_gen))  # [1, 4, 9, 16]

    map() эффективен для простых преобразований, особенно с встроенными функциями (например, map(int, list_of_strings)).

Ответ 18+ 🔞

А, ну это же классика, ёпта! Смотри, функция map() — это как такой универсальный солдат-обработчик. Берёт какую-нибудь функцию и начинает её впендюривать каждому элементу из твоего списка, кортежа или чего ты там ей подсунешь. А на выходе — итератор с результатами, которые ты потом можешь в список загнать и посмотреть, что натворил.

Синтаксис у неё простой, до безобразия: map(функция, итерируемый_объект, ...). Точка.

Вот смотри, как это работает на практике, чтобы волнение ебать не возникало:

# 1. Допустим, у тебя список чисел, а тебе надо их все в квадрат возвести.
# Вместо того чтобы цикл писать, можно лямбду в map сунуть.
numbers = [1, 2, 3, 4]
squared = map(lambda x: x ** 2, numbers)
print(list(squared))  # [1, 4, 9, 16] — вот тебе и хиросима, всё посчитано.

# 2. Можно и свою, нормальную функцию запихнуть, не только лямбду.
def to_upper(s):
    return s.upper()

words = ["hello", "world"]
upper_words = map(to_upper, words)
print(list(upper_words))  # ['HELLO', 'WORLD'] — всё заглавными, красота.

# 3. А вот это уже поинтереснее: можно несколько списков скормить!
# Только функция должна принимать столько аргументов, сколько списков ты ей дашь.
list1 = [1, 2, 3]
list2 = [10, 20, 30]
sums = map(lambda x, y: x + y, list1, list2)
print(list(sums))  # [11, 22, 33] — сложил попарно, как швейцарские часы.

А теперь главное, что надо запомнить, а то потом будешь охуевать, почему не работает:

  • Возвращает она не список, а какой-то хуй в пальто — объект map, то есть итератор. Поэтому чтобы увидеть результаты, его обычно в список оборачивают: list(map(...)).
  • Вычисления там ленивые, по-умному. Это значит, что пока ты не попросишь следующий элемент, ничего не считается. Экономия, блядь, ресурсов.
  • Альтернатива есть, и она часто лучше! Генераторные выражения, ёпта. Читаются проще, выглядят понятнее. Смотри сам:
    # То же самое, что и map с лямбдой, но на генераторе
    squared_gen = (x ** 2 for x in numbers)
    print(list(squared_gen))  # [1, 4, 9, 16] — и никаких тебе заклинаний с map.

В общем, map() — штука мощная для простых преобразований, особенно если встроенные функции типа int или str использовать. Но если логика сложнее становится, лучше на генераторы переходить, а то подозрение ебать чувствую, что код станет нечитаемым.