Python - Вложенные циклы

Привет, молодые программисты! Сегодня мы погружаемся в увлекательный мир вложенных циклов в Python. Как ваш добрый сосед-компьютерный учитель, я рад вести вас через это путешествие. Поверьте мне, к концу этого урока вы будете циклиться как профи!

Python - Nested Loops

Что такое вложенные циклы?

Перед тем как попрыгать в глубокую воду, начнем с основ. Представьте себе, что вы упорядочиваете свою гардеробную шкафу. Вы проходите по каждой полке (это один цикл), и для каждой полки вы сортируете все вещи на ней (это еще один цикл внутри первого). Вот исключительно что такое вложенные циклы в программировании - циклы внутри циклов!

Вложенный цикл for в Python

Начнем с цикла for, который является как надежный старый друг в мире Python.

Основная структура

Вот общая структура вложенного цикла for:

for внешняя_переменная in внешняя_последовательность:
# Тело внешнего цикла
for внутренняя_переменная in внутренняя_последовательность:
# Тело внутреннего цикла

Простой пример: Матрица умножения

Создадим простую матрицу умножения, чтобы лучше понять это:

for i in range(1, 6):
for j in range(1, 6):
print(f"{i} x {j} = {i*j}", end="\t")
print()  # Переход на новую строку после каждого ряда

Этот код выведет:

1 x 1 = 1    1 x 2 = 2    1 x 3 = 3    1 x 4 = 4    1 x 5 = 5
2 x 1 = 2    2 x 2 = 4    2 x 3 = 6    2 x 4 = 8    2 x 5 = 10
3 x 1 = 3    3 x 2 = 6    3 x 3 = 9    3 x 4 = 12   3 x 5 = 15
4 x 1 = 4    4 x 2 = 8    4 x 3 = 12   4 x 4 = 16   4 x 5 = 20
5 x 1 = 5    5 x 2 = 10   5 x 3 = 15   5 x 4 = 20   5 x 5 = 25

Разберем это:

  1. Внешний цикл (for i in range(1, 6)) выполняется 5 раз, представляя строки.
  2. Для каждой итерации внешнего цикла внутренний цикл (for j in range(1, 6)) выполняется 5 раз, представляя столбцы.
  3. Мы выводим каждый результат умножения, используя end="\t", чтобы добавить табуляцию вместо новой строки.
  4. После каждого ряда (итерации внешнего цикла) мы выводим пустую строку, чтобы перейти к следующему ряду.

Пример из реальной жизни: Планировка мест

Представьте себе, что вы учитель (как я!) и распределяете места для класса. Создадим схему распределения мест:

студенты = ["Алиса", "Боб", "Чарли", "Давид", "Ева"]
рядов = 3
мест_в_ряду = 2

номер_места = 0
for ряд in range(1, рядов + 1):
print(f"Ряд {ряд}:")
for место in range(1, мест_в_ряду + 1):
if номер_места < len(студенты):
print(f"  Место {место}: {студенты[номер_места]}")
номер_места += 1
else:
print(f"  Место {место}: Пустое")
print()  # Пустая строка между рядами

Это выведет:

Ряд 1:
Место 1: Алиса
Место 2: Боб

Ряд 2:
Место 1: Чарли
Место 2: Давид

Ряд 3:
Место 1: Ева
Место 2: Пустое

В этом примере:

  1. Внешний цикл итерируется по каждому ряду.
  2. Внутренний цикл назначает студентов местам в каждом ряду.
  3. Мы используем переменную номер_места, чтобы отслеживать, какого студента мы назначаем следующим.
  4. Если студентов не хватает, оставшиеся места помечаются как "Пустое".

Вложенный цикл while в Python

Теперь познакомимся с двоюродным братом цикла while - вложенным циклом while. Это как сторожевой, который постоянно проверяет условие.

Основная структура

Вот как обычно выглядит вложенный цикл while:

while внешнее_условие:
# Тело внешнего цикла
while внутреннее_условие:
# Тело внутреннего цикла

Пример: Числовая пирамида

Создадим числовую пирамиду, чтобы увидеть вложенные циклы while в действии:

ряд = 1
while ряд <= 5:
столбец = 1
while столбец <= ряд:
print(столбец, end=" ")
столбец += 1
print()  # Переход на новую строку
ряд += 1

Это выведет:

1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

Разберем это:

  1. Внешний цикл while контролирует количество рядов (от 1 до 5).
  2. Для каждого ряда внутренний цикл while выводит числа от 1 до текущего номера ряда.
  3. Мы увеличиваем столбец внутри внутреннего цикла и ряд внутри внешнего цикла.

Пример из реальной жизни: Проверка запасов

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

запасы = {
"яблоки": 50,
"бананы": 30,
"апельсины": 40
}

дни = 1
while дни <= 3:  # Проверка на 3 дня
print(f"День {дни} Проверка запасов:")
for фрукт, количество in запасы.items():
while количество > 0:
print(f"Проверка {фрукт}...")
количество -= 10  # Симуляция продажи 10 единиц каждая проверка
if количество <= 20:
print(f"Оповещение о низком уровне {фрукт}! Осталось только {количество}.")
break  # Прекратить проверку этого фрукта, если запасы низкие
запасы[фрукт] = количество  # Обновление запасов
print(f"Конец дня {дни} Запасы: {запасы}\n")
дни += 1

Это выведет что-то вроде:

День 1 Проверка запасов:
Проверка яблок...
Проверка яблок...
Проверка яблок...
Оповещение о низком уровне яблок! Осталось только 20.
Проверка бананов...
Оповещение о низком уровне бананов! Осталось только 20.
Проверка апельсинов...
Проверка апельсинов...
Оповещение о низком уровне апельсинов! Осталось только 20.
Конец дня 1 Запасы: {'яблоки': 20, 'бананы': 20, 'апельсины': 20}

День 2 Проверка запасов:
Проверка яблок...
Оповещение о низком уровне яблок! Осталось только 10.
Проверка бананов...
Оповещение о низком уровне бананов! Осталось только 10.
Проверка апельсинов...
Оповещение о низком уровне апельсинов! Осталось только 10.
Конец дня 2 Запасы: {'яблоки': 10, 'бананы': 10, 'апельсины': 10}

День 3 Проверка запасов:
Проверка яблок...
Оповещение о низком уровне яблок! Осталось только 0.
Проверка бананов...
Оповещение о низком уровне бананов! Осталось только 0.
Проверка апельсинов...
Оповещение о низком уровне апельсинов! Осталось только 0.
Конец дня 3 Запасы: {'яблоки': 0, 'бананы': 0, 'апельсины': 0}

В этом примере:

  1. Внешний цикл while симулирует проверку запасов на 3 дня.
  2. Мы используем цикл for, чтобы перебрать каждый фрукт в запасах.
  3. Внутренний цикл while симулирует проверку и продажу каждого фрукта до тех пор, пока запасы не станут низкими или не исчерпаны.
  4. Мы используем break, чтобы прекратить проверку фрукта, если его количество снижается до 20 или ниже.

Заключение

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

Как и с любым программным концептом, практика - это ключ к успеху. Попробуйте создать свои собственные сценарии с вложенными циклами - возможно, это шахматная доска или еженедельный расписание школы. Возможности безграничны!

Продолжайте программировать, учиться и, что самое важное, радуйтесь этим процессом! До встречи в следующий раз, это ваш добрый сосед-компьютерный учитель подписывается. Счастливого циклотирования!

Credits: Image by storyset