- работать с индексами (в том числе отрицательными) и срезами, включая
[::-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: переменные, ввод и вывод».
Строка, индекс и срез
Последовательность символов в кавычках: 'data', "3ab6", '' (пустая строка). input() всегда возвращает введённое как строку; если нужно число, пишут int(input()).
Порядковый номер символа в строке. Слева отсчёт идёт с 0: первый символ — s[0], последний — s[len(s) - 1]. Справа считают отрицательными индексами: s[-1] — последний, s[-2] — предпоследний символ.
| s = 'PYTHON' | P | Y | T | H | O | N |
|---|---|---|---|---|---|---|
| индекс | 0 | 1 | 2 | 3 | 4 | 5 |
| отрицательный индекс | −6 | −5 | −4 | −3 | −2 | −1 |
s[1] и s[-5] — один и тот же символ 'Y'.- s[i]символ с индексом i (тоже строка)
- len(s)количество символов; последний индекс — len(s) − 1
s[len(s)] вызывает ошибку (IndexError): такого индекса нет.
- aначальный индекс (включается); если не указан — с начала
- bконечный индекс (не включается); если не указан — до конца
- cшаг; по умолчанию 1; отрицательный шаг идёт справа налево
Срез идёт от a до b − 1 с шагом c. s[::-1] — перевёрнутая строка; при c = 1 в срезе b − a символов.
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.Для s = 'informatics' найдите: 1) s[2:6]; 2) s[-3:]; 3) s[1::3]; 4) s[5] + s[0]; 5) s[::-1][:4].
Показать решениеСкрыть решение
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 работают со списками — см. «Списки и операции над ними».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() не меняют цифры и знаки.
s = 'abracadabra'
k = s.count('a') + s.find('c')
t = s[k:] + s[:2]
print(t)▸ Ожидаемый результат
raab
Определите результат программы выше.
A) braab B) raab C) raba D) abra E) ra
Показать решениеСкрыть решение
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Пустая строка
k = ''— здесь будут собираться уже встреченные символы. - 2Цикл
for c in s:— просмотри каждый символ. - 3Новый символ?
if k.count(c) == 0:(илиif c not in k:) — добавляй черезk = k + cтолько символ, которого ещё нет. - 4Результат
print(len(k))— количество различных символов. Пробел — тоже символ.
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
'2026') и различные символы ('misp-206', 8 символов).Составьте цикл, который считает пары одинаковых соседних символов в строке 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.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
Определите результат программы выше.
A) oLyMpIaD 8 B) OlYmPiAd 8 C) OLYMPIAD 8 D) OlYmP*Ad 8 E) *lYmP**d 8
Показать решениеСкрыть решение
Символы с чётными индексами (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.
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).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
Определите результат программы выше.
A) 1536 B) 487 C) −1536 D) −1459 E) −2006
Показать решениеСкрыть решение
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]). Если спрашивают сумму индексов, цикл строят по индексам.
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
b = input().С клавиатуры вводится строка 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' и строку из этих символов в порядке их первого появления.
s = 'informatics'
k = ''
# collect the distinct characters in k
print(len(k), k)▸ Ожидаемый результат
10 informatcs
В строке line = '31 405 7 1234 56 800' выведите сумму чисел, у которых первая цифра больше последней.
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.
s[-1] при s = 'python'?