ТЕОРИЯ И ПРАКТИКА

  • Ввод и вывод данных
    • Задачи
  • Условия
    • Задачи
  • Цикл for
    • Задачи
  • Строки
    • Задачи
  • Цикл while
    • Задачи
  • Списки
    • Задачи
  • Двумерные массивы
    • Задачи
  • Словари
    • Задачи
  • Множества
    • Задачи
  • Функции и рекурсия
    • Задачи

Занятие 3. цикл for в питоне

Цикл for в Python для перебора

Цикл for в Python: определение

Цикл for — это одна из фундаментальных управляющих конструкций в Python. Он предназначен для итерации (или последовательного перебора) элементов в любом итерируемом объекте, таком как списки, строки, словари или диапазоны чисел. Проще говоря, цикл for берет коллекцию элементов и выполняет блок кода для каждого из этих элементов по очереди.

Назначение и области применения

Основное назначение цикла for — автоматизация повторяющихся задач. Вместо того чтобы писать один и тот же код много раз для разных элементов, вы пишете его один раз внутри цикла, и Python сам применяет его ко всей коллекции.

Области применения безграничны:

  • Обработка каждого файла в папке.
  • Чтение каждой строки из текстового файла.
  • Выполнение математических операций над каждым числом в списке.
  • Проверка каждого пользователя в базе данных на соответствие какому-либо условию.

Общая структура цикла for

Циклы for и in в Python

Синтаксис цикла for прост и интуитивно понятен. Он всегда использует ключевые слова for и in.

for временная_переменная in итерируемый_объект:
# Блок кода, который будет выполняться для каждого элемента
                        
  • for: Ключевое слово, начинающее цикл.
  • временная_переменная: Имя, которое вы придумываете. В каждой итерации (повторении) цикла этой переменной будет присваиваться очередной элемент из итерируемого_объекта. Например, если мы перебираем список [10, 20, 30], эта переменная сначала будет равна 10, потом 20, а затем 30.
  • in: Ключевое слово, которое связывает временную переменную с коллекцией.
  • итерируемый_объект: Коллекция элементов для перебора (например, список, строка).
  • :: Двоеточие обязательно в конце строки, оно сообщает Python, что дальше пойдет блок кода, относящийся к циклу.

Блок кода в цикле

Весь код, который должен выполняться внутри цикла, обязательно должен иметь отступ (обычно 4 пробела). Именно отступ показывает Python, какие команды относятся к циклу, а какие — нет. Как только отступ заканчивается, цикл считается завершенным.

Итерация по различным коллекциям

Цикл for универсален и может работать с разными типами коллекций данных в Python.

Итерация по спискам

Списки (lists) — один из самых частых объектов для перебора. Цикл for последовательно пройдет по каждому элементу списка от начала до конца.

Пример со списком чисел

Предположим, у нас есть список оценок, и мы хотим напечатать каждую из них.

grades = [5, 4, 5, 3, 4, 5]
print("Оценки ученика:")
for grade in grades:
    # Переменная 'grade' на каждой итерации будет принимать новое значение из списка
    print(grade)
print("Перебор оценок завершен.")
                        

Итерация по строкам

Строка (string) в Python — это тоже итерируемый объект. Она рассматривается как последовательность символов.

Особенности перебора символов

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

message = "Привет, мир!"
for char in message:
    # Переменная 'char' (от character - символ) будет содержать по одному символу на каждой итерации
    print(char)
                        

Итерация по словарям

Словари (dictionaries) хранят данные в виде пар «ключ:значение». По умолчанию итерация по словарю происходит по его ключам.

user_info = {
    "name": "Алексей",
    "age": 30,
    "city": "Москва"
}

print("Перебор по ключам (поведение по умолчанию):")
for key in user_info:
    # 'key' будет принимать значения "name", "age", "city"
    print(key) 
                        

Итерация по значениям словаря

Если вам нужны только значения, используйте метод .values().

print("\nПеребор по значениям:")
for value in user_info.values():
    # 'value' будет принимать значения "Алексей", 30, "Москва"
    print(value)
                        

Итерация по ключам и парам ключ-значение (дополнительно)

Для одновременного получения и ключа, и значения используйте метод .items(). Это самый удобный способ перебора словарей.

print("\nПеребор по парам ключ-значение:")
for key, value in user_info.items():
    # Мы сразу получаем и ключ, и значение в две разные переменные
    print(f"Ключ: {key}, Значение: {value}")
                        

Функция range(): генерация числовых последовательностей

Назначение и описание функции

Часто бывает нужно выполнить цикл определенное количество раз, не привязываясь к конкретной коллекции. Для этого существует встроенная функция range(). Она создает специальный объект, который генерирует последовательность целых чисел "на лету", не храня их все в памяти.

Параметры функции range(start, stop, step)

Функция range() может принимать от одного до трех аргументов:

  • range(stop): Генерирует числа от 0 до stop - 1.
  • range(start, stop): Генерирует числа от start до stop - 1.
  • range(start, stop, step): Генерирует числа от start до stop - 1 с шагом step.

Важно: Верхняя граница (stop) никогда не включается в последовательность!

Итерация по числовым последовательностям с range()

Комбинация for и range() — это классический способ организовать цикл с заданным числом повторений.

Пример простой итерации по range()

Выполним блок кода 5 раз.

# range(5) сгенерирует последовательность 0, 1, 2, 3, 4
for i in range(5):
    print(f"Повторение номер {i}")
                        

Инкремент и декремент

Понятие инкремента и декремента

Инкремент — увеличение значения

Инкремент — это операция увеличения числовой переменной на определенную величину (чаще всего на 1).

Декремент — уменьшение значения

Декремент — это обратная операция, уменьшение числовой переменной.

Инкремент переменной в Python

Отсутствие оператора ++

В отличие от таких языков, как C++ или Java, в Python нет операторов инкремента ++ и декремента --. Попытка их использовать вызовет синтаксическую ошибку.

Использование оператора +=

Для инкремента используется оператор сложения с присваиванием +=. Запись \[ x += 1 \] является краткой формой для \[ x = x + 1 \].

Пример увеличения переменной на 1

Давайте посчитаем, сколько всего денег мы накопим, откладывая по 1 монете 10 раз.

wallet = 0 # Начальное количество монет
for i in range(10):
    # Увеличиваем значение переменной wallet на 1
    wallet += 1
    print(f"День {i+1}: в кошельке {wallet} монет")
                        

Декремент переменной в Python

Использование оператора -=

Для декремента используется оператор вычитания с присваиванием -=. Запись \[ x -= 1 \] является краткой формой для \[ x = x - 1 \].

Пример уменьшения переменной на 1

Обратный отсчет перед запуском ракеты.

timer = 10
print("Начинаем обратный отсчет!")
while timer > 0:
    print(timer)
    # Уменьшаем таймер на 1
    timer -= 1
print("Пуск!")
                        

Использование инкремента и декремента с другими операторами

*Операторы математические , если

Операторы += и -= — это часть семейства "операторов присваивания с операцией". Существуют также *=, /=, %= и другие. Их можно использовать внутри условных конструкций (if).

Примеры применения с разными операторами

Подсчитаем сумму только четных чисел от 1 до 10.

total_sum = 0
for number in range(1, 11): # Числа от 1 до 10
    # Проверяем, является ли число четным
    if number % 2 == 0:
        print(f"Нашли четное число: {number}. Добавляем к сумме.")
        # Инкрементируем сумму только если условие выполнено
        total_sum += number

print(f"Итоговая сумма четных чисел: {total_sum}") # 2 + 4 + 6 + 8 + 10 = 30
                        

Использование переменных вместо чисел для инкремента

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

account = 100
deposits = [10, 50, 25, 15] # Список пополнений

for deposit_amount in deposits:
    # Увеличиваем счет на сумму из списка
    # \[ account += deposit_amount \]
    account += deposit_amount
    print(f"Счет пополнен на {deposit_amount}. Текущий баланс: {account}")
                        

Итерация с указанием начального значения и шага

Объяснение параметров start, stop, step в range()

Мы можем полностью контролировать последовательность, генерируемую range(), используя все три параметра:

  • start: Первое число в последовательности.
  • stop: Граница, до которой идет генерация (не включая саму границу).
  • step: Шаг, с которым изменяется число на каждой итрации.

Пример итерации с шагом +2

Выведем все четные числа от 2 до 10 включительно.

# Начинаем с 2, идем до 11 (чтобы 10 вошло), с шагом 2
for number in range(2, 11, 2):
    print(number)
                        

Особенности использования отрицательного шага (декремента) — опционально

Если шаг (step) отрицательный, цикл пойдет в обратном порядке. В этом случае значение start должно быть больше значения stop.

print("Обратный отсчет с шагом -3:")
# Начинаем с 10, идем до 0 (не включая), с шагом -3
# Последовательность: 10, 7, 4, 1
for i in range(10, 0, -3):
    print(i)
                        

Управление циклом for

Иногда нам нужно изменить стандартное поведение цикла: прервать его досрочно или пропустить текущую итерацию.

Оператор break в Python циклах for

Назначение — досрочный выход из цикла

Оператор break немедленно и полностью прекращает выполнение цикла. Код переходит к первой строке после блока цикла.

Пример использования break

Ищем первое число в списке, которое делится на 7. Как только находим — останавливаем поиск.

numbers = [12, 45, 23, 49, 16, 56, 8]
found_number = None

for num in numbers:
    print(f"Проверяем число {num}...")
    if num % 7 == 0:
        found_number = num
        print(f"Найдено число, которое делится на 7: {num}. Прерываем цикл.")
        break # Выходим из цикла

if found_number:
    print(f"Первое найденное число: {found_number}")
                        

Оператор continue Python контроль цикла

Пропуск оставшейся части кода в текущей итерации

Переход к следующей итерации

Оператор continue прерывает только текущую итерацию. Он пропускает весь оставшийся код внутри блока цикла для текущего элемента и немедленно переходит к следующему элементу в последовательности.

Пример использования continue

Обработаем список, но проигнорируем все отрицательные числа.

data = [10, -5, 20, 0, -15, 30]
processed_data = []

for item in data:
    if item < 0:
        print(f"Встретилось отрицательное число {item}. Пропускаем.")
        continue # Переходим к следующему элементу, не выполняя код ниже
    
    print(f"Обрабатываем число {item}.")
    processed_data.append(item)

print(f"Обработанные данные (только положительные): {processed_data}")
                        

Блок else в цикле for

Когда выполняется блок else

В Python у циклов forwhile) есть уникальная особенность — блок else. Код в этом блоке выполняется только в том случае, если цикл завершился естественным образом, то есть прошел все итерации и не был прерван оператором break.

Пример цикла с else без прерываний break

Проверяем, есть ли в списке покупок "молоко". В данном примере его нет, цикл завершится до конца.

shopping_list = ["хлеб", "яйца", "сыр"]
for item in shopping_list:
    print(f"Проверяем: {item}")
    if item == "молоко":
        print("Молоко найдено!")
        break
else:
    # Этот блок выполнится, так как break не был вызван
    print("Цикл завершился, но молоко так и не было найдено в списке.")
                        

Поведение else при использовании break — не выполняется

Теперь добавим "молоко" в список. Цикл будет прерван, и блок else не выполнится.

shopping_list = ["хлеб", "молоко", "яйца", "сыр"]
for item in shopping_list:
    print(f"Проверяем: {item}")
    if item == "молоко":
        print("Молоко найдено!")
        break # Прерываем цикл
else:
    # Этот блок НЕ выполнится
    print("Цикл завершился, но молоко так и не было найдено в списке.")
                        

Дополнительные примечания и советы

Вложенные циклы for — упоминание (опционально)

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

# Пример таблицы умножения
for i in range(1, 4): # Внешний цикл (строки)
    for j in range(1, 4): # Внутренний цикл (столбцы)
        print(f"{i} * {j} = {i*j}", end="\t") # end="\t" для вывода в одну строку с табуляцией
    print() # Переход на новую строку после завершения внутреннего цикла
                        

Использование циклов for с функциями и генераторами (опционально)

Циклы for прекрасно работают с функциями, которые возвращают итерируемые объекты. Особый вид функций — генераторы (использующие yield) — создают значения по одному за раз, что идеально подходит для обработки больших объемов данных в цикле for без затрат памяти.

Практические советы для эффективного использования циклов

  1. Давайте осмысленные имена переменным. Вместо for i in list1: пишите for user in users: или for product in products:. Код становится намного читабельнее.
  2. Не изменяйте коллекцию, по которой итерируетесь. Добавление или удаление элементов из списка во время его перебора может привести к непредсказуемому поведению и ошибкам. Лучше создайте новый список для результатов.
  3. Держите тело цикла коротким. Если блок кода внутри цикла становится слишком большим и сложным, вынесите его логику в отдельную функцию. Это улучшит читаемость и позволит повторно использовать код.