Что такое map в питоне
Перейти к содержимому

Что такое map в питоне

  • автор:

Использование функции map в Python

Использование функции map в Python

Встроенная в Python функция map() используется для применения функции к каждому элементу итерируемого объекта (например, списка или словаря) и возврата нового итератора для получения результатов. Функция map() возвращает объект map (итератор), который мы можем использовать в других частях нашей программы. Также мы можем передать объект map в функцию list() или другой тип последовательности для создания итерируемого объекта.

Функция map() имеет следующий синтаксис:

map(function, iterable, [iterable 2, iterable 3, ...]) 

Вместо использования цикла for функция map() дает возможность применить функцию к каждому элементу итерируемого объекта. Это повышает производительность, поскольку функция применяется только к одному элементу за раз без создания копий элементов в другом итерируемом объекте. Это особенно полезно при обработке больших наборов данных. Также map() может принимать несколько итерируемых объектов в качестве аргументов функции, отправляя в функцию по одному элементу каждого итерируемого объекта за раз.

В этом обучающем модуле мы рассмотрим три способа работы с map() : с функцией lambda , с определяемой пользователем функцией и со встроенной функцией, использующей несколько аргументов итерируемого объекта.

Использование функции Lambda

Первый аргумент map() — это функция, которую мы используем для применения к каждому элементу. Python вызывает функцию один раз для каждого элемента итериируемого объекта, который мы передаем в map() , и возвращает измененный элемент в объект map. В качестве первого аргумента функции мы можем передать определенную пользователем функцию или использовать функции lambda , особенно если выражение будет менее сложным.

Синтаксис map() с функцией lambda выглядит следующим образом:

map(lambda item: item[] expression, iterable) 

С таким списком мы можем реализовать функцию lambda с выражением, которое хотим применить к каждому элементу в нашем списке:

numbers = [10, 15, 21, 33, 42, 55] 

Чтобы применить выражение к каждому из наших чисел, мы можем использовать map() и lambda :

mapped_numbers = list(map(lambda x: x * 2 + 3, numbers)) 

Здесь мы декларируем элемент в нашем списке как x . Затем мы добавим наше выражение. Мы передадим список чисел как итерируемый объект для map() .

Для немедленного получения результатов мы распечатаем список объекта map :

print(mapped_numbers) 
Output
[23, 33, 45, 69, 87, 113]

Мы использовали list() , чтобы объект map был выведен как список, а не в трудной для интерпретации объектной форме, например: . Объект map является итератором наших результатов, чтобы мы могли использовать его в цикле for или использовать list() для превращения в список. Мы делаем это здесь, потому что это хороший способ просмотра результатов.

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

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

Реализация определяемой пользователем функции

Аналогично lambda мы можем использовать определенную функцию для применения к итерируемому объекту. Функции lambda более полезны при использовании выражения с одной строкой, определяемые пользователем функции лучше подходят для более сложных выражений. Если же нам нужно передать в функцию другой элемент данных, применяемый к итерируемому объекту, определяемые пользователем функции будут удобнее для чтения.

Например, в следующем итерируемом объекте каждый элемент является словарем, содержащим различные детали о каждом из существ в нашем аквариуме:

aquarium_creatures = [ "name": "sammy", "species": "shark", "tank number": 11, "type": "fish">, "name": "ashley", "species": "crab", "tank number": 25, "type": "shellfish">, "name": "jo", "species": "guppy", "tank number": 18, "type": "fish">, "name": "jackie", "species": "lobster", "tank number": 21, "type": "shellfish">, "name": "charlie", "species": "clownfish", "tank number": 12, "type": "fish">, "name": "olly", "species": "green turtle", "tank number": 34, "type": "turtle"> ] 

Мы решили, что все существа в аквариуме будут перемещены в один и тот же резервуар. Нам нужно обновить наши записи, чтобы показать, что все наши существа перемещаются в резервуар 42 . Чтобы дать map() доступ к каждому словарю и каждой паре ключ:значение в словарях, мы построим вложенную функцию:

def assign_to_tank(aquarium_creatures, new_tank_number): def apply(x): x["tank number"] = new_tank_number return x return map(apply, aquarium_creatures) 

Мы определяем функцию assign_to_tank() , которая принимает aquarium_creatures и new_tank_number в качестве параметров. В assign_to_tank() мы передаем apply() как функцию в map() в последней строке. Функция assign_to_tank возвратит iterator, полученный от map() .

apply() принимает в качестве аргумента x , что означает элемент в нашем списке — одиночный словарь.

Далее мы указываем, что x — это ключ «tank number» из aquarium_creatures , и что он должен хранить переданное значение new_tank_number . Мы возвратим каждый элемент после применения нового номера резервуара.

Мы вызовем assign_to_tank() с нашим списком словарей и новый номер резервуара, который нам нужно заменить для каждого существа:

assigned_tanks = assign_to_tank(aquarium_creatures, 42) 

После выполнения функции мы сохраним объект фильтра в переменной assigned_tanks , которую мы превратим в список и распечатаем:

print(list(assigned_tanks)) 

Вывод программы будет выглядеть следующим образом:

Output
[, , , , , ]

Мы присвоили новый номер резервуара нашему списку словарей. Используя функцию, которую мы определяем, мы включаем map() для эффективного применения функции к каждому элементу списка.

Использование встроенной функции с несколькими итерируемыми объектами

Помимо функций lambda и определяемых нами функций, мы можем использовать вместе с map() встроенные функции Python. Для применения функции с несколькими итерируемыми объектами мы передаем имя другого итерируемого объекта после первого. Рассмотрим в качестве примера функцию pow() , которая принимает два числа и возводит базовое число в указанную степень.

Здесь у нас списки целых чисел, которые мы хотим использовать с pow() :

base_numbers = [2, 4, 6, 8, 10] powers = [1, 2, 3, 4, 5] 

Затем мы передадим pow() в качестве функции в map() и укажем два списка в качестве итерируемых объектов:

numbers_powers = list(map(pow, base_numbers, powers)) print(numbers_powers) 

map() применит функцию pow() к тому же элементу в каждом списке для возведения в степень. Поэтому в результатах мы увидим 2**1 , 4**2 , 6**3 и т. д.:

Output
[2, 16, 216, 4096, 100000]

Если мы передадим map() итерируемый объект, который будет длиннее другого итерируемого объекта, map() остановит расчеты после достижения конца наиболее короткого объекта. В следующей программе мы дополним base_numbers тремя дополнительными числами:

base_numbers = [2, 4, 6, 8, 10, 12, 14, 16] powers = [1, 2, 3, 4, 5] numbers_powers = list(map(pow, base_numbers, powers)) print(numbers_powers) 

В расчетах программы ничего не изменится, и результат будет точно таким же:

Output
[2, 16, 216, 4096, 100000]

Мы использовали функцию map() со встроенной функцией Python и посмотрели на одновременную обработку нескольких итерируемых объектов. Мы увидели, что map() продолжит обрабатывать несколько итерируемых объектов, пока не достигнет конца объекта, содержащего меньше всего элементов.

Заключение

В этом обучающем модуле мы узнали о различных способах использования функции map() в Python. Теперь вы можете использовать map() с собственной функцией, с функцией lambda и с любыми другими встроенными функциями. Также вы можете реализовать map() с функциями, для которых требуется несколько итерируемых объектов.

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

Для получения дополнительной информации о Python​​ ознакомьтесь с нашей серией Программирование на Python 3 и посетите нашу тематическую страницу, посвященную Python. Чтобы узнать больше о работе с наборами данных в функциональном программировании, читайте нашу статью о функции filter() .

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Функция map#

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

Например, с помощью map можно выполнять преобразования элементов. Перевести все строки в верхний регистр:

In [1]: list_of_words = ['one', 'two', 'list', '', 'dict'] In [2]: map(str.upper, list_of_words) Out[2]: map at 0xb45eb7ec> In [3]: list(map(str.upper, list_of_words)) Out[3]: ['ONE', 'TWO', 'LIST', '', 'DICT'] 

str.upper(«aaa») делает то же самое что «aaa».upper() .

Конвертация в числа:

In [3]: list_of_str = ['1', '2', '5', '10'] In [4]: list(map(int, list_of_str)) Out[4]: [1, 2, 5, 10] 

Вместе с map удобно использовать лямбда-выражения:

In [5]: vlans = [100, 110, 150, 200, 201, 202] In [6]: list(map(lambda x: 'vlan <>'.format(x), vlans)) Out[6]: ['vlan 100', 'vlan 110', 'vlan 150', 'vlan 200', 'vlan 201', 'vlan 202'] 

Если функция, которую использует map(), ожидает два аргумента, то передаются два списка:

In [7]: nums = [1, 2, 3, 4, 5] In [8]: nums2 = [100, 200, 300, 400, 500] In [9]: list(map(lambda x, y: x*y, nums, nums2)) Out[9]: [100, 400, 900, 1600, 2500] 

List comprehension вместо map#

Как правило, вместо map можно использовать list comprehension. Чаще всего, вариант с list comprehension более понятный, а в некоторых случаях даже быстрее.

Но map может быть эффективней в том случае, когда надо сгенерировать большое количество элементов, так как map — итератор, а list comprehension генерирует список.

Примеры, аналогичные приведенным выше, в варианте с list comprehension.

Перевести все строки в верхний регистр:

In [48]: list_of_words = ['one', 'two', 'list', '', 'dict'] In [49]: [word.upper() for word in list_of_words] Out[49]: ['ONE', 'TWO', 'LIST', '', 'DICT'] 

Конвертация в числа:

In [50]: list_of_str = ['1', '2', '5', '10'] In [51]: [int(i) for i in list_of_str] Out[51]: [1, 2, 5, 10] 
In [52]: vlans = [100, 110, 150, 200, 201, 202] In [53]: [f'vlan x>' for x in vlans] Out[53]: ['vlan 100', 'vlan 110', 'vlan 150', 'vlan 200', 'vlan 201', 'vlan 202'] 

Для получения пар элементов используется zip:

In [54]: nums = [1, 2, 3, 4, 5] In [55]: nums2 = [100, 200, 300, 400, 500] In [56]: [x * y for x, y in zip(nums, nums2)] Out[56]: [100, 400, 900, 1600, 2500] 

Функция map() в Python, обработка последовательности без цикла

Применяет определенную функцию к каждому элементу в последовательности

Синтаксис:
map(function, iterable, . ) 
Параметры:
  • function — пользовательская функция, вызывается для каждого элемента,
  • iterable — последовательность или объект, поддерживающий итерирование.
Возвращаемое значение:
  • map object — объект итератора.
Описание:

Функция map() выполняет пользовательскую функцию function для каждого элемента последовательности, коллекции или итератора iterable . Каждый элемент iterable отправляется в функцию function в качестве аргумента.

Если в map() передаётся несколько iterable , то пользовательская функция function должна принимать количество аргументов, соответствующее количеству переданных последовательностей, при этом function будет применяться к элементам из всех итераций параллельно.

# функция должна принимать столько # аргументов, сколько последовательностей # передается в функцию map() def plus(a, b, c): return a + b +c # функция 'plus' применяется к элементам # из всех последовательностей параллельно >>> x = map(plus, [1, 2], [3, 4], [5, 6]) >>> list(x) # [9, 12] 

При использовании нескольких последовательностей, функция map() останавливается, когда исчерпывается самая короткая итерация.

def create_tuple(a, b): return a, b # функция `map()` останавливается, когда # заканчивается самая короткая последовательность >>> x = map(create_tuple, ['a', 'b'], [3, 4, 5]) >>> print(dict(x)) #

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

>>> x = [1, 2, 3] >>> y = [4, 5, 6, 7] # вычисление при помощи встроенной функции 'pow()' # 'x' в степени 'y' для каждого элемента 2-х списков >>> list(map(pow, x, y)) # [1, 32, 729] 

Для случаев, когда входные данные функции уже организованы в кортежи аргументов, смотрите функцию itertools.starmap() .

Преимуществ использования map() :

  • Так как функция map() написана на языке C и хорошо оптимизирована, ее внутренний цикл более эффективный, чем обычный цикл for в Python.
  • Низкое потребление памяти. С помощью цикла for .. in: программе необходимо хранить в памяти системы весь список элементов последовательности над которым производятся какие-то действия внутри цикла. При помощи функции map() элементы последовательности извлекаются по запросу, следовательно при каждом внутреннем цикле map() в памяти системы находится и обрабатывается только один элемент последовательности.

Примеры обработки последовательностей без циклов.

  • Подсчет количества символов в каждом элементе кортежа;
  • Создание словаря из двух списков;
  • Удаление пунктуации в тексте.
Подсчет количества символов в каждом элементе кортежа:
>>> x = map(len, ('apple', 'banana', 'cherry')) >>> list(x) # [5, 6, 6] 
Создание словаря из двух списков.
>>> x = map(lambda *args: args, [1, 2], [3, 4]) >>> dict(x) #
Удаление пунктуации в тексте при помощи map() .
>>> import re >>> def clean(word): . return re.sub(r"[`. ;,'\"()-]", "", word.strip()) >>> text = """С помощью цикла `for .. in:` программе необходимо хранить в памяти системы весь (список)! """ >>> word = text.split() >>> word = map(clean, word) >>> text = ' '.join(word) >>> text # 'С помощью цикла for in программе необходимо # хранить в памяти системы весь список' 
  • ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
  • Функция abs(), абсолютное значение числа
  • Функция all(), все элементы True
  • Функция any(), хотя бы один элемент True
  • Функция ascii(), преобразует строку в ASCII
  • Функция bin(), число в двоичную строку
  • Класс bool(), логическое значение объекта
  • Функция breakpoint(), отладчик кода
  • Класс bytearray(), преобразует в массив байтов
  • Класс bytes(), преобразует в строку байтов
  • Функция callable(), проверяет можно ли вызвать объект
  • Функция chr(), число в символ Юникода
  • Класс classmethod, делает функцию методом класса
  • Функция compile() компилирует блок кода Python
  • Класс complex(), преобразует в комплексное число
  • Функция delattr(), удаляет атрибут объекта
  • Класс dict() создает словарь
  • Функция dir(), все атрибуты объекта
  • Функция divmod(), делит числа с остатком
  • Функция enumerate(), счетчик элементов последовательности
  • Функция eval(), выполняет строку-выражение с кодом
  • Функция exec(), выполняет блок кода
  • Функция filter(), фильтрует список по условию
  • Класс float(), преобразует в вещественное число
  • Функция format(), форматирует значение переменной
  • Класс frozenset(), преобразует в неизменяемое множество
  • Функция getattr(), значение атрибута по имени
  • Функция globals(), переменные глобальной области
  • Функция hasattr(), наличие атрибута объекта
  • Функция hash(), хэш-значение объекта
  • Функция help(), справка по любому объекту
  • Функция hex(), число в шестнадцатеричную строку
  • Функция id(), идентификатор объекта
  • Функция input(), ввод данных с клавиатуры
  • Класс int(), преобразует в тип int
  • Функция isinstance(), принадлежность экземпляра к классу
  • Функция issubclass(), проверяет наследование класса
  • Функция iter(), создает итератор
  • Функция len(), количество элементов объекта
  • Класс list(), преобразовывает в список
  • Функция locals(), переменные локальной области
  • Функция map(), обработка последовательности без цикла
  • Функция max(), максимальное значение элемента
  • Класс memoryview(), ссылка на буфер обмена
  • Функция min(), минимальное значение элемента
  • Функция next(), следующий элемент итератора
  • Класс object(), возвращает безликий объект
  • Функция oct(), число в восьмеричную строку
  • Функция open(), открывает файл на чтение/запись
  • Функция ord(), число символа Unicode
  • Функция pow(), возводит число в степень
  • Функция print(), печатает объект
  • Класс property(), метод класса как свойство
  • Класс range(), генерирует арифметические последовательности
  • Функция repr(), описание объекта
  • Функция reversed(), разворачивает последовательность
  • Функция round(), округляет число
  • Класс set(), создает или преобразовывает в множество
  • Функция setattr(), создает атрибут объекта
  • Класс slice(), шаблон среза
  • Функция sorted(), выполняет сортировку
  • Декоратор staticmethod(), метод класса в статический метод
  • Класс str(), преобразует объект в строку
  • Функция sum(), сумма последовательности
  • Функция super(), доступ к унаследованным методам
  • Класс tuple(), создает или преобразует в кортеж
  • Класс type(), возвращает тип объекта
  • Функция vars(), словарь переменных объекта
  • Функция zip(), объединить элементы в список кортежей
  • Функция __import__(), находит и импортирует модуль
  • Функция aiter(), создает асинхронный итератор
  • Функция anext(), следующий элемент асинхронного итератора

Что такое map в питоне

Функция map является встроенной функцией языка и имеет следующий синтаксис:

map(func, *iterables) --> map object 

Функция map принимает в качестве первого аргумента объект функцию, а в качестве второго аргумента — любой итерируемый объект, к которым относятся списки, кортежи, словари и т.д. И функция map будет вычислять значение функции, которую вы ей передали, над каждым элементом последовательности и вернет в качестве результата итератор map object, который легко можно будет преобразовать к списку или любой другой последовательности.

В примере выше мы передавали в качестве функции встроенную функцию abs, которая должна принимать одно значение и возвращать модуль числа. При передачи мы не указывали ни скобок после abs, ни передаваемого значения. Функция map будет сама брать поочередно значение из списка a и передавать его нашей функции abs.

В качестве функции вы также можете передавать собственные функции, которые вы создали при помощи инструкции def.

Ниже пример использования встроенной функции len для списка из строк.

Также в качестве функции вы можете передавать встроенные методы объектов. Например, у строк есть метод .upper(), который преобразует все буквы к большому регистру. Чтобы его передать, вы должны обратиться к встроенному объекту str и через точку написать название метода.

Также можно передавать в качестве функции lambda-выражения.

И пример ниже показывает как можно ввести несколько значений через пробел в одной строке

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *