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

⚡ Минимальный рабочий пример

for i in range(1, 6):
    print(i)
# 1
# 2
# 3
# 4
# 5
КонструкцияЧто делаетПример
range(start, stop, step)числовая последовательность, stop не включаетсяrange(1, 10, 2) → 1 3 5 7 9
break / continueпрервать цикл целиком / пропустить итерациюсм. пример 3
for ... else:else выполняется, только если не было breakсм. пример 3
list[start:stop:step]срез списка, не меняет исходныйnumbers[::-1] — разворот
enumerate(seq)пара (индекс, значение) на каждой итерацииfor i, v in enumerate(items):
Топ-3 ошибки: range(stop) не включает stop · путать break и continue · удалять элементы списка во время for item in list.

Пример 1. Перебор строки

Выводим каждый символ строки на отдельной строке — строка тоже итерируемый объект, как и список.

📄 examples/loop_over_string.py
text = "Python"
for letter in text:
    print(letter)
# P
# y
# t
# h
# o
# n

Пример 2. Разные варианты range

Демонстрация одного, двух и трёх аргументов, а также отрицательного шага.

📄 examples/range_demo.py
print("range(5):")
for i in range(5):
    print(i, end=" ")
print()

print("range(2, 6):")
for i in range(2, 6):
    print(i, end=" ")
print()

print("range(1, 10, 2):")
for i in range(1, 10, 2):
    print(i, end=" ")
print()

print("range(10, 0, -2):")
for i in range(10, 0, -2):
    print(i, end=" ")
print()
# range(5):
# 0 1 2 3 4
# range(2, 6):
# 2 3 4 5
# range(1, 10, 2):
# 1 3 5 7 9
# range(10, 0, -2):
# 10 8 6 4 2

Что происходит: с одним аргументом отсчёт всегда идёт от 0. С двумя — от первого числа до второго, не включая его. Третий аргумент задаёт шаг; отрицательный шаг требует, чтобы начало было больше конца.

Пример 3. break, continue, else

Ищем символ в строке и демонстрируем все три механизма управления циклом, включая отдельный случай, когда break не сработал.

📄 examples/break_continue_else.py
for letter in "Python":
    if letter == "h":
        break
    print(letter, end=" ")
else:
    print("Буква h не найдена")
print()

for letter in "Python":
    if letter == "h":
        continue
    print(letter, end=" ")
print()

for letter in "abc":
    if letter == "z":
        break
    print(letter, end=" ")
else:
    print("- цикл прошёл без break")
# P y t
# P y t o n
# a b c - цикл прошёл без break

Почему так: в первом цикле break сработал на «h», поэтому else пропущен (строка «Буква h не найдена» не печатается). В третьем цикле буквы «z» нет, break не сработал — else выполнился.

Пример 4. Вложенные циклы

Перебираем список слов и символы каждого слова: внутренний цикл выполняется полностью для каждой итерации внешнего.

📄 examples/nested_words.py
words = ["cat", "dog", "bird"]
for word in words:
    print(f"Word: {word}")
    for letter in word:
        print(letter, end=" ")
    print()
⚠️ Проверить по документации: f-strings используются для удобного форматирования строк; они выходят за рамки исходного занятия.

Пример 5. Создание списков и срезы

Список можно создать пустым, из строки, из range или перечислением элементов. Срез list[start:stop:step] возвращает новый список и не меняет исходный.

📄 examples/list_creation_slicing.py
empty = []
also_empty = list()
chars = list("python")
values = list(range(0, 10, 2))
print(empty, also_empty, chars, values)

numbers = [0, 1, 2, 3, 4, 5, 6]
print(numbers[1:4])    # [1, 2, 3]
print(numbers[::2])    # [0, 2, 4, 6]
print(numbers[::-1])   # [6, 5, 4, 3, 2, 1, 0]
print(numbers[-4:-1])  # [3, 4, 5]
# [] [] ['p', 'y', 't', 'h', 'o', 'n'] [0, 2, 4, 6, 8]
# [1, 2, 3]
# [0, 2, 4, 6]
# [6, 5, 4, 3, 2, 1, 0]
# [3, 4, 5]

Пример 6. Изменение списка: по индексу и по срезу

Список — изменяемая коллекция: элементы можно заменить по одному индексу или сразу диапазоном через срез.

📄 examples/list_modifying.py
items = ["apple", "banana", "cherry"]
items[1] = "blueberry"
print(items)  # ['apple', 'blueberry', 'cherry']

numbers = [10, 20, 30, 40, 50]
numbers[1:3] = [200, 300]
print(numbers)  # [10, 200, 300, 40, 50]

Что происходит: присваивание по индексу заменяет один элемент. Присваивание по срезу numbers[1:3] = [200, 300] заменяет сразу два элемента (индексы 1 и 2) на новые значения — при этом заменяющий список необязательно должен быть той же длины, что и срез.

Пример 7. Операции со списками

+ объединяет списки, * повторяет, in проверяет наличие элемента, len() считает длину.

📄 examples/list_operations.py
list1 = [1, 2, 3]
list2 = [4, 5, 6]
print(list1 + list2)  # [1, 2, 3, 4, 5, 6]

print([0] * 5)        # [0, 0, 0, 0, 0]

numbers = [1, 2, 3, 4, 5]
print(3 in numbers)   # True
print(6 in numbers)   # False
print(len(numbers))   # 5

Пример 8. Чётные и нечётные числа в диапазоне

Программа запрашивает диапазон и распределяет числа по двум спискам в зависимости от чётности.

📄 examples/even_odd_range.py
start = 1  # результат int(input("Введите начало диапазона: "))
end = 10  # результат int(input("Введите конец диапазона: "))

even = []
odd = []
for number in range(start, end + 1):
    if number % 2 == 0:
        even.append(number)
    else:
        odd.append(number)

print("Четные:", *even)
print("Нечетные:", *odd)
# Четные: 2 4 6 8 10
# Нечетные: 1 3 5 7 9
⚠️ Проверить по документации: распаковка аргументов (*even) и f-strings выходят за рамки исходного занятия.

Пример 9. enumerate(): индекс и значение вместе

Современная замена ручному счётчику: enumerate() отдаёт пару (индекс, элемент) на каждой итерации.

📄 examples/modern_enumerate.py
fruits = ["apple", "banana", "cherry"]
for index, fruit in enumerate(fruits):
    print(f"{index}: {fruit}")
# 0: apple
# 1: banana
# 2: cherry
⚠️ Проверить по документации: enumerate() выходит за рамки исходного занятия — подробности см. в официальной документации Python.

Пример 10. List comprehension: короткая запись фильтра

Списковое включение (list comprehension) собирает новый список из существующей последовательности в одну строку — то же самое, что цикл for с append, но компактнее.

📄 examples/modern_comprehension.py
numbers = [1, 2, 3, 4, 5, 6]
even_numbers = [n for n in numbers if n % 2 == 0]
print(even_numbers)  # [2, 4, 6]

# то же самое обычным циклом
even_numbers_loop = []
for n in numbers:
    if n % 2 == 0:
        even_numbers_loop.append(n)
print(even_numbers_loop == even_numbers)  # True
⚠️ Проверить по документации: list comprehensions выходят за рамки исходного занятия — подробности см. в официальной документации Python.

Пример 11. Изменяемость: список можно менять, строку — нет

Список — изменяемый тип: элемент можно заменить по индексу. Строка — неизменяемый тип: попытка присвоить символу по индексу вызывает ошибку.

📄 examples/mutable_demo.py
numbers = [1, 2, 3]
numbers[0] = 100
print(numbers)  # [100, 2, 3]

text = "hello"
try:
    text[0] = "H"
except TypeError as error:
    print(f"Ошибка: {error}")
# Ошибка: 'str' object does not support item assignment

Пример 12. Ловушка: изменение списка во время итерации

Удаление элементов из списка прямо во время цикла for — частая ошибка: индексы сдвигаются, и часть элементов пропускается незаметно, без ошибки.

📄 examples/mutate_while_iterating.py
tasks = ["done", "done", "draft"]
for task in tasks:
    if task == "done":
        tasks.remove(task)
print("После некорректного удаления:", tasks)
# После некорректного удаления: ['done', 'draft']

# правильный способ: собрать новый список, не трогая исходный во время обхода
tasks = ["done", "done", "draft"]
tasks_left = [task for task in tasks if task != "done"]
print("Через генератор списка (правильно):", tasks_left)
# Через генератор списка (правильно): ['draft']

Почему так: после удаления первого "done" (индекс 0) второй "done" сдвигается на его место (индекс 0), но цикл уже перешёл к индексу 1 — второй "done" «прячется» от прохода и остаётся в списке. Список comprehension решает проблему: он строит новый список, не изменяя исходный во время обхода.

⚠️ Проверить по документации: эта ловушка не разбиралась на исходном занятии — добавлена как важное дополнение к теме циклов и списков.

Как запустить в VS Code

  1. Создайте файл example.py в папке урока.
  2. Скопируйте код из примера выше.
  3. Откройте терминал в VS Code (Ctrl + `).
  4. Активируйте виртуальное окружение: venv\Scriptsctivate (Windows) или source venv/bin/activate (Mac/Linux).
  5. Запустите: python example.py