5 способів перевернути рядок у Python 3

 

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

Якщо знаєте щось ще з цієї теми, хочете мене поправити або дати ідею - пишіть у коментарях, я все прочитаю і візьму до уваги. Успіхів!

Коментарі