Проверяем длину строки в Python
Давайте создадим строку, представляющую фрагмент РНК (это молекула, похожая на ДНК, но не используемая для того, чтобы хранить генетическую информацию) :
sequence = "UCAGUUUGGUCC"
Давайте проверим его длину. Для этой цели мы будем использовать функцию len()
:
len(sequence)
12
Вы, конечно, можете использовать функцию print()
для отображения результата:
print(f"Длина последовательности {len(sequence)} символов.")
Длина последовательности 12 символов.
Мы можем получить одну букву из текстовой строки:
sequence[1]
'C'
Обратите внимание, что число 1
— это вторая буква в последовательности. Это связано с тем, что последующие символы «нумеруются», начиная с нуля. Мы называем эти «цифры» индексами . Таким образом, первая буква имеет индекс 0
, а последняя буква имеет индекс, равный длине строки минус 1
.
print(f"Первый нуклеотид: {sequence[0]}, остальные: {sequence[len(sequence)-1]}")
Первый нуклеотид: U, остальные: C
Получаем фрагменты строк в Python используя срезы.
Если мы хотим получить фрагмент строки, мы вводим индексы первого и последнего, +1
разделенные двоеточием ( :
). Например, если мы хотим получить первые три нуклеотида в последовательности гена, мы можем выполнить следующий код:
print(f"Последовательность гена: {sequence[0:3]}")
Последовательность гена: UCA
Вы можете добиться того же эффекта, опустив 0
, и в этом случае строка по умолчанию будет возвращена с начала:
print(f"Последовательность гена: {sequence[:3]}")
Последовательность гена
: UCA
Важно помнить, что символ с индексом, определяемым вторым числом, не возвращается . Точно так же мы можем получить последний кодон следующим образом:
print(f"Остатки гена: {sequence[len(sequence)-3:len(sequence)]}")
Остатки гена:
UCC
В этом случае вы также можете упростить выражение:
print(f"Остатки гена: {sequence[len(sequence)-3:]}")
Остатки гена:
UCC
Или даже больше:
print(f"Остатки гена: {sequence[-3:]}")
Остатки гена: UCC
Несложно догадаться, что всю цепочку можно получить так:
print(f"Вся последовательность: {sequence[:]}")
Вся последовательность: UCAGUUUGGUCC
Вы также можете добавить в выражение еще один элемент для обозначения шага:
print(f"Каждый третий нуклеотид: {sequence[::3]}")
Каждый третий нуклеотид: UGUU
Мы получили каждого третьего персонажа во всей цепочке. В данном случае это первые нуклеотиды кодонов.
Вы также можете ввести отрицательное значение шага, тогда вы получите перевернутую строку:
print(f"Обратная последовательность: {sequence[::-1]}")
Обратная последовательность: CCUGGUUUGACU
Подведем итоги:
Выражение | Результат |
---|---|
stroka[:] |
вся строка |
stroka[start:stop] |
символы от начальной позиции до символа с индексом стоп-1 |
stroka[start:] |
символы от начала до конца строки |
stroka[:stop] |
символов от начала строки до символа с индексом stop — 1 |
stroka[::n] |
каждый n-й символ во всей строке, начиная с первого |
stroka[start:stop:n] |
каждый n-й символ части строки от начала до конца -1 |
stroka[::-1] |
обратная строка |
Простые манипуляции со строками
Сложение и умножение в строках
Добавим дополнительный кодон в конце последовательности:
sequence = sequence + "UAA"
print(sequence)
UCAGUUUGGUCCUAA
Как видите, строка длиннее на последовательность UAA
.
Вы также можете написать эту команду короче:
sequence += "UAA"
print(sequence)
UCAGUUUGGUCCUAA
Теперь попробуем изменить одну букву:
sequence[0] = "A"
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<python-input-18-a2c86a882dc6> in <module>
----> 1 sekwencja[0] = "A"
TypeError: 'str' object does not support item assignment
На этот раз операция провалилась. Почему удалось продлить последовательность, а заменить одну букву не удалось? На самом деле строки неизменяемы , т. е. их нельзя изменить. Так почему же нам удалось добавить в последовательность дополнительные символы? Давайте еще раз посмотрим на выражение, которое мы использовали:
sequence = sequence + "UAA"
В правой части оператора =
мы вызвали переменную sekwencja
, которая вернула строку. Добавив к нему последовательность, UAA
мы создали новую строку, которую присвоили переменной sekwencja
. Итак, после всей операции переменная указывала на новую строку. Может показаться, что речь идет об одном и том же, но второй пример показал, что это не так. Изменить строку мы не можем, но можно создать новую строку символов и, например, присвоить ее переменной или отобразить на экране. Дальнейшие примеры манипуляций со строками фактически будут заключаться в создании новых текстовых строк, хотя для простоты я буду использовать такие фразы, как «изменение букв в строке» или «изменение регистра символов в текстовой строке».
Ранее мы объединяли строки, теперь попробуем их «перемножить»:
cod = "CUA"
three_cod = cod * 3
print(f"Код: {cpd}\n Три кода: {three_cod}")
Код: CUA
Три кода: CUACUACUA
Изменение регистра символов в строке Python
Изменение регистра символов включает вызов методов :
Метод | Результат |
---|---|
lower() |
изменение символов на строчные |
upper() |
изменение символов в верхний регистр |
title() |
первые символы в словах — прописные, остальные — строчные. |
swapcase() |
инверсия регистра |
Прежде чем двигаться дальше, было бы неплохо объяснить, что такое метод и чем он отличается от функции:
Метод соответствует функции , но вызывается для объекта . То есть, например, мы вызываем функцию «независимо», например, print("Hello!")
и метод, используя имя объекта, например sekwencja.lower())
, где sekwencja
это имя объекта (например, переменной). Конкретные методы подходят для данного типа объекта. Например, те, которые мы сейчас обсуждаем, можно вызывать на объектах типа String
( str
).
sequence = "UCAGUUUGGUCC"
print(sequence())
ucaguuuggucc
Проверим, не изменилась ли последовательность:
print(sequence)
UCAGUUUGGUCC
Как видите, цепочка не изменилась.
Ранее я упоминал, что определенные методы специфичны для данного типа объекта. Объекты разных типов могут иметь общие методы, но обычно у объекта данного типа есть некоторые методы, специфичные для этого типа. Таким образом, вызов их для объектов другого типа завершится неудачно или приведет к другому результату, если оба типа объектов имеют методы с одинаковым именем, но разным кодом.
Давайте проверим это, попробовав вызвать метод, подходящий для объектов типа, str
у объекта типа int
.
num = 8
print(f"Тип переменной число: {type(num)}")
print(num.lower())
Type num
to: <class 'int'> ------------------------------------------------------------------------- AttributeError Traceback (most recent call last) Input In [3], in <cell line: 3>() 1 num
= 8 2 print(f"Тип переменной число
: {type(num
)}") ----> 3 print(num
.lower()) AttributeError: 'int' object has no attribute 'lower'
У объектов типа int
нет метода lower()
, поэтому попытка вызвать его у такого объекта генерирует информацию об ошибке.
Как видите, стоит знать тип объекта, чтобы правильно использовать его в создаваемой вами программе.
Если мы хотим изменить регистр строки, хранимой в переменной, нам нужно переназначить новую строку переменной:
sequence = sequence.lower()
print(sequence)
ucaguuuggucc
Если мы хотим вернуть строку в верхний регистр, мы будем использовать второй упомянутый метод:
sequence = sequence.upper()
print(sequence)
UCAGUUUGGUCC
Теперь давайте воспользуемся строкой с прописными и строчными буквами, чтобы протестировать четыре упомянутых метода:
lancuch = "Мне нравится программировать на Python"
print(lancuch.lower())
print(lancuch.upper())
print(lancuch.title())
print(lancuch.swapcase())
мне нравится программировать на python
МНЕ НРАВИТСЯ ПРОГРАММИРОВАТЬ НА PYTHON
Мне Нравится Программировать На Python
мНЕ НРАВИТСЯ ПРОГРАММИРОВАТЬ НА pYTHON
Обрезка пустого пространства строк в Python
Пробелы — это символы, которые не имеют формы ни на экране, ни в печати. К ним относятся, например, пробел, табуляция или разрыв строки. Иногда вам нужно удалить пробелы в начале и конце текстовой строки. Это имеет место, например, когда мы хотим сравнить строки символов, например, чтобы найти короткую последовательность, введенную пользователем, в более длинной последовательности. В таком случае, если пользователь вводит, например AACTGA
(с пробелом в начале), и более длинная последовательность выглядит, например, так: GGTTTAACTGACC
строка не будет найдена, поскольку в последовательности нет пробелов. Поэтому вам следует начать с обрезания всех пробелов в начале и конце строки. Здесь мы можем использовать три метода:
lstrip()
— удаляет пробелы в начале строки (слева)rstrip()
— удаляет пробелы в конце строки (справа)strip()
— удаляет пробелы с обоих концов строки
Давайте проверим, как это работает: добавим в строку восклицательный знак, чтобы показать действие в правой части строки:
text = "\t Просто строка "
print(text+"!")
print(text.lstrip()+"!")
print(text.rstrip()+"!")
print(text.strip()+"!")
Просто строка !
Просто строка !
Просто строка!
Просто строка!
Поиск и замена в строках
Python предоставляет несколько полезных методов для поиска частей строк и их изменения.
Первый startswith()
позволяет вам проверить, появляется ли искомый символ или строка в начале проверяемой строки. В зависимости от результата поиска возвращается True
либо False
:
sequence = "UCAGUUUGGUCC"
print(sequence.startswith("UCA"))
True
Аналогичный метод endswith()
проверяет конец строки :
sequence = "UCAGUUUGGUCC"
print(sequence.endswith("UCA"))
False
Обратите внимание: если мы ищем пустую строку, возвращается значение True
. Имейте это в виду, так как это может привести к ошибочному выводу программы.
sequence = "UCAGUUUGGUCC"
print(sequence.endswith(""))
True
Следующий метод count()
возвращает количество искомых символов или строк символов:
print(sequence.count("U"))
5
print(sequence.count("UC"))
2
Подсчет можно ограничить фрагментом строки, указав индекс символа, от которого следует считать:
print(sequence.count("U",5))
3
Также можно указать индекс места, до которого следует вести отсчет, но символ, расположенный под итоговым индексом, не попадает в область поиска :
print(sequence.count("U",0,6))
3
Иногда нам недостаточно проверить, встречается ли данная строка символов, но нам также хотелось бы узнать ее положение в строке.
Метод find()
выполняет поиск с начала строки и возвращает индекс первой буквы первой найденной строки:
print(sequence.find("UC"))
0
Метод работает аналогично rfind()
, но ищет в обратном направлении , поэтому мы получаем местоположение последнего вхождения искомой строки:
print(sequence.rfind("UC"))
9
Что произойдет, если искомая строка не будет найдена?
print(sequence.find("XYZ"))
-1
Вы можете ограничить поиск частями строки. Предоставляя один дополнительный аргумент, мы ограничиваем их фрагментом, начинающимся с указанного индекса:
print(sequence.find("UC",2))
9
Также можно указать индекс места в строке, где должен закончиться поиск :
print(sequence.find("U",1,6))
4
Однако помните, что символ под конечным индексом (как в случае вырезания или счета) не включается в поиск :
print(sequence.find("A",0,2))
-1
Аналогичным образом можно ограничить область поиска метода rfind()
— если мы предоставим один индекс, поиск начинается с указанного места до конца, но, естественно, возвращается последняя позиция искомой строки:
print(sequence.rfind("U",0,7))
print(sequence.rfind("U",4))
6
9
Другой полезный метод replace()
позволяет, как следует из названия, заменять символы или более длинные части строки:
print(sequence.replace("U","T"))
TCAGTTTGGTCC
print(sequence.replace("GU","XX"))
UCAXXUUGXXCC
Если мы передаем в качестве параметра дополнительное число, оно будет указывать максимальное количество сделанных замен:
print(sequence.replace("U","T",3))
TCAGTTUGGUCC
Конечно, помните, что приведенная выше команда не меняет исходную строку символов:
print(sequence)
UCAGUUUGGUCC
Функция index()
работает аналогично, find()
но если она не находит искомую строку символов, то возвращает ошибку:
print(sequence.index("Z"))
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-82-679c2407de3c> in <module>
----> 1 print(sequence
.index("Z")) ValueError: substring not found
Подведем итоги изученным нами методам. str
означает искомый символ или последовательность символов, START
— начало диапазона, KONIEC
— конец диапазона, N
— количество изменений, необязательные параметры заключаются в квадратные скобки []
:
Метод | Действие |
---|---|
startswith(str) |
Поиск последовательности символов в начале строки |
endswith(str) |
Поиск последовательности символов в конце строки |
count(str[,START[,END]]) |
Количество вхождений последовательности символов |
find(str[,START[,END]]) |
Поиск последовательности символов с начала строки. Возвращается индекс первого вхождения. Если последовательность не найдена, возвращается значение -1 . |
rfind(str[,START[,END]]) |
Поиск последовательности символов с конца строки. Возвращается индекс первого вхождения с конца. Если последовательность не найдена, возвращается значение -1 . |
index(str[,START[,END]]) |
Аналогично find() , но возвращается ошибка, если последовательность не найдена. |
replace(str1, str2 [,N]) |
Изменяет вхождения строки str1 на str2 строку. Если указано число ( ) N , будет произведено максимальное количество изменений N ; если этот параметр отсутствует, все найденные последовательности символов будут изменены. |
Python предлагает множество дополнительных возможностей для работы со строками, некоторые из которых мы обсудим позже на этом сайте.