Вітаю всіх! Сьогодні ми поговоримо про вбудовані функції reversed() та map() у Python. Розглянемо роботу кожної з функцій окремо на прикладах, які дадуть зрозуміти суть цих функій.
Функція reversed() та її особливості
Отже, спершу почнемо з reversed(). Ця функція приймає різного роду послідовності (списоки, кортежи, строки) та переставляє його елементи у протилежному порядку. Ось приклад роботи цієї функції:
numbers_list = [10, 20, 30, 40, 50]
reversed_numbers = list(reversed(numbers_list))
print(reversed_numbers)[50, 40, 30, 20, 10]Тепер поговоримо про те, на що треба звернути увагу. Насправді ми не зможемо отримати бажаний результат, якщо не перетворимо результат функції reversed() на список. Тобто ми не можемо просто вивести результат роботи функції таким чином:
print(reversed(numbers_list))Бо у такому випадку отримаємо:
<list_reverseiterator object at 0x000001F72BDEFBB0>Це означає, що результат reversed() має свій власний об’єкт класу. Це не список, а інакший об’єкт. Для того, щоб побачити результат так, як і на початку треба перетворити його у список.
Таким чином, якщо ми перетворимо цей тип даних на список, то отримаємо:
print(list(reversed(numbers_list)))[50, 40, 30, 20, 10]Тепер працює! Якщо замість списку ми захочемо змінити елементи кортежу у протилежному порядку, то робимо все так само, тільки перетворюємо кінцевий результат на кортеж.
numbers_tuple = (10, 20, 30, 40, 50)
reversed_numbers = tuple(reversed(numbers_list))
print(reversed_numbers)(50, 40, 30, 20, 10)Тепер обговоримо роботу цієї функції зі словниками. Я не дарма не вказав словник у дужках на початку статті. Справа у тому, що конкретно зі словниками ця функція працювати не буде і перетворити результат роботи reversed() на словник також не можна. Тобто така спроба завершиться помилкою як показано нажче:
profile_list = {"Name": "John",
"Age": "23",
"Hobbies": "Foreign languages & Literature",
"Job": "Engineer"}
reversed_profile = dict(reversed(profile_list))
print(reversed_profile) reversed_profile = dict(reversed(profile_list))
ValueError: dictionary update sequence element #0 has length 3; 2 is requiredПомилка якраз-таки вказала на рядок із перетворенням результату reversed() на словник. Якщо ж ми приберемо функцію dict(), то отримаємо результат, схожий на той, коли ми не перетворили результат reversed() у список:
<dict_reversekeyiterator object at 0x000002828EE03E00>Але от працювати з ключами та значеннями словника ми звісно можемо, бо вони є послідовностями. Ось приклад такого коду:
profile_dict = {"Name": "John",
"Age": "23",
"Hobbies": "Foreign languages & Literature",
"Job": "Engineer"}
reversed_keys = list(reversed(profile_dict.keys()))
reversed_values = list(reversed(profile_dict.values()))
print(f"Reversed keys: {reversed_keys}\n"
f"Reversed values: {reversed_values}")Reversed keys: ['Job', 'Hobbies', 'Age', 'Name']
Reversed values: ['Engineer', 'Foreign languages & Literature', '23', 'John']На цьому ми закінчуємо першу частину статті.
Функція map() та її особливості
Функція map() надає можливість застосовувати якусь функцію до кожного елемента. Тобто вона приймає такі параметри: функцію, яку буде застосовувати до кожного елемента та ітерований тип даних із цими елементами. Треба зауважити, що кількість ітерованих типів даних можна передати у map() будь-яку кількість.
Одразу наведемо приклад, де ми створили власну функцію, а потім застосували її до елементів:
results = [1.35466, 2.04342, 8.07661, 4.11215]
def round_numbers(number):
return round(number, 3)
round_results = list(map(round_numbers, results))
print(round_results)[1.355, 2.043, 8.077, 4.112]Тут ми спочатку створили список results, а потім створили функцію, де ми округлюємо наші значення зі списку до трьох значень після коми. Наприкінці застосовуємо функцію map() та вказуємо для неї нашу функцію round_numbers та список results у якості параметрів. І, до речі, перетворюємо результат map() у список, бо map() як і reversed() має власний об’єкт класу. Тобто якби ми не перетворили результат функції map() у список, то отримали б наступне:
<map object at 0x000001AAE6C7FC40>Функція map() має свій власний об’єкт класу, як бачимо.
Тепер розглянемо приклад, коли ми передаємо одразу два списки у map() та знаходимо середнє значення між їхніми елементами. Приклад такої реалізації наведений нижче:
x = [10, 34, 45, 61, 22, 74]
y = [23, 55, 87, 12, 76, 33]
def find_middle(x, y):
return x + y / 2
result = list(map(find_middle, x, y))
print(result)[21.5, 61.5, 88.5, 67.0, 60.0, 90.5]Тобто, як бачимо, можна дійно вказувати більше одного ітерованого типу даних.
Цікавіший приклад на застосування функції map()
Думаю буде корисно навести ще один прикладів із map(), але на цей раз вже цікавіший. У цьому прикладі ми створили власну функцію got_surnames() та імпортували модуль random для використання функцій shuffle() та choice(). Пропоную ознайомитися із тим, як саме працює наша новостворена функція.
Спершу створюємо список surnames_list:
surnames_list = ["Kirk", "Smith", "Gard", "Larry", "Trafford", "Wall", "Rogers"] Далі перемішуємо списки names_list та surnames_list:
random.shuffle(names_list)
random.shuffle(surnames_list)Обираємо випадковий елемент зі списку surnames_list:
surname = random.choice(surnames_list)Оголошуємо змінну add_surnames, де у мабутньому буде зберігатися рядок з іменем та прізвищем:
add_surnames = ""Проходимося по кожному імені у циклі for, додаємо прізвище до кожного імені та повертаємо змінну add_surnames:
for name in names_list:
add_surnames = name + " " + surname
return add_surnamesНа цьому все. Ось готовий код та результат його роботи:
import random
names_list = ["Peter", "Alan", "Kevin", "Alice", "Enny"]
def got_surnames(name):
surnames_list = ["Kirk", "Smith", "Gard", "Larry", "Trafford", "Wall", "Rogers"]
random.shuffle(names_list)
random.shuffle(surnames_list)
surname = random.choice(surnames_list)
add_surnames = ""
for name in names_list:
add_surnames = name + " " + surname
return add_surnames
result = list(map(got_surnames, names_list))
print(result)['Alan Wall', 'Kevin Trafford', 'Peter Smith', 'Kevin Smith', 'Enny Rogers']Висновок
Сьогодні ми ознайомилися із функціями reversed() та map() та їхніми особливостями. Розглянули все на прикладах і зрозуміли як їх можна використовувати у коді. Сподіваюся, вам був цікавий даний матеріал!Дякую за увагу!