1. Використання циклу з рядком у результаті
Створимо функцію reversed1
з аргументом variable
, де variable - змінна, що зберігає рядок, який хочемо перевернути. Так як рядок є незмінним об'єктом, то створимо окрему, поки що порожню змінну res
, яка в майбутньому зберігатиме результат.
def reversed1(variable):
res=''
У функцію помістимо цикл, який "проходжуватиметься" по кожному з елементів рядка. Почнемо ми з кінця рядка, використовуючи позитивні індекси відповідно параметр start функції range - len(variable)-1
. -1 тому, що довжина рядка завжди на 1 більша, ніж індекс останнього її елемента. Закінчити ми повинні на першому символі рядка, тому параметр stop функції range()
-1, оскільки перераховуються числа до значення цього параметра, не включно. Параметр step - -1, тому що ми рахуємо у зворотному порядку.
def reversed1(variable):
res=''
for i in range(len(variable)-1,-1,-1):
pass
Тепер заповнимо тіло циклу - проведемо конкатенацію між старим значенням res
та елементом рядка з індексом i
. Таким чином, за кожної ітерації циклу ми додаємо по одному символу до результату. Після закінчення циклу повернемо результат.
Повний код:
def reversed1(variable):
res=''
for i in range(len(variable)-1,-1,-1):
res+=variable[i]
return res
n = reversed1(input())
print(n)
2. Використання циклу зі списком у результаті
Цей спосіб аналогічний попередньому, єдина його відмінність полягає у типі даних змінної res
– тут вона є списком.
Замість конкатенації можна використовувати метод append()
, за допомогою якого ми додаємо елемент, вказаний як аргумент до методу, наприкінці списку. Отже, ми отримали:
def reversed2(variable):
res=[]
for i in range(len(variable)-1,-1,-1):
res.append(variable[i])
return res
Функція поки що повертає список, який складається з односимвольних елементів. Якщо нас це не влаштовує, то чому б не перетворити список у рядок за допомогою методу join()
? Зробимо це, додавши конструкцію res=''.join(res)
.
Повний код:
def reversed1(variable):
res=[]
for i in range(len(variable)-1,-1,-1):
res.append(variable[i])
res=''.join(res)
return res
n = reversed1(input())
print(n)
3. Рекурсія
Третій у нашому огляді спосіб – рекурсія, як завжди важка для розуміння. Як завжди створюємо функцію, але не поспішаємо поміщати туди цикл.
Почну пояснення з кінця. Якщо ми записали в результат усі символи крім першого, то довжина рядка, що залишилася, дорівнює одиниці і, отже, її потрібно повернути. Отримуємо:
def reversed3(variable):
if len(variable) == 1:
return variable
Але якщо довжина рядка більше одного, потрібно повернути останній з її елементів і викликати цю ж функцію, але вже відрізавши останній символ. Зробити це ми можемо за допомогою зрізу variable[:-1]
. Обновимо картину:
def reversed3(variable):
if len(variable) == 1:
return variable
else:
return variable[-1] + reversed3(variable[:-1])
Використання else:
тут необов'язкове, оскільки після повернення чогось цією функцією вона завершиться. Тому конструкцію return variable[-1] + reverse3(variable[:-1])
можна розмістити безпосередньо в тіло функції. Кінцевий варіант вирішення:
def reversed3(variable):
if len(variable) == 1:
return variable
return variable[-1] + reversed3(variable[:-1])
n = reversed3(input())
print(n)
4. Використання вбудованої функції
У Python 3 вбудовано спеціальну функцію reversed()
, як аргумент вона приймає список або рядок, а повертає ітератор послідовності значень, що складається з усіх елементів аргументу у зворотному порядку.
Простими словами - недостатньо написати res = reversed(variable)
, дані потрібно перетворити на потрібний тип (у разі - в рядок). Зробити ми це можемо за допомогою методу join()
, поєднавши послідовність через порожній рядок. Після виконання дій повертаємо результат. Код:
def reversed4(variable):
res=''.join(reversed(variable))
return res
n = reversed4(input())
print(n)
5. Зріз рядка
Можете уявити спосіб перевернути рядок, який був би коротшим за назву функції? А я можу !
Зріз рядка - річ прекрасна, але часом лякає новачків "ущільненим" синтаксисом. Зріз містить три параметри - [start: stop: step], аналогічно функції range()
. Докладніше про них ви можете прочитати в інших статтях на Хабрі.
Для способу з використанням зрізів не потрібно навіть створювати функцію, тільки даремно рядки та час витратите. Все елементарно - надамо параметру step значення -1 і пропустимо два інші параметри, відбувається магія - рядок перевертається:
n = input()[::-1]
print(n)
Введення:qwerty
Висновок:ytrewq
Звичайно, ніякої магії тут немає, ми просто перебираємо символи з кроком -1, тобто у зворотному порядку.
Висновок
Перший і другий способи якнайкраще підходять, якщо під час перевороту рядка потрібно її змінювати. При цьому вони значно поступаються 4 та 5 способам у швидкості. Читаються помірно добре, тому в деяких випадках їх доречно використовувати.
Щодо третього способу багато сказати не можу, оскільки не можу вигадати йому застосування. Такий спосіб погано читається та досить повільний, тому я не рекомендую його використовувати.
Четвертий спосіб досить швидкий, добре читається і підходить у багатьох випадках.
П'ятий спосіб - найшвидший, добре читається, дуже короткий (6 символів), тому його я вважаю найкращим.
Порівняльну таблицю швидкості деяких способів можна знайти за посиланням - https://python-scripts.com/reversed
Якщо знаєте щось ще з цієї теми, хочете мене поправити або дати ідею - пишіть у коментарях, я все прочитаю і візьму до уваги. Успіхів!
Коментарі
Дописати коментар