Part 3

Работа со строками

Операции со строками

Строки можно объединять, или конкатенировать, с помощью оператора +:

begin = "ex"
end = "ample"
word = begin+end
print(word)
Пример вывода

example

Оператор * также можно использовать со строкой, если другой операнд является целым числом. Тогда строковый операнд повторяется столько раз, сколько указано этим целым числом. Например, это сработает:

word = "banana"
print(word*3)
Пример вывода

bananabananabanana

Используя операции со строками вместе с циклом, можно написать программу, которая рисует пирамиду:

n = 10 # number of layers in the pyramid
row = "*"

while n > 0:
    print(" " * n + row)
    row += "**"
    n -= 1

Она выводит следующее:

          *
         ***
        *****
       *******
      *********
     ***********
    *************
   ***************
  *****************
 *******************

Команда print внутри цикла выводит строку, которая начинается с n пробелов, а затем содержит то, что сохранено в переменной row. После этого к концу переменной row добавляются две звездочки, а значение переменной n уменьшается на 1.

Длина и индекс строки

Функция len возвращает количество символов в строке, и это всегда целочисленное значение. Например, len("hey") возвращает 3, потому что в строке hey три символа.

Следующая программа спрашивает у пользователя строку, а затем выводит ее "подчеркнутой". Программа выводит вторую строку с таким количеством символов -, какова длина введенной строки:

input_string = input("Please type in a string: ")
print(input_string)
print("-"*len(input_string))
Пример вывода

Please type in a string: Hi there!

Hi there!
---------

Длина строки включает все символы в строке, включая пробельные символы. Например, длина строки bye bye равна 7.

Так как строки по сути являются последовательностями символов, из строки можно получить и любой отдельный символ. Оператор [] находит символ с индексом, указанным внутри скобок.

Индекс означает позицию в строке, начиная с нуля. Первый символ строки имеет индекс 0, второй символ - индекс 1, и так далее.

3 2 1

Например, эта программа


input_string = input("Please type in a string: ")
print(input_string[0])
print(input_string[1])
print(input_string[3])

вывела бы:

Пример вывода

Please type in a string: monkey m o k

Поскольку первый символ строки имеет индекс 0, последний символ имеет индекс длина - 1. Следующая программа выводит первый и последний символы строки:

input_string = input("Please type in a string: ")
print("First character: " + input_string[0])
print("Last character: " + input_string[len(input_string) - 1])
Пример вывода

Please type in a string: testing First character: t Last character: g

Следующая программа проходит циклом по всем символам строки от первого до последнего:

input_string = input("Please type in a string: ")
index = 0
while index < len(input_string):
    print(input_string[index])
    index += 1
Пример вывода

Please type in a string: test t e s t

Также можно использовать отрицательную индексацию, чтобы обращаться к символам, считая от конца строки. Последний символ строки находится по индексу -1, предпоследний - по индексу -2, и так далее. Можно считать input_string[-1] сокращением для input_string[len(input_string) - 1].

3 2 2

Пример выше можно упростить с помощью отрицательной индексации:

input_string = input("Please type in a string: ")
print("First character: " + input_string[0])
print("Last character: " + input_string[-1])
Пример вывода

Please type in a string: testing First character: t Last character: g

IndexError: string index out of range

Если вы пробовали приведенные выше примеры самостоятельно, возможно, вы уже встречали сообщение об ошибке IndexError: string index out of range. Эта ошибка появляется, если вы пытаетесь обратиться к индексу, которого нет в строке.

input_string = input("Please type in a string: ")
print("The tenth character: " + input_string[9])
Пример вывода

Please type in a string: introduction to programming The tenth character: i

Пример вывода

Please type in a string: python

Traceback (most recent call last): File "", line 1, in IndexError: string index out of range

Иногда ошибка индексации вызвана багом в коде. Например, довольно часто индексируют слишком далеко при попытке обратиться к последнему символу строки:

input_string = input("Please type in a string: ")
print("Last character: " + input_string[len(input_string)])

Поскольку индексация строк начинается с нуля, последний символ находится по индексу len(input_string) - 1, а не по индексу len(input_string).

Есть ситуации, где программа должна быть готова к ошибкам, вызванным вводом пользователя:

input_string = input("Please type in a string: ")
if len(input_string) > 0:
    print("First character: " + input_string[0])
else:
    print("The input string is empty. There is no first character.")

В примере выше, если бы программист не добавил проверку длины введенной строки, строка длиной ноль вызвала бы ошибку. Строку длиной ноль также называют пустой строкой; здесь она получается, если просто нажать Enter в приглашении ввода.

Подстроки и срезы

Подстрока строки - это последовательность символов, которая образует часть строки. Например, строка example содержит подстроки exam, amp и ple, среди прочих. В программировании на Python процесс выбора подстрок обычно называется slicing, а подстроку часто называют slice строки. Эти два термина часто можно использовать взаимозаменяемо.

Если вы знаете начальный и конечный индексы среза, который хотите извлечь, это можно сделать с помощью записи [a:b]. Это означает, что срез начинается с индекса a и заканчивается последним символом перед индексом b, то есть включает первый, но исключает последний. Индексы можно представить как линии-разделители, проведенные слева от индексируемого символа, как показано на изображении ниже:

3 2 3

Рассмотрим несколько срезанных строк подробнее:

input_string = "presumptious"

print(input_string[0:3])
print(input_string[4:10])

# if the beginning index is left out, it defaults to 0
print(input_string[:3])

# if the end index is left out, it defaults to the length of the string
print(input_string[4:])
Пример вывода

pre umptio pre umptious

Поиск подстрок

Оператор in может сказать нам, содержит ли строка определенную подстроку. Булево выражение a in b истинно, если b содержит подстроку a.

Например, этот фрагмент кода

input_string = "test"

print("t" in input_string)
print("x" in input_string)
print("es" in input_string)
print("ets" in input_string)

выводит следующее:

Пример вывода

True False True False

Программа ниже позволяет пользователю искать подстроки внутри строки, зашитой в программу:

input_string = "perpendicular"

while True:
    substring = input("What are you looking for? ")
    if substring in input_string:
        print("Found it")
    else:
        print("Not found")
Пример вывода

What are you looking for? perp Found it What are you looking for? abc Not found What are you looking for? pen Found it ...

Оператор in возвращает булево значение, поэтому он скажет только, существует ли подстрока в строке, но не поможет выяснить, где именно она находится. Для этой цели можно использовать строковый метод Python find. Он принимает искомую подстроку как аргумент и возвращает либо первый индекс, где она найдена, либо -1, если подстрока не найдена внутри строки.

Изображение ниже показывает, как он используется:

3 2 4

Несколько примеров использования find:

input_string = "test"

print(input_string.find("t"))
print(input_string.find("x"))
print(input_string.find("es"))
print(input_string.find("ets"))
Пример вывода

0 -1 1 -1

Пример поиска подстроки выше, реализованный с помощью find:

input_string = "perpendicular"

while True:
    substring = input("What are you looking for? ")
    index = input_string.find(substring)
    if index >= 0:
        print(f"Found it at the index {index}")
    else:
        print("Not found")
Пример вывода

What are you looking for? perp Found it at the index 0 What are you looking for? abc Not found What are you looking for? pen Found it at the index 3 ...

Вы дошли до конца этого раздела! Перейти к следующему разделу:

Текущие баллы можно посмотреть в синем индикаторе в правом нижнем углу страницы.