Пример 1. Перебор строки
Выводим каждый символ строки на отдельной строке — строка тоже итерируемый объект, как и список.
text = "Python"
for letter in text:
print(letter)
# P
# y
# t
# h
# o
# n
Пример 2. Разные варианты range
Демонстрация одного, двух и трёх аргументов, а также отрицательного шага.
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 не сработал.
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. Вложенные циклы
Перебираем список слов и символы каждого слова: внутренний цикл выполняется полностью для каждой итерации внешнего.
words = ["cat", "dog", "bird"]
for word in words:
print(f"Word: {word}")
for letter in word:
print(letter, end=" ")
print()
Пример 5. Создание списков и срезы
Список можно создать пустым, из строки, из range или перечислением элементов. Срез list[start:stop:step] возвращает новый список и не меняет исходный.
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. Изменение списка: по индексу и по срезу
Список — изменяемая коллекция: элементы можно заменить по одному индексу или сразу диапазоном через срез.
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() считает длину.
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. Чётные и нечётные числа в диапазоне
Программа запрашивает диапазон и распределяет числа по двум спискам в зависимости от чётности.
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() отдаёт пару (индекс, элемент) на каждой итерации.
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, но компактнее.
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
Пример 11. Изменяемость: список можно менять, строку — нет
Список — изменяемый тип: элемент можно заменить по индексу. Строка — неизменяемый тип: попытка присвоить символу по индексу вызывает ошибку.
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 — частая ошибка: индексы сдвигаются, и часть элементов пропускается незаметно, без ошибки.
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
- Создайте файл
example.pyв папке урока. - Скопируйте код из примера выше.
- Откройте терминал в VS Code (Ctrl + `).
- Активируйте виртуальное окружение:
venv\Scriptsctivate(Windows) илиsource venv/bin/activate(Mac/Linux). - Запустите:
python example.py