Основы программирования

Строки

**Загадка:** Как получить из строки "Python" букву "P"? Ответ: `"Python"[0]`. Но почему 0, а не 1? И почему `"2" + "2" = "22"`, а не 4?

Строки в программировании - это последовательности символов. Каждый символ имеет свою позицию (индекс), и мы можем с ними творить магию.

Цели урока

  • Понять, что строки - это последовательности символов
  • Освоить индексацию и срезы
  • Научиться основным методам строк
  • Узнать о форматировании строк (f-strings)

Предварительные знания

  • Переменные и типы данных (урок 3)
  • Операторы (урок 4)

90% данных в интернете - это текст. Посты, комментарии, поисковые запросы, пароли - всё это строки. Умение работать со строками - ключевой навык.

  • **Google**: парсинг поисковых запросов
  • **Twitter/X**: ограничение 280 символов, хэштеги
  • **Пароли**: проверка длины и сложности
  • **Чат-боты**: обработка сообщений пользователей

От перфокарт Холлерита до UTF-8: как текст научился жить в памяти

До 1960-х у каждой машины был свой набор символов: IBM использовала BCD и потом EBCDIC, военные DEC Radix-50, телетайпы Baudot. Перенос текста между компьютерами часто превращал слова в кашу. В 1963 году ASA (потом ANSI) выпустила стандарт X3.4 (ASCII): 128 символов, 7 бит, единые коды для латиницы, цифр и управляющих символов. Главным автором был Боб Бимер из IBM. Это решило вопрос для английского, но не для всего остального мира: японский, кириллица, китайский, арабский остались за бортом. В 1980-х расцвели десятки локальных кодировок: KOI8-R и CP1251 для русского, Shift JIS для японского, Big5 для китайского. Открыть файл из другой страны без знания кодировки означало увидеть кракозябры. В 1991 году консорциум Unicode выпустил первую версию: один номер на каждый символ всех письменностей мира. Но как закодировать миллионы номеров в байтах. В сентябре 1992 года Кен Томпсон и Роб Пайк на салфетке в кафе придумали UTF-8: переменная длина 1-4 байта, обратная совместимость с ASCII, самосинхронизация. К 2010 году UTF-8 захватил 50 процентов веба, к 2024 году более 98 процентов. В Python 2 строка str была массивом байт, а unicode отдельным типом, отсюда часть боли миграции на Python 3, где str стал unicode по умолчанию.

Основы строк

**Строка (string)** - это последовательность символов. В Python строки заключаются в кавычки: одинарные или двойные.

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

Разные способы

```python # Одинарные кавычки name = 'Алиса' # Двойные кавычки (то же самое) greeting = "Привет, мир!" # Многострочная строка poem = '''Розы красные, Фиалки синие, Python прекрасен, И ты тоже!''' print(poem) ```

Одинарные и двойные кавычки работают одинаково. Выбирай удобные. Если в строке есть апостроф - используй двойные: `"it's"`. Если нужны кавычки - используй одинарные: `'Он сказал "Привет"'`.

Длина строки

Функция len()

```python password = "secret123" print(len(password)) # 9 # Проверка длины пароля if len(password) >= 8: print("Пароль достаточно длинный") ```

Что выведет: print(len("Hello"))?

Индексация и срезы

Каждый символ в строке имеет **индекс** - номер позиции. **Важно:** индексация начинается с 0!

Индексация

Доступ к символам

```python word = "Python" # 012345 - индексы print(word[0]) # P - первый символ print(word[1]) # y - второй символ print(word[5]) # n - шестой символ print(word[-1]) # n - последний символ! print(word[-2]) # o - предпоследний ``` **Отрицательные индексы** считают с конца: -1 последний, -2 предпоследний и т.д.

Срезы (slices)

Извлечение подстроки

```python text = "Hello, World!" # string[start:end] - от start до end (не включая end) print(text[0:5]) # "Hello" print(text[7:12]) # "World" # Пропуск границ print(text[:5]) # "Hello" - от начала print(text[7:]) # "World!" - до конца print(text[:]) # Вся строка (копия) # Шаг (step) print(text[::2]) # "Hlo ol!" - каждый второй print(text[::-1]) # "!dlroW ,olleH" - реверс! ```

Первый символ строки имеет индекс 1

Первый символ имеет индекс 0

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

Что выведет: print("abcdef"[1:4])?

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

Строки можно складывать и умножать! Но не так, как числа.

Конкатенация (+)

Склеивание строк

```python first = "Hello" second = "World" result = first + " " + second print(result) # "Hello World" # Внимание: нельзя складывать строку с числом! age = 25 # print("Возраст: " + age) # Ошибка! print("Возраст: " + str(age)) # OK: "Возраст: 25" ```

Повторение (*)

Умножение строки на число

```python print("Ha" * 3) # "HaHaHa" print("-" * 20) # "--------------------" # Практика: чёткий вывод title = "= Меню =" print("=" * 20) print(title.center(20)) print("=" * 20) ```

Проверка вхождения (in)

Есть ли подстрока в строке?

```python email = "user@example.com" print("@" in email) # True print("gmail" in email) # False print("example" in email) # True # Практика: валидация email if "@" in email and "." in email: print("Похоже на email") ```

Что выведет: print("ab" * 2 + "c")?

Методы строк

Строки в Python имеют множество встроенных методов - функций, которые вызываются через точку.

МетодОписаниеПример
.upper()Все буквы заглавные"hello".upper() → "HELLO"
.lower()Все буквы строчные"HELLO".lower() → "hello"
.strip()Убрать пробелы по краям" hi ".strip() → "hi"
.replace(a, b)Заменить a на b"cat".replace("c", "b") → "bat"
.split()Разбить на список"a,b,c".split(",") → ["a","b","c"]
.join()Собрать из списка"-".join(["a","b"]) → "a-b"
.find(x)Найти позицию x"hello".find("l") → 2
.startswith(x)Начинается с x?"hello".startswith("he") → True
.endswith(x)Заканчивается на x?"hello".endswith("lo") → True

Методы в действии

Практические примеры

```python # Нормализация ввода user_input = " HELLO World " clean = user_input.strip().lower() print(clean) # "hello world" # Замена слов message = "Я люблю JavaScript" fixed = message.replace("JavaScript", "Python") print(fixed) # "Я люблю Python" # Парсинг данных data = "apple,banana,cherry" fruits = data.split(",") print(fruits) # ['apple', 'banana', 'cherry'] # Проверка расширения файла filename = "photo.jpg" if filename.endswith((".jpg", ".png", ".gif")): print("Это изображение") ```

**Строки неизменяемы!** Методы возвращают НОВУЮ строку, не меняют исходную. `s.upper()` не изменит s - нужно `s = s.upper()`.

Что выведет: print("a,b,c".split(","))?

Форматирование строк (f-strings)

**f-strings** (formatted string literals) - самый удобный способ вставить переменные в строку.

f-strings в действии

Современный способ форматирования

```python name = "Алиса" age = 25 # Старый способ (конкатенация) print("Привет, " + name + "! Тебе " + str(age) + " лет.") # Новый способ (f-string) - просто добавь f перед кавычками print(f"Привет, {name}! Тебе {age} лет.") # Можно вычислять выражения прямо внутри! print(f"Через 10 лет тебе будет {age + 10}") print(f"Имя в верхнем регистре: {name.upper()}") ```

Форматирование чисел

Красивый вывод

```python price = 1234.5678 print(f"Цена: {price}") # 1234.5678 print(f"Цена: {price:.2f}") # 1234.57 (2 знака после точки) print(f"Цена: {price:,.2f}") # 1,234.57 (с разделителем тысяч) # Процентное форматирование ratio = 0.756 print(f"Результат: {ratio:.1%}") # "Результат: 75.6%" # Выравнивание for item in ["Apple", "Banana", "Cherry"]: print(f"{item:>10}") # Выравнивание по правому краю ```

f-strings появились в Python 3.6 и стали стандартом. Они быстрее и читаемее, чем `.format()` или `%`-форматирование.

Что выведет: x = 5; print(f"x = {x * 2}")?

Связь с другими темами

Строки соединяются почти со всем дальнейшим:

  • Условные операторы — Сравнение строк, проверка вхождения, валидация ввода
  • Циклы — Перебор символов, поиск, парсинг текстовых данных
  • Массивы — Списки и строки делят похожий API: индексы, срезы, len
  • Функции — Утилиты для нормализации, парсинга и форматирования текста

Итог

  • Строка это последовательность символов, индексация с нуля, отрицательные индексы считают с конца
  • Срезы [start:end:step] возвращают новую подстроку, конечный индекс не включён
  • Конкатенация (+) и повторение (*) дают новые строки, складывать строку с числом нельзя без преобразования
  • Методы upper, lower, strip, split, join, replace, find, startswith, endswith покрывают 80 процентов задач
  • Строки неизменяемы (immutable): любой метод возвращает новую строку, исходная не меняется
  • f-строки (Python 3.6+) самый быстрый и читаемый способ форматирования, выражения внутри {} вычисляются

Связанные уроки

  • prog-04-operators — Операторы вроде + лежат в основе конкатенации строк
  • prog-11-arrays — Строка по сути это массив символов
  • prog-07-loops — Перебор символов требует циклов по строке
  • nlp-01 — Обработка текста строится прямо на строковых операциях
  • crypto-08-substitution-ciphers — Классические шифры преобразуют строки посимвольно
  • alg-01-big-o
Строки

0

1

Войти