Функція Python map(), пояснена на прикладах

У цьому навчальному матеріалі ви ознайомитеся з методами застосування функції map() у Python для обробки кожного елемента ітерованої структури даних.

Python підтримує парадигму функційного програмування, де задачі представлені як обчислення функцій. Функції в Python можна розглядати як об’єкти, що дозволяє передавати їх як аргументи іншим функціям та повертати їх як результати.

Функція map() приймає функцію як аргумент і використовує її для кожного елемента в заданій послідовності.

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

Застосування функції до елементів списку Python

Розпочнемо з простого прикладу. 👩‍🏫

Уявімо, що у нас є список чисел nums.

nums = [2,4,3,7]

Також розглянемо функцію self_pow(). Ця функція приймає число як вхідний параметр і повертає це число, піднесене до степеня самого себе (nn).

В Python оператор ** використовується для піднесення до степеня. Тобто, a**b обчислює значення ab.

def self_pow(n):
  return n**n

ЗАВДАННЯ: Створіть новий список nums_pow, застосувавши функцію self_pow() до кожного елемента списку nums.

Застосування циклу for

Для цього можна скористатися циклом for у Python:

  • Для кожного числа у списку nums викличте функцію self_pow() з аргументом num.
  • Додайте результат виклику функції до нового списку nums_pow.
nums_pow = []

for num in nums:
  nums_pow.append(self_pow(num))

print(nums_pow)

У результаті кожне число nums підноситься до степеня самого себе. Елементи в списку nums_pow такі: 22, 44, 33, 77.

Output
[4, 256, 27, 823543]

Застосування генератора списку

Цю ж операцію можна виконати більш компактно за допомогою генератора списку. З вищезазначеного циклу for ми можемо виділити вираз та послідовність ітерацій.

Загальний синтаксис генератора списку виглядає так:

new_list = [<вираз> for елемент in ітерована_послідовність]

Генератор списку для створення nums_pow виглядає наступним чином:

nums_pow = [self_pow(num) for num in nums]
print(nums_pow)

Результат ідентичний тому, що отримано при використанні циклу for.

Output
[4, 256, 27, 823543]

Замість циклів і генераторів списків можна скористатися функцією map(), яка має лаконічний синтаксис та застосовує функцію до кожного елемента ітерації. Розглянемо синтаксис цієї функції.

Синтаксис функції Python map()

Загальний синтаксис функції map() виглядає так:

map(функція, ітерована_послідовність_1,[ітерована_послідовність_2,...,ітерована_послідовність_n])

Функція map() приймає як мінімум два аргументи: функцію та ітератор.

У цьому синтаксисі:

  • функція – це будь-яка функція Python або об’єкт, що викликається. Це можуть бути вбудовані, користувацькі функції, класи, екземпляри, методи класів тощо.
  • ітерована_послідовність – це будь-який валідний ітератор Python, наприклад, список, кортеж або рядок.
  • Функція map() застосовує передану функцію до кожного елемента ітерованої_послідовності.

Що повертає функція map()?

Вона повертає об’єкт map, який можна перетворити на список, використовуючи синтаксис list(map(функція, ітерована_послідовність)).

Залежно від потреб, можна також перетворити об’єкт map на кортеж Python.

Тепер, коли ми розглянули синтаксис функції map(), перейдемо до прикладів.

Для виконання цього посібника потрібен Python 3.x. Також ви можете скористатися онлайн-редактором Python.

Використання функції map() з користувацькими функціями

#1. Раніше ми застосовували функцію self_pow() до кожного елемента списку nums. З функцією map() ми можемо передати функцію self_pow та список nums як аргументи.

Зауважте: Потрібно передавати тільки назву функції, а не її виклик (self_pow, а не self_pow()).

Функція map() повертає об’єкт map.

print(map(self_pow,nums))

<map object at 0x7f7d315c14d0>

Об’єкт map можна перетворити на список за допомогою функції list(), як показано нижче.

nums_pow = list(map(self_pow,nums))
print(nums_pow)

Результатом буде список, де кожен елемент num зі списку nums відображений в numnum у списку nums_pow.

Output
[4, 256, 27, 823543]

#2. Розглянемо функцію inch_to_cm(), що перетворює дюйми в сантиметри (1 дюйм = 2.54 см).

def inch_to_cm(inch):
  return inch*2.54

Для перетворення значень дюймів у списку inches на сантиметри можна скористатися функцією map(), як показано в коді нижче.

inches = [5.54,3.4,1,25,8.2]
cms = list(map(inch_to_cm,inches))
print(cms)

Список cms містить значення дюймів, перетворені в сантиметри.

Output
[14.0716, 8.636, 2.54, 63.5, 20.828]

Використання функції map() зі вбудованими функціями

У цьому розділі ми навчимося використовувати map() з вбудованими функціями Python.

#1. Уявімо список рядків, що містить назви мов програмування. Ми хочемо створити новий список strings_upper, де всі рядки будуть у верхньому регістрі.

strings = ['JavaScript','Rust','Python','Go']

Вбудований метод рядка .upper() перетворює всі символи рядка у верхній регістр.

strings_upper = list(map(str.upper,strings)) 
print(strings_upper)

Список strings_upper містить рядки зі списку strings, перетворені у верхній регістр.

Output
['JAVASCRIPT', 'RUST', 'PYTHON', 'GO']

#2. Вбудована функція len() приймає послідовність і повертає її довжину. Щоб визначити довжину кожного рядка у списку strings, можна скористатися map() і застосувати len() до кожного рядка.

strings_len = list(map(len,strings))
print(strings_len)
Output
[10, 4, 6, 2]

#3. Функцію map() можна використовувати з іншими колекціями, наприклад, з кортежами.

Наступний приклад містить кортеж, що зберігає дані про кількість спалень, площу та місто розташування будинку.

Функція type() повертає тип даних об’єкта Python. Щоб отримати типи даних елементів кортежу, можна застосувати map() з функцією type().

house = (2,758.5,'Bangalore')
house_elt_type = tuple(map(type,house))
print(house_elt_type)

Ми перетворили об’єкт map на кортеж. Також можна перетворити його на список або іншу колекцію.

У результаті ми бачимо, що типи даних 2, 758.5 та Bangalore визначено як int, float та str відповідно.

Output
(<class 'int'>, <class 'float'>, <class 'str'>)

#4. У Python можна імпортувати вбудовані модулі та використовувати функції з них.

Для обчислення квадратного кореня кожного числа у списку nums можна скористатися функцією sqrt з модуля math.

import math
nums = [30,90,34,45,97]
nums_sqrt = list(map(math.sqrt,nums))
print(nums_sqrt)
Output
[5.477225575051661, 9.486832980505138, 5.830951894845301, 6.708203932499369, 9.848857801796104]

Результат складно аналізувати. Можна округлити кожне значення квадратного кореня до двох знаків після коми.

Округлення чисел з плаваючою комою в Python

Визначимо функцію round_2(), що приймає число з плаваючою комою і округлює його до двох знаків після коми.

def round_2(num):
  return round(num,2)

Тепер можна скористатися функцією map() зі списками round_2 та nums_sqrt.

nums_sqrt_round = list(map(round_2,nums_sqrt))
print(nums_sqrt_round)
Output
[5.48, 9.49, 5.83, 6.71, 9.85]

Можна також використовувати вкладені функції map(), де внутрішня функція map обчислює квадратний корінь, а зовнішня – виконує округлення.

nums_sqrt_round = list(map(round_2,list(map(math.sqrt,nums))))
print(nums_sqrt_round)
Output
[5.48, 9.49, 5.83, 6.71, 9.85]

Обидва підходи дають ідентичний результат, але під час використання вкладених функцій варто переконатися, що код є читабельним та зрозумілим.

Використання функції map() з лямбда-функціями

У попередніх розділах ми вивчили, як використовувати функцію map() із вбудованими та користувацькими функціями. Тепер розглянемо використання map() з лямбда-функціями, які є анонімними функціями в Python.

Інколи потрібні функції, тіло яких складається з одного рядка коду. Такі функції можна визначити як лямбда-функції.

Загальний синтаксис лямбда-функції виглядає так: lambda аргументи: вираз.

#1. Розглянемо список рядків. Припустимо, потрібно створити список strings_rev, що містить перевернуті копії кожного рядка.

strings = ['JavaScript','Rust','Python','Go']

Рядки в Python можна перевернути за допомогою зрізів рядків.

Зріз рядка має вигляд str[початок:кінець:крок].

– Якщо значення початку та кінця не вказані, зріз починається з початку та продовжується до кінця рядка.
– Від’ємне значення кроку дозволяє зрізати рядок у зворотному порядку.
– Тому вираз вул[::-1] поверне перевернуту копію str.

Можна використати лямбда-функцію lambda x:x[::-1] усередині функції map(), як показано нижче.

strings_rev = list(map(lambda x:x[::-1],strings))
print(strings_rev)

Як і в інших прикладах, ми перетворюємо об’єкт map на список. У результаті бачимо, що кожен рядок перевернуто.

Output
['tpircSavaJ', 'tsuR', 'nohtyP', 'oG']

#2. У попередньому розділі ми обчислили квадратний корінь кожного числа в списку, а потім округлили отримані значення до двох знаків після коми.

Для цього ми використали функцію round_2(). Перепишемо цю функцію у вигляді лямбда-функції та використаємо її з map().

nums_sqrt_round_l =list(map(lambda num:round(num,2),nums_sqrt))
print(nums_sqrt_round_l)

Результат ідентичний тому, який ми отримали, використовуючи функцію round_2().

Output
[5.48, 9.49, 5.83, 6.71, 9.85]

Використання функції map() з декількома ітераціями

У наведених вище прикладах ми застосовували функцію до елементів одного ітератора.

Але існують функції, що приймають два та більше аргументів. У такому випадку кожен аргумент зберігається в списку чи іншій колекції.

Функцію map() можна використовувати з кількома списками.

#1. Розглянемо функцію area(), що приймає довжину та ширину і повертає їхній добуток.

def area(length,breadth):
  return length*breadth

Довжина та ширина різних прямокутників зберігаються у двох окремих списках: lengths та breadths.

lengths = [4,8,10,18]
breadths = [9,4,6,11]

Функцію map() можна використати для застосування функції area до цих списків.

areas = list(map(area,lengths,breadths))
print(areas)

Оскільки функція area приймає два аргументи, значення довжини та ширини беруться зі списків lengths та breadths відповідно.

Output
[36, 32, 60, 198]

#2. Математичний модуль Python містить функцію log, що допомагає обчислювати логарифм числа за заданою основою.

Зауважте: log(x, base) повертає значення логарифму x за основою base (logbase(x)). Якщо основа не вказана, за замовчуванням використовується основа e (натуральний логарифм).

У цьому прикладі:

  • Список x містить значення, для яких необхідно обчислити логарифм.
  • Список base містить значення основ.
x = [2,6,12,10]
base = [2,3,2,5]

Можна використати функцію map() з math.log та списками x і base, щоб отримати новий список log_x, як показано нижче.

log_x = list(map(math.log,x,base))
print(log_x)

Ось результат.

Output
[1.0, 1.6309297535714573, 3.5849625007211565, 1.4306765580733933]

Висновки

Підсумок основних моментів, розглянутих у цьому посібнику:

  • Функція map() приймає щонайменше два аргументи: функцію та ітеровану послідовність (ітеровані послідовності) із синтаксисом map(функція, ітерована_послідовність(і)).
  • Функція може бути будь-яким валідним об’єктом Python, що викликається.
  • Якщо функція приймає k аргументів, використовуйте map() з функцією та кожним з k аргументів у ітерованій послідовності.

Далі ми розглянемо роботу з множинами у Python.