5 способов перевернуть строку в Python 3
Создадим функцию reversed1 с аргументом variable , где variable — переменная, хранящая строку, которую мы хотим перевернуть. Так как строка являются неизменяемым объектом, то создадим отдельную, пока что пустую переменную res , которая в будущем будет хранить результат.
В функцию поместим цикл, который будет «прохаживаться» по каждому из элементов строки. Начнем мы с конца строки, используя положительные индексы, соответственно параметр start функции range — len(variable)-1 . -1 потому, что длина строки всегда на 1 больше, чем индекс последнего ее элемента. Закончить мы должны на первом символе строки, поэтому параметр stop функции range() — -1, поскольку перечисляются числа до значения этого параметра, не включительно. Параметр step — -1, потому что мы считаем в обратном порядке.
Теперь заполним тело цикла — проведем конкатенацию между старым значением res и элементом строки с индексом i . Таким образом, при каждой итерации цикла мы добавляем по одному символу к результату. После окончания цикла вернем результат.
2. Использование цикла со списком в результате
Этот способ аналогичен предыдущему, единственное его отличие заключается в типе данных переменной res — здесь она является списком.
Вместо конкатенации можно использовать метод append() , с помощью которого мы добавляем элемент, указанный в качестве аргумента к методу, в конец списка. Итак, мы получили:
Функция пока что возвращает список, состоящий из односимвольных элементов. Если нас это не устраивает, то почему бы не преобразовать список в строку при помощи метода join() ? Сделаем это, добавив конструкцию res=».join(res) .
3. Рекурсия
Третий в нашем обзоре способ — рекурсия, как всегда трудная для понимания. Как всегда создаем функцию, но не спешим помещать туда цикл.
Начну объяснение с конца. Если мы записали в результат все символы кроме первого, то длина оставшейся строки равна единице и, следовательно, ее нужно вернуть. Получаем:
Но если длина строки больше одного, то нужно вернуть последний из ее элементов и вызвать эту же функцию, но уже отрезав последний символ. Сделать это мы можем с помощью среза variable[:-1] . Обновим картину:
Использование else: здесь необязательно, так как после возвращения чего-либо этой функцией она завершится. Поэтому конструкцию return variable[-1] + reverse3(variable[:-1]) можно поместить напрямую в тело функции. Конечный вариант решения:
4. Использование встроенной функции
В Python 3 встроена специальная функция reversed() , в качестве аргумента она принимает список или строку, а возвращает итератор последовательности значений, состоящей из всех элементов аргумента в обратном порядке.
Простыми словами — недостаточно написать res = reversed(variable) , данные нужно преобразовать в нужный тип (в нашем случае — в строку). Сделать мы это можем при помощи метода join() , соединив последовательность через пустую строку. После выполненных действий возвращаем результат. Код:
5. Срез строки
Можете представить способ перевернуть строку, который был бы короче названия функции? А я могу!
Срез строки — вещь прекрасная, но порой пугающая новичков «уплотненным» синтаксисом. Срез содержит три параметра — [start:stop:step], аналогично функции range() . Подробнее о них вы можете прочитать в других статьях на Хабре.
Для способа с использованием срезов не нужно даже создавать функцию, только зря строки и время потратите. Все элементарно — присвоим параметру step значение -1 и пропустим два других параметра, происходит магия — строка переворачивается:
Конечно, никакой магии здесь нет, мы просто перебираем символы с шагом -1, то есть в обратном порядке.
Заключение
Первый и второй способы как нельзя лучше подходят, если во время переворота строки нужно ее изменять. При этом они значительно уступают 4 и 5 способам в скорости. Читаются умеренно хорошо, поэтому в некоторых случаях их уместно использовать.
Насчет третьего способа много сказать не могу, поскольку не могу придумать ему применение. Такой способ плохо читается и довольно медленный, поэтому я не рекомендую его использовать.
Четвертый способ довольно быстрый, отлично читается и подходит во многих случаях.
Пятый способ — самый быстрый, хорошо читается, очень краткий (6 символов), поэтому его я считаю наиболее предпочтительным.
Сравнительную таблицу скорости некоторых способов вы можете найти по ссылке — https://python-scripts.com/reversed
Если знаете что-либо еще по этой теме, хотите меня поправить или дать идею — пишите в комментариях, я все прочту и приму к сведению. Удачи!
Python: инвертирование числа без преобразования в строку
В этом посте о программировании на Python я покажу вам, как инвертировать целое число (например, преобразовать 123 в 321), но без использования строковых функций или преобразования в строку.
В основном, мы собираемся делать все это с помощью математики, работая с числами как с тем, что они есть, а не как со строками.
Хотя такой подход хорош для практики, я бы предпочел преобразовать его в строку, инвертировать, а затем снова преобразовать в целое число.
Функция Python
Повторяю: я бы предпочел преобразовать в строку и инвертировать, но если вы хотите знать, как это сделать с числами, то это будет выглядеть следующим образом:
Функция получает число и возвращает то же число в перевернутом виде.
В принципе, строка 8 могла бы выглядеть так: n = n // 10
Собираем все вместе
Полный код и режим использования выглядит следующим образом:
Когда вы запускаете его, результат правильный. Помните, что он работает только с целыми числами. Чтобы заставить его работать с плавающими числами, может быть полезна функция modf, которая разделяет целую и десятичную части.
Можно помощь в Python Коде.
Пользователь вводит два вещественных числа — N и K. Напишите программу, которая отдельно заменяет сначала целую часть на число, которое получается из исходного записью его цифр в обратном порядке, затем то же самое делает с дробной частью. После этого числа складываются и сумма выводится на экран.
Введите первое число: 102.12
Введите второе число: 123.34
Первое число наоборот: 201.21
Второе число наоборот: 321.43
def reverse_float(num):
parts = str(num).split(‘.’)
reversed_parts = [».join(reversed(part)) for part in parts]
return float( ‘.’.join(reversed_parts) )
a = reverse_float(input(‘a’))
b = reverse_float(input(‘b’))
print(‘rvs a’, a)
print(‘rvs b’, b)
print(‘total’, a + b)
Задача 5. Наименьший делитель
Дано натуральное число n>1. Напишите функцию, которая находит его наименьший делитель, отличный от 1.
Введите число: 6
Наименьший делитель, отличный от единицы: 2
Введите число: 17
Наименьший делитель, отличный от единицы: 17
Реализовал таким образом. Для коллег с курса)
def separation_whole(number):
««flag = True
««whole = «» #целое
««fraction = «» #дробь
««for symbol in number:
««««if symbol == ‘.’:
««««««flag = False
««««elif flag:
««««««whole = whole + symbol
««««else:
««««««fraction = fraction + symbol
««return int(whole)
def separation_fraction(number):
««flag = True
««whole = «» #целое
««fraction = «» #дробь
««for symbol in number:
««««if symbol == ‘.’:
««««««flag = False
««««elif flag:
««««««whole = whole + symbol
««««else:
««««««fraction = fraction + symbol
««return int(fraction)
def revers(n):
««count = 0
««while n > 0:
««««count = count * 10 + n % 10
««««n //= 10
««return str(count)
def bonding(revers_whole, revers_fraction):
««revers_num = revers_whole + «.» + revers_fraction
««return str(revers_num)
def summ_mun(first_num, second_num):
««summ = float(first_num) + float(second_num)
««return summ
first_number = (input(«Введите первое число: «))
««second_number = (input(«Введите второе число: «))
Дополнение, убираем принты и добавляет эти строки после
first_number = (input(«Введите первое число: «))
second_number = (input(«Введите второе число: «))
revers_first_num = bonding(revers(separation_whole(first_number)), revers(separation_fraction(first_number)))
revers_second_num = bonding(revers(separation_whole(second_number)), revers(separation_fraction(second_number)))
print(f»\nПервое число наоборот:
print(f»Второе число наоборот:
summ_revers_num = summ_mun(revers_first_num, revers_second_num)
print(f»Сумма:
Вот вариант покороче
Вот самый подходящий вариант для товарищей из Skillbox):
def turn_numbers1(N):
number = 0
main_part = round(N, 1) // 1
print(main_part)
while main_part > 0:
rest = main_part % 10
main_part = main_part // 10
number = number * 10
number = number + rest
print(number)
return number
def turn_numbers2(N):
number2 = 0
residual_part = round(N — (N // 1), 2) * 100
print(residual_part)
while residual_part > 0:
rest = (round((N — (N // 1)), 2) * 100) % 10
residual_part = residual_part // 10
number2 = number2 + rest
number2 = number2 * 10 — 0.1
number2 /= 1000
return number2
N1 = float(input(«Введите первое вещественное число: «))
reverse_N1_main = turn_numbers1(N1)
reverse_N1_residual = turn_numbers2(N1)
reverse_N1 = reverse_N1_main + reverse_N1_residual
print(«1ое число наоборот: «, reverse_N1)
N2 = float(input(«Введите второе вещественное число: «))
reverse_N2_main = turn_numbers1(N2)
reverse_N2_residual = turn_numbers2(N2)
reverse_N2 = reverse_N2_main + reverse_N2_residual
print(«2ое число наоборот: «, reverse_N2)
summ_reversed_num = reverse_N1 + reverse_N2
print(«Сумма: «, summ_reversed_num)
Можно сделать все просто)
n_1 = float(input(‘Введите первое число: ‘))
n_2 = float(input(‘Введите второе число: ‘))
print()
def revers_number(number):
«»»Часть которая переворачивает число до точки»»»
x = int(number)
n = 0
while x > 0:
digit = x % 10
x = x // 10
n = n * 10
n = n + digit
«»»Часть которая переворачивает число после точки»»»
y = »
for i in reversed(str(number)):
if i == ‘.’:
break
y += i
y = float(‘0.’ + y)
def converty(x):
x
b = str(int(x))[::-1]
n = len(str(x))
m = len(str(int(x)))
c = str(x)[m+1:n]
d = c[::-1]
x1 = b+’.’+d
return x1
y = float(input(‘y=’))
y1 = converty(y)
z = float(input(‘z=’))
z1 = converty(z)
print(y1, z1, float(y1) + float(z1))
У меня вот так:
def r_num(num):
flag = True
b = »
c = »
for i in num:
if i == ‘.’:
flag = False
elif flag:
b += i
else:
c += i
b, c = int(b), int(c)
return rev_num(b, c)
def rev_num(num_rev1, num_rev2):
rev1 = 0
rev2 = 0
while num_rev1 > 0:
dig = num_rev1 % 10
rev1 = rev1 * 10 + dig
num_rev1 //= 10
while num_rev2 > 0:
dig = num_rev2 % 10
rev2 = rev2 * 10 + dig
num_rev2 //= 10
rev1, rev2 = str(rev1), str(rev2)
sum_all = float(rev1 + ‘.’ + rev2)
return sum_all
number_n1 = (input(‘Введите первое число: ‘))
print(‘Превернутое первое число:’, r_num(number_n1))
number_n2 = (input(‘Введите второе число: ‘))
print(‘Превернутое второе число:’, r_num(number_n2))
print(‘Сумма:’, r_num(number_n1), ‘+’, r_num(number_n2), ‘=’, (r_num(number_n1) + r_num(number_n2)))
def coup(list):
number3 = ''
for i in str(list[::-1]):
number3 += i
return number3
def work_in_parts(number):
list = str(number).split('.')
return float(coup(list=list[0]) + '.' + coup(list=list[1]))
number1 = work_in_parts(number=input('Введите первое число: '))
number2 = work_in_parts(number=input('Введите второе число: '))
print('Первое число наоборот: ', number1)
print('Второе число наоборот: ', number2)
print('Сумма: ', number1 + number2)