Основы программирования
Строки
**Загадка:** Как получить из строки "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