📖 Теория: повторение циклов и строк

⚡ Кратко

Урок повторяет три темы: цикл while, модуль random и базовые операции со строками. Важно держать в голове связку между ними: циклы часто обрабатывают строки посимвольно, а random добавляет непредсказуемость.

  • while с предусловием, break/continue, бесконечные циклы и while/else.
  • random.random(), randint(), randrange() для генерации чисел.
  • Строки неизменяемы; индексация с 0, отрицательные индексы, срезы s[start:end:step].
  • ord()/chr(), кодировки ASCII/UTF-8, сравнение строк, in/not in.

1. Цикл while

Цикл — конструкция, которая повторяет блок кода. Одно выполнение тела называется итерацией. Цикл while — цикл с предусловием: тело выполняется, пока условие истинно.

📄 examples/counter.py
i = 1
while i <= 5:
    print(i)
    i += 1
# Output: 1 2 3 4 5

Ключевые части: инициализация переменной, условие, тело цикла и обновление переменной. Если обновление забыть, цикл станет бесконечным.

Операторы break и continue

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

📄 examples/break_demo.py
i = 1
while i <= 10:
    print(i)
    if i == 5:
        break
    i += 1
# Output: 1 2 3 4 5

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

📄 examples/continue_demo.py
i = 0
while i < 5:
    i += 1
    if i % 2 == 0:
        continue
    print(i)
# Output: 1 3 5

Бесконечный цикл

Явный бесконечный цикл while True: полезен, когда число итераций заранее неизвестно. Единственный способ выйти — оператор break.

📄 examples/controlled_infinite.py
while True:
    user_input = input("Enter 'stop' to finish: ")
    if user_input == "stop":
        print("Loop finished.")
        break
    print(f"Echo: {user_input}")

Конструкция while/else

Блок else после while выполняется, только если цикл завершился естественным образом — то есть условие стало ложным. При выходе через break блок else пропускается.

📄 examples/while_else.py
i = 1
while i <= 3:
    print(i)
    i += 1
else:
    print("Loop completed without break.")
# Output: 1 2 3
#         Loop completed without break.

2. Модуль random

Модуль random входит в стандартную библиотеку и генерирует псевдослучайные числа. Основные функции:

  • random.random() — float от 0.0 до 1.0 (не включая 1.0).
  • random.randint(a, b) — целое от a до b включительно.
  • random.randrange(start, stop, step) — случайный элемент диапазона, как в range.
📄 examples/random_basics.py
import random

print(random.random())              # e.g. 0.3744
print(random.randint(1, 10))        # e.g. 7
print(random.randrange(1, 10))      # e.g. 8 (1..9)
print(random.randrange(1, 10, 2))   # e.g. 5 (odd numbers)

random часто используют в играх, симуляциях, тестовых данных и перемешивании последовательностей. Для криптографически стойкой случайности используйте модуль secrets.

3. Базовые операции со строками

Неизменяемость строк

Строки в Python — неизменяемые (immutable) объекты. «Изменить» строку можно только создав новую и присвоив её переменной.

📄 examples/string_immutable.py
s = "Hello"
s = s + " world!"
print(s)  # Hello world!

Кодировки: ASCII, Unicode, UTF-8

Кодировка — способ преобразования символов в числа. ASCII кодирует 128 символов (0–127) одним байтом. Unicode присваивает каждому символу уникальный код. UTF-8 — представление Unicode переменной длиной: ASCII-символы занимают 1 байт, кириллица — 2 байта, многие иероглифы — 3 байта, редкие символы и эмодзи — 4 байта.

📄 examples/encoding.py
text = "Python"
encoded = text.encode("utf-8")
print(encoded)              # b'Python'
print(encoded.decode("utf-8"))  # Python

ord() и chr()

ord(char) возвращает код Unicode символа, а chr(code) — символ по коду.

📄 examples/ord_chr.py
print(ord("A"))   # 65
print(ord("a"))   # 97
print(chr(65))    # A
print(chr(97))    # a

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

Строки сравниваются лексикографически, символ за символом, по кодам Unicode. Заглавные буквы имеют меньшие коды, чем строчные, поэтому "Apple" < "apple".

📄 examples/string_compare.py
print("apple" == "apple")   # True
print("apple" < "banana")   # True
print("apple" > "Apple")    # True ('a' > 'A')

len() и индексация

Функция len(s) возвращает длину строки. Индексы начинаются с 0. Отрицательные индексы отсчитываются с конца: -1 — последний символ. Обращение к несуществующему индексу вызывает IndexError.

📄 examples/indexing.py
text = "Python"
print(len(text))   # 6
print(text[0])     # P
print(text[-1])    # n

index = 5
if index < len(text):
    print(text[index])
else:
    print("Index out of range!")

Срезы

Срез s[start:end:step] возвращает подстроку. start включается, end — нет. Если индекс опущен, берётся начало или конец строки. Отрицательный step идёт в обратном направлении.

📄 examples/slicing.py
text = "Python programming"
print(text[0:6])     # Python
print(text[7:])      # programming
print(text[::-1])    # gnimmargorp nohtyP
print(text[-4:-11:-1])  # gimmarg

Оператор in

Оператор in проверяет, содержится ли подстрока в строке. В комбинации с not — проверяет отсутствие.

📄 examples/membership.py
text = "Python programming"
print("Python" in text)    # True
print("Java" not in text)  # True
Проверить по документации: повторите разделы Python Tutorial о while, random и строках, чтобы увидеть полный список строковых методов.