Перейти к содержанию
Educora
Средний9 класс25 мин34 / 59

Строки и операции над ними

Индексы (в том числе отрицательные), срезы и `[::-1]`; `len`, `+`, `*`, `in`, `count`, `find`, `replace`, `upper`, `isdigit`, `split`, `join`; цикл по символам, работа с цифрами через `str(n)` и строковые шаблоны письменных заданий ГЭЦ.

Проверь себя
В этом уроке ты узнаешь
  • работать с индексами (в том числе отрицательными) и срезами, включая [::-1]
  • предсказывать результат операций len, +, *, in и методов count, find, replace, upper, lower, isdigit, split, join
  • обходить строку по символам и строить новые строки: различные символы, фильтры, соседние символы
  • обрабатывать элементы, введённые в одной строке, с помощью split(' ') и работать с цифрами через str(n)

'Bakı 2026' — строка из 9 символов: 4 буквы, 1 пробел и 4 цифры. Для Python строка — цепочка пронумерованных символов: любой символ можно взять по номеру, вырезать часть, посчитать символы и перевернуть строку. В обоих вариантах ГЭЦ 2025 года одна из письменных программ была о строках (количество различных символов; обработка элементов, введённых в одной строке через пробел), а в 2026 году операции со строками встречались внутри заданий на списки и функции. Этот урок продолжает тему input() и типа str из урока «Языки программирования и Python: переменные, ввод и вывод».

Строка, индекс и срез

Определение
Строка (str)

Последовательность символов в кавычках: 'data', "3ab6", '' (пустая строка). input() всегда возвращает введённое как строку; если нужно число, пишут int(input()).

Определение
Индекс

Порядковый номер символа в строке. Слева отсчёт идёт с 0: первый символ — s[0], последний — s[len(s) - 1]. Справа считают отрицательными индексами: s[-1] — последний, s[-2] — предпоследний символ.

s = 'PYTHON'PYTHON
индекс012345
отрицательный индекс−6−5−4−3−2−1
У каждого символа два номера: s[1] и s[-5] — один и тот же символ 'Y'.
s[i] s[-1] = s[len(s) - 1]
где:
  • s[i]символ с индексом i (тоже строка)
  • len(s)количество символов; последний индекс — len(s) − 1

s[len(s)] вызывает ошибку (IndexError): такого индекса нет.

s[a:b:c]
где:
  • aначальный индекс (включается); если не указан — с начала
  • bконечный индекс (не включается); если не указан — до конца
  • cшаг; по умолчанию 1; отрицательный шаг идёт справа налево

Срез идёт от a до b − 1 с шагом c. s[::-1] — перевёрнутая строка; при c = 1 в срезе b − a символов.

Python
s = 'programming'
print(len(s), s[0], s[-1], s[3])
print(s[3:7], s[:3], s[7:])
print(s[::2], s[::-1])
print(s[-4:], s[1:8:3])
▸ Ожидаемый результат
11 p g g
gram pro ming
pormig gnimmargorp
ming rrm
Сначала вычисли каждую строку сам: в 'programming' 11 символов, индексы 0…10.
Пример 1. Индексы и срезы

Для s = 'informatics' найдите: 1) s[2:6]; 2) s[-3:]; 3) s[1::3]; 4) s[5] + s[0]; 5) s[::-1][:4].

Показать решение
Индексы: i0 n1 f2 o3 r4 m5 a6 t7 i8 c9 s10 (len = 11).
1) 2, 3, 4, 5 → 'form' (6 не включается).
2) три последних символа → 'ics'.
3) 1, 4, 7, 10 → 'nrts'.
4) 'm' + 'i' → 'mi' (+ склеивает строки).
5) перевёрнутая строка — 'scitamrofni', её первые четыре символа → 'scit'.

Операции и методы

Операции над строкой возвращают новую строку или число, а исходная строка не меняется: строки неизменяемы, запись s[0] = 'P' вызывает ошибку. Если нужно изменение, строим новую строку и снова присваиваем её переменной: s = s.upper().

ОперацияЧто делаетПримерРезультат
len(s)количество символовlen('banana')6
+, *сцепление, повторение'ab' + 'c', 'ab' * 3'abc', 'ababab'
inесть ли такая подстрока'nan' in 'banana'True
s.count(x)сколько раз встречается x (без наложений)'banana'.count('a'), 'banana'.count('ana')3, 1
s.find(x)первый индекс или −1, если нет'banana'.find('n'), 'banana'.find('z')2, -1
s.index(x)как find, но ошибка, если x нет'banana'.index('a')1
s.replace(a, b)заменяет все a на b'banana'.replace('a', 'o')'bonono'
s.upper(), s.lower()заглавные / строчные буквы'Baku'.upper()'BAKU'
s.isdigit()состоит ли только из цифр'2026'.isdigit(), '20a'.isdigit()True, False
s.split(x)делит на список по x'3 ab 45'.split(' ')['3', 'ab', '45']
x.join(a)соединяет элементы списка через x'-'.join(['a', 'b'])'a-b'
Основные операции со строками. split и join работают со списками — см. «Списки и операции над ними».
Python
s = 'banana'
print(s.count('a'), s.count('ana'), s.find('n'), s.find('z'))
print(s.replace('a', 'o'), s.upper(), 'nan' in s)
print('2026'.isdigit(), '20a'.isdigit())
print('ab' * 3 + '!', len(s * 2))
▸ Ожидаемый результат
3 1 2 -1
bonono BANANA True
True False
ababab! 12
s.replace и s.upper возвращают новые строки; сама s остаётся 'banana'.

Заглавные и строчные буквы — разные символы: 'A' == 'a' ложно. Чтобы считать букву независимо от регистра, сначала переведи строку в строчные буквы: s.lower().count('a'). upper() и lower() не меняют цифры и знаки.

Python
s = 'abracadabra'
k = s.count('a') + s.find('c')
t = s[k:] + s[:2]
print(t)
▸ Ожидаемый результат
raab
Программа к примеру 2: сначала найди результат сам.
Пример 2. Задание в стиле ГЭЦ: методы и срезы

Определите результат программы выше.
A) braab B) raab C) raba D) abra E) ra

Показать решение
Индексы: a0 b1 r2 a3 c4 a5 d6 a7 b8 r9 a10.
s.count('a') = 5 (индексы 0, 3, 5, 7, 10), s.find('c') = 4, значит, k = 9.
s[9:] = 'ra', s[:2] = 'ab', t = 'ra' + 'ab' = 'raab'. Ответ: B.

Цикл по символам и построение новой строки

Строку можно обходить двумя способами: по самим символам (for c in s:) и по индексам (for i in range(len(s)):). Второй способ выбирают, когда нужна позиция или соседние символы (s[i] и s[i + 1]). Новую строку начинаем с пустой (k = '') и наращиваем через k = k + c; k = c + k собирает символы в обратном порядке.

  1. 1
    Пустая строка

    k = '' — здесь будут собираться уже встреченные символы.

  2. 2
    Цикл

    for c in s: — просмотри каждый символ.

  3. 3
    Новый символ?

    if k.count(c) == 0: (или if c not in k:) — добавляй через k = k + c только символ, которого ещё нет.

  4. 4
    Результат

    print(len(k)) — количество различных символов. Пробел — тоже символ.

Python
s = 'mississippi-2026'
v = 0
d = ''
k = ''
for c in s:
    if c in 'aeiou':
        v = v + 1
    if c.isdigit():
        d = d + c
    if k.count(c) == 0:
        k = k + c
print(v, d, k, len(k))
▸ Ожидаемый результат
4 2026 misp-206 8
Три дела в одном цикле: количество гласных (4), строка только из цифр ('2026') и различные символы ('misp-206', 8 символов).
Пример 3. Соседние символы

Составьте цикл, который считает пары одинаковых соседних символов в строке s = 'bookkeeper'. Почему нужно писать range(len(s) - 1), а не range(len(s))?

Показать решение
for i in range(len(s) - 1): и if s[i] == s[i + 1]: c = c + 1.
Индексы: b0 o1 o2 k3 k4 e5 e6 p7 e8 r9. Пары: oo (1–2), kk (3–4), ee (5–6) — ответ 3.
При range(len(s)) на последнем шаге i = 9, а s[10] не существует — ошибка IndexError.
Python
s = 'olympiad'
k = ''
for i in range(len(s)):
    if i % 2 == 0:
        k = k + s[i].upper()
    elif s[i] in 'aeiou':
        k = k + '*'
    else:
        k = k + s[i]
print(k, len(k))
▸ Ожидаемый результат
OlYmP*Ad 8
Программа к примеру 4: сначала найди результат сам.
Пример 4. Задание в стиле ГЭЦ: цикл по индексам

Определите результат программы выше.
A) oLyMpIaD 8 B) OlYmPiAd 8 C) OLYMPIAD 8 D) OlYmP*Ad 8 E) *lYmP**d 8

Показать решение
Индексы: o0 l1 y2 m3 p4 i5 a6 d7.
Символы с чётными индексами (0, 2, 4, 6) становятся заглавными: O, Y, P, A. Когда первое условие истинно, elif не проверяется, поэтому a6 тоже становится 'A', а не звёздочкой.
На нечётных индексах: l1 — согласная, остаётся; m3 — остаётся; i5 — гласная → *; d7 — остаётся.
k = 'OlYmP*Ad', длина 8. Ответ: D. Ловушка: вариант E меняет порядок условий — если бы проверка гласной шла первой, звёздочками стали бы и o0, и a6.

Число и строка: str(n) и int(s)

str(n) превращает число в строку цифр, а int(s) — строку цифр в число. Это второй способ работы с цифрами (первый — n % 10 и n // 10, см. «Операции над числами: цифры, делители и простые числа»): len(str(n)) — количество цифр, str(n)[::-1] — запись в обратном порядке, str(n).count('7') — сколько раз встречается цифра 7.

Python
n = 40718
t = str(n)
print(len(t), t[0], t[-1], t.count('0'))
print(int(t[::-1]), t == t[::-1])
s = 0
for c in t:
    s = s + int(c)
print(s, t + '5', n + 5)
▸ Ожидаемый результат
5 4 8 1
81704 False
20 407185 40723
t + '5' склеивает строки ('407185'), а n + 5 складывает числа (40723).
Python
a = [707, 17, 1234, 77, 470, 5]
m = 0
for x in a:
    t = str(x)
    if t.count('7') == 1:
        m = m + x
    else:
        m = m - x
print(m)
▸ Ожидаемый результат
-1536
Программа к примеру 5.
Пример 5. Задание в стиле ГЭЦ: str и count

Определите результат программы выше.
A) 1536 B) 487 C) −1536 D) −1459 E) −2006

Показать решение
Числа, в которых цифра 7 встречается ровно один раз, прибавляются, остальные вычитаются:
707 — дважды → −707; 17 — один раз → +17; 1234 — нет → −1234; 77 — дважды → −77; 470 — один раз → +470; 5 → −5.
m = −707 + 17 − 1234 − 77 + 470 − 5 = −1536. Ответ: C.

split и join: элементы в одной строке

В письменных заданиях элементы часто вводятся в одной строке через пробел: b = input(), затем a = b.split(' '). Получается список строк: первый символ i-го элемента — a[i][0], последний — a[i][-1] (или a[i][len(a[i]) - 1]), длина — len(a[i]); если элемент нужен как число, пишут int(a[i]). Если спрашивают сумму индексов, цикл строят по индексам.

Python
b = 'ada 7x7 radar 45 noon ab'
a = b.split(' ')
k = 0
s = 0
for i in range(len(a)):
    if a[i][0] == a[i][-1]:
        k = k + 1
        s = s + i
print(a)
print(k, s)
print('-'.join(a[:3]))
▸ Ожидаемый результат
['ada', '7x7', 'radar', '45', 'noon', 'ab']
4 7
ada-7x7-radar
Элементы, у которых первый и последний символы совпадают: их 4, сумма индексов 0 + 1 + 2 + 4 = 7. На экзамене первая строка — b = input().
Пример 6. Числа из строки

С клавиатуры вводится строка 10 205 3 4400 17. Найдите количество элементов, оканчивающихся цифрой 0, их сумму (как чисел) и сумму их индексов.

Показать решение
a = ['10', '205', '3', '4400', '17']. Условие: a[i][-1] == '0'.
i = 0: '10' — подходит; i = 3: '4400' — подходит; остальные оканчиваются на 5, 3, 7.
Количество: 2; сумма: int('10') + int('4400') = 4410; сумма индексов: 0 + 3 = 3.
Внимание: '10' + '4400' дало бы строку '104400'.
Задание

Выведите в одной строке через пробел количество различных символов строки s = 'informatics' и строку из этих символов в порядке их первого появления.

Задание · Python
s = 'informatics'
k = ''
# collect the distinct characters in k

print(len(k), k)
▸ Ожидаемый результат
10 informatcs
Задание

В строке line = '31 405 7 1234 56 800' выведите сумму чисел, у которых первая цифра больше последней.

Задание · Python
line = '31 405 7 1234 56 800'
a = line.split(' ')
total = 0
# loop over a here

print(total)
▸ Ожидаемый результат
831

Главное

  • Индексы начинаются с 0 слева и с −1 справа; в срезе s[a:b:c] b не включается, s[::-1] переворачивает строку.
  • Строки неизменяемы: методы возвращают новые строки, поэтому результат присваивают заново, например s = s.upper().
  • count считает (без наложений), find ищет (−1, если не найдено), replace заменяет, isdigit проверяет цифры.
  • Различные символы: k = '', for c in s:, if k.count(c) == 0: k = k + c, в конце len(k).
  • b.split(' ') даёт список строк: a[i][0], a[i][-1], int(a[i]); str(n) и int(s) — мост между числами и строками.

Проверь себя

Вопросов: 12. Каждый правильный ответ приносит XP.

1 / 12
Чему равно s[-1] при s = 'python'?