Проверяем длину строки в 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это имя объекта (например, переменной). Конкретные методы подходят для данного типа объекта. Например, те, которые мы сейчас обсуждаем, можно вызывать на объектах типа Stringstr).

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 предлагает множество дополнительных возможностей для работы со строками, некоторые из которых мы обсудим позже на этом сайте.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Заполните поле
Заполните поле
Пожалуйста, введите корректный адрес email.