Step 4 (S-14672)

From Stepik Wiki
Revision as of 16:20, 27 July 2017 by Valeriy Shagur (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Step on Stepik: https://stepik.org/lesson/3367/step/4

S-14672-1.png

Мы рассмотрели, как получить отдельный символ из строки и как вызывать методы у строк. Теперь рассмотрим, как получить некий диапазон символов из строки. Для этого существует специальный механизм слайсинг (срезы).

В качестве примера рассмотрим такую длинную строчку

S-14672-2.png

Первое,что мы можем сделать - это взят конкретный символ.

S-14672-3.png

В данном случае, мы взяли символ строки с индексом 1. Мы можем взять символы с первого по четвертый.

S-14672-4.png

Обратите внимание на то, символ с индексом 4 не был включен. Это общее правило в Python, когда указываются диапазоны, правая граница не включается интервал. Границы диапазона не всегда указываются явно, возможна следующая конструкция:

S-14672-5.png

В ней не указана левая граница диапазона, в таких случаях срез берется от начала строки (с символа с индексом 0). Аналогично мы можем не указывать правую границу диапазона, тогда будут выведены все символы начиная с символа с индексом, указанного как левая граница, до конца строки, включая последний символ.

S-14672-6.png

Также мы можем использовать отрицательные индексы

S-14672-7.png

Отрицательная граница -4, означает, указывает на четвертый символ с конца. Еще один пример с отрицательной нумерацией:

S-14672-8.png

Механизм срезов позволяет выбирать элементы с некоторым шагом, он указывается после правой границы и по умолчанию равен 1.

S-14672-9.png

Шаг может быть отрицательным. В таком случае символы выбираются справа-налево.

S-14672-10.png

Такая конструкция часто используется, для получения символов строки в обратном порядке ("перевернутой" строки).

Рассмотрим следующую задачу. Нам дается геномная последовательность - строка состоящая из символов A, T, G, C. Нам нужно проверить, является ли она палиндромом. В общем случае строка является палиндромом, если она одинаково читается слева-направо и справа-налево. Пример палиндрома приведен на слайде.

S-14672-11.png

Подумаем над решением этой задачи. Первым делом нам нужно прочитать, введенную пользователем, строку. Затем возьмем первый и последний символы строки и сравним их. Если они не равны - строка не является палиндромом, как, например, в случае со строкой GATTACA. Если символы равны, то сравним следующую пару символов (вторые с начала и конца). Будем проверять пары до тех пор, пока индекс символа, идущего с начала, меньше индекса символа, движущемуся ему на встречу с конца. В коде это будет выглядеть так.

S-14672-12.png


Заведем две переменных i и j, указывающие на индексы сравниваемых символов. В начальный момент i = 0, а j имеет индекс равный длине строки минус 1. Нам потребуется еще одна логическая переменная is_palindrom, которая инициализирована значением True. В цикле будем проверять пары символов с индексами i и j на равенство, и в случае, если они равны, на единицу увеличивать значение i и уменьшать значение j. Если в результате сравнений, мы встретим различающиеся символы, то изменим значение переменной is_palindrom на False. Таким образом, сравнив все пары символов, узнаем результат, проверив значение переменной is_palindrom. Остается только вывести его на печать.