У цьому навчальному матеріалі ви ознайомитеся з методами застосування функції 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
відображений в num
num
у списку 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.