Step 1 (S-14671)

From Stepik Wiki
Jump to: navigation, search

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

S-14671-1.png

Работу со строками языке Python мы с вами уже вкратце рассматривали. Но пока мы рассматривали строки, как некие делимые объекты. На самом деле сроки являются последовательностями символов, поэтому логично, что можно обращаться и рассматривать отдельные символы. И сейчас мы посмотрим, как это можно сделать. В качестве примера в данной части мы будем рассматривать геномные строки, то есть строки состоящие из символов "A","T","G","C", которые соответствуют четырем нуклеиновым основаниям. Это не должно вводить вас в заблуждение, все нижесказанное будет верно для любых строк и любых символов. Итак, у нас есть строка состоящая из четырех символов - "ATGG".

S-14671-2.png

Поскольку, строка это последовательность, то символы в ней нумеруются. Нумерация начинается с 0. В нашей строке у символа "A" индекс 0, у "T" - 1 и так далее. С помощью этой индексации, которая верна для любых строк, мы можем обращаться к символам по индексам. К символу с индексом n можно обратиться так:

genome[n]

Индекс необходимого нам символа записывается в квадратных скобках сразу за указателем на объект строки (в нашем случае - это имя переменной genome) Например:

S-14671-3.png

Кроме этого мы можем использовать отрицательную индексацию. Работает это следующим образом. Индекс последнего элемента строки равен: -1, предпоследнего: -2 и так далее.

Индексация с начала: 0 1 2 3
Строка: A T G G
Индексация с конца: -4 -3 -2 -1

S-14671-4.png

Строки являются неизменяемыми объектами. Нельзя взять и изменить какой-либо символ в строке. Например, при попытке присвоить значение "C" второму символу нашей строки, используя обращение через индекс. Интерпретатор выдаст сообщение об ошибке.

S-14671-5.png

Если все таки возникла необходимость изменить строку, нам придется создать новую строку с внесенными изменениями. Об этом мы поговорим чуть позже.

Индексация позволяет нам провести перебор символов строки, используя цикл for с функцией range.

S-14671-6.png

Функция range вернет нам последовательность чисел от 0 до 3. Используя их в качестве индексов, мы можем напечатать все символы нашей строки. Однако, если нам хочется перечислять все символы строки, то лучше использовать другую конструкцию.

S-14671-7.png

Она хорошо работает с любыми последовательностями. Смысл этой конструкции в следующем. Пусть переменная i принимает все значения, которые есть в последовательности genome. Результат будет таким же, как в предыдущем варианте с range. Такой способ гораздо лучше, поскольку не использует вызов функции range и код становится более читабельным.

S-14671-8.png

Рассмотрим задачу. Нам дается геномная последовательность в виде строки (последовательность, состоящая из символов "A","T","G","C"). Наложим ограничение, все символы в строке должны быть заглавными. Нам нужно выяснить: сколько раз в этой последовательности встречается цитозин (обозначается буквой "С"). Например для последовательности "CACCTGGAC" ответ будет 4, для "GATTACA" - 1. Первым делом прочитаем входную строку и поместим ее в переменную genome. Как мы будем считать количество символов "C" в строке? Заведем переменную счетчик cnt, обнулим его и будем увеличивать ее значение каждый раз когда нам встретится искомый символ. Таким образом, перебрав все символы в строке, в переменной cnt будут учтены все символы "С", встреченные в строке.

S-14671-9.png

Есть другой способ решить эту задачу. Он гораздо короче.

S-14671-10.png

Первой строкой мы считываем строку. Во второй - вызываем для строки метод count, которому передаем в качестве аргумента символ "С". Строки - это объекты у которых есть специальные методы. Метод объекта это фактически функция, которая применяется к конкретному объекту. Конструкция genome.count('C') обозначает, что мы применяем функцию count к строке, хранящейся в переменной genome, и в качестве параметра передаем в него строку 'C'. Метод count подсчитывает сколько раз в строке встречается переданный ему аргумент. У строк достаточно много методов, о них мы поговорим позже.