Циклы

Содержание:

  1. Что такое циклы?
  2. Цикл for
  3. Цикл while
  4. Ключевые операторы в циклах break, continue
  5. Циклы foreach и switch
  6. Вложенные циклы
  7. Обработка ошибок в циклах try...except.
  8. Циклы и производительность
  9. Практика

Что такое циклы?

Что такое циклы?

Note

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

Зачем нужны циклы?

Note

1️⃣

Снижение объёма кода: Вместо копирования одинаковых строк кода, цикл позволяет их повторить в нужном количестве итераций.

Пример: Вывести числа от 1 до 100 проще с циклом, чем писать 100 строк print().

Note

2️⃣

Гибкость: Циклы могут выполнять действия на основе условий или содержимого структур данных.

Пример: Обработать все элементы списка или проверить значения в словаре.

Note

3️⃣

Автоматизация: Циклы позволяют автоматизировать задачи, такие как обработка файлов, запрос данных с API или выполнение операций над большими наборами данных.

Note

4️⃣

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


Введение в автоматизацию повторяющихся действий

Пример из жизни:

Note

Представьте, что вы хотите раздать флаеры на улице каждому прохожему. Если вы будете дублировать каждое движение вручную, это займет кучу времени. С циклом вы могли бы сказать: «Каждому прохожему, пока у меня есть флаеры, выдавать один». Цикл будет повторять это действие, пока не закончатся прохожие или флаеры.


Циклы в Python

Python поддерживает два основных типа циклов:

  1. Цикл for: Для работы с известными наборами данных, например, списками, строками или диапазонами чисел.
  2. Цикл while: Для выполнения действий, пока выполняется определённое условие.

Пример 1: Цикл for

 
numbers = [1, 2, 3, 4, 5]
for number in numbers:
    print("Число:", number)
 

Пример 2: Цикл while

 
count = 5
while count > 0:
    print("Счётчик:", count)
    count -= 1
 

Цикл for

Note

Цикл for в Python используется для итерации по элементам последовательности, такой как список, строка, кортеж, словарь, множество или объект, поддерживающий итерацию.

1. Итерация по последовательности

Note

Что такое итерация? Итерация — это последовательный проход по элементам структуры данных. Например, проход по списку чисел или буквам в строке.

Структуры данных, по которым мы итерируемся, разбирали в 02.04 - Коллекции данных.

Последовательности, по которым можно итерироваться:

  • Список: [1, 2, 3]
  • Строка: "Python"
  • Словарь (dict): {"a": 1, "b": 2}
  • Множество (set): {1, 2, 3}
  • Диапазон (range) for i in range(5): print(i) # Вывод: 0, 1, 2, 3, 4

2. Примеры использования

Пример 1: Итерация по списку

fruits = ["яблоко", "банан", "вишня"]
for fruit in fruits:
    print("Фрукт:", fruit)

Вывод:

Фрукт: яблоко
Фрукт: банан
Фрукт: вишня

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

word = "Python"
for letter in word:
    print("Буква:", letter)

Вывод:

Буква: P
Буква: y
Буква: t
Буква: h
Буква: o
Буква: n

Пример 3: Итерация по словарю

student_grades = {"Аня": 85, "Борис": 90, "Вика": 75}
for student, grade in student_grades.items():
    print(student, "получил(а)", grade)

Вывод:

Аня получил(а) 85
Борис получил(а) 90
Вика получил(а) 75

Пример 4: Итерация по множеству

unique_numbers = {10, 20, 30}
for number in unique_numbers:
    print("Число из множества:", number)

🧪 Практика:

Example

Создаем в папке Data types свой файлик Cycles

  1. Итерация по списку: Напишите цикл, который выводит все элементы списка чисел [10, 20, 30, 40, 50].
  2. Итерация по строке: Напишите цикл, который выводит каждый символ строки "Hello, Python!".
  3. Работа со словарём: Создайте словарь с именами друзей и их возрастами. Напишите цикл, который выводит имя друга и его возраст.

Заключение по циклу for

Warning

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


Цикл while

Note

Цикл while — это условный цикл, который выполняет блок кода до тех пор, пока указанное условие истинно (True). Если условие становится ложным (False), выполнение цикла прекращается.

Что такое input в Python?

Note

input() — это встроенная функция Python, которая позволяет получать данные от пользователя во время выполнения программы. Она запрашивает ввод через консоль, останавливает выполнение программы, пока пользователь не введёт данные, и возвращает введённое значение в виде строки.

Как работает input?

  • При вызове input() в консоли появляется приглашение для ввода текста.
  • После того как пользователь нажимает Enter, введённые данные возвращаются как строка.

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

  • Простой ввод:

     
    name = input("Введите ваше имя: ")
    print("Привет,", name)
     
  • Пример ввода и вывода:

    
    Введите ваше имя: Артём
    Привет, Артём
    
    
  • Использование введённых данных:

     
    age = input("Сколько вам лет? ")
    print("Через 5 лет вам будет", int(age) + 5)
     
  • Пример ввода и вывода:

    Сколько вам лет? 20
    Через 5 лет вам будет 25
    
    

Обработка числовых данных:

Note

По умолчанию, input возвращает строку. Если нужно работать с числами, необходимо преобразовать тип:

 
number = int(input("Введите число: "))
print("Квадрат числа:", number ** 2)
 

Особенности input:

Note

  1. Возвращает строку: Всё, что вводит пользователь, возвращается в виде строки. Если вы ожидаете числа, нужно использовать преобразование типа, например, int() или float().

  2. Обработка ошибок: Если пользователь вводит некорректное значение для преобразования типов, программа выдаст ошибку. Это можно предотвратить, используя try...except:

     
    try:
        number = int(input("Введите число: "))
        print("Квадрат числа:", number ** 2)
    except ValueError:
        print("Ошибка: нужно вводить только числа!")
     
  3. Использование без параметра: Если вы вызовете input() без аргументов, пользователь увидит пустую строку для ввода.


Типичные ошибки и как их избежать

  • Ошибка при вводе числа:

     
    number = input("Введите число: ")
    print(number + 10)  # Ошибка: нельзя сложить строку и число
     

    Как исправить:

     
    number = int(input("Введите число: "))
    print(number + 10)
     
  • Забыли указать текст для подсказки: Если вы не добавите текстовое сообщение, пользователь может не понять, что требуется ввести.

     
    data = input()  # Неочевидно, что делать
     

Как работает цикл while

Структура:

while условие:
    # Блок кода
  • Условие проверяется перед каждой итерацией.
  • Если условие истинно, выполняется тело цикла.
  • Если условие ложно, цикл завершает работу.

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

Пример 1: Обратный отсчёт

countdown = 5
while countdown > 0:
    print("Обратный отсчёт:", countdown)
    countdown -= 1  # Уменьшаем значение
print("Поехали!")

Вывод:

Обратный отсчёт: 5
Обратный отсчёт: 4
Обратный отсчёт: 3
Обратный отсчёт: 2
Обратный отсчёт: 1
Поехали!

Пример 2: Запрос данных до выполнения условия

user_input = ""
while user_input != "да":
    user_input = input("Хотите выйти? (да/нет): ")
print("Вы вышли из программы.")

Пример работы:

Хотите выйти? (да/нет): нет
Хотите выйти? (да/нет): нет
Хотите выйти? (да/нет): да
Вы вышли из программы.

Пример 3: Бесконечный цикл

counter = 0
while True:
    print("Итерация:", counter)
    counter += 1
    if counter == 3:  # Завершаем бесконечный цикл
        break

Вывод:

Итерация: 0
Итерация: 1
Итерация: 2

🧪 Практика для новичков

Example

  • Обратный отсчёт:

    Создайте программу, которая выводит числа от 10 до 1 с шагом -1. После завершения цикла выведите сообщение “Цикл завершён!”.

  • Проверка пароля:

    Напишите цикл, который запрашивает у пользователя пароль, пока он не введёт правильный пароль "12345". После правильного ввода выведите “Доступ разрешён”.

  • Вывод нечётных чисел:

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


Заключение по циклу for while

Warning

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


Ключевые операторы в циклах break, continue

Они почти всегда работают в паре с условиями из 02.06 - If else.

Оператор break

Используется для досрочного завершения цикла, даже если условие ещё истинно.

for num in range(1, 10):
    if num == 5:
        break  # Завершение цикла
    print(num)

Вывод:

1
2
3
4

Example

Повторите эти операции и выведите в терминал результаты их выполнения


Оператор continue

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

for num in range(1, 10):
    if num == 5:
        continue  # Пропуск числа 5
    print(num)

Вывод:

1
2
3
4
6
7
8
9

Example

Повторите эти операции и выведите в терминал результаты их выполнения


Практика обработки строк

Итерирование по символам строки

Итерирование по строке позволяет обрабатывать каждый её символ.

text = "Python"
for char in text:
    print(char)

Вывод:

P
y
t
h
o
n

Example

Повторите эти операции и выведите в терминал результаты их выполнения


Пример: Подсчёт гласных

Напишите программу, которая подсчитывает количество гласных в строке.

text = "Hello, Python!"
vowels = "aeiouAEIOU"
count = 0
 
for char in text:
    if char in vowels:
        count += 1
 
print("Количество гласных:", count)

Вывод:

Количество гласных: 3

Example

Повторите эти операции и выведите в терминал результаты их выполнения


🧪 Практика

Example

  1. Напишите программу, которая находит первое число больше 50 в списке и завершает цикл (break).
  2. Создайте цикл, который пропускает все числа, кратные 3, из диапазона от 1 до 20 (continue).

Заключение по ключевым операторам

Warning

Операторы break и continue помогают гибко управлять выполнением циклов, а вложенные циклы открывают возможности для работы со сложными данными. Обработка строк через циклы позволяет решать задачи, связанные с текстом, от подсчёта символов до фильтрации.



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

Note

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

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

Что такое \t в Python?

Note

\t — это управляющий символ, который используется для добавления горизонтальной табуляции (табуляции вправо) в строку. Табуляция добавляет несколько пробелов, перемещая текст к следующей “табуляционной позиции”. Она полезна для форматирования текста, например, для создания таблиц в консоли.

Пример использования \t:

 
print("Название\tЦена\tКоличество")
print("Яблоко\t\t50\t\t10")
print("Банан\t\t30\t\t5")
 

Результат в консоли:


Название    Цена    Количество
Яблоко      50      10
Банан       30      5


Как работает \t?

  • Табуляция обычно перемещает текст вправо к следующей позиции, кратной определённому числу пробелов (например, 4 или 8 символов).
  • Количество пробелов, добавляемых \t, зависит от среды (консоли или текстового редактора).

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

1. Форматирование таблицы

 
print("Студент\t\tОценка")
print("Иванов\t\t5")
print("Петров\t\t4")
 

Результат:


Студент         Оценка
Иванов          5
Петров          4

2. Сравнение с пробелами

Выравнивание с \t:

 
print("Яблоко\t50\t10")
print("Банан\t30\t5")
 

Выравнивание с пробелами:

 
print("Яблоко    50    10")
print("Банан     30    5")
 

Преимущество \t: Использование табуляции делает код чище и форматирует текст автоматически.


Особенности и советы

  1. Не равномерное форматирование: Если длина текста перед \t сильно различается, выравнивание может быть нарушено. Например:

     
    print("Яблоко\t100")
    print("ДлинноеНазвание\t200")
     

    Результат:

    Яблоко         100
    ДлинноеНазвание    200
    
    

    Для идеального выравнивания можно использовать методы форматирования, такие как str.ljust() или f-строки.

  2. Используйте с осторожностью: На больших текстах табуляция может сбивать отображение из-за разного поведения в текстовых редакторах и терминалах.


🧪Практика:

Example

  1. Создайте таблицу с именами сотрудников, их должностями и зарплатами, используя \t для форматирования. Пример:

    Имя         Должность       Зарплата
    Иванов      Менеджер        50000
    Петров      Программист     70000
    
    
  2. Напишите программу, которая выводит список продуктов и их цен, форматируя их с помощью \t.


Question

Короче я правильно понимаю что вложенные циклы это плохо и нужно стараться их избегать?


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

  • Когда вложенные циклы — это нормально?

    • Если ты работаешь с небольшим объемом данных (например, 10x10).
    • Если их использование делает код проще и понятнее для выполнения задачи.

Пример: Таблица умножения

Создадим таблицу умножения от 1 до 10:

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

Вывод:

1 * 1 = 1    1 * 2 = 2    1 * 3 = 3    ...    1 * 10 = 10
2 * 1 = 2    2 * 2 = 4    2 * 3 = 6    ...    2 * 10 = 20
...
10 * 1 = 10  10 * 2 = 20  10 * 3 = 30  ...   10 * 10 = 100

Объяснение кода:

  1. Внешний цикл:
    • Итерация по числам от 1 до 10 (i).
    • Каждое число будет умножаться на числа из внутреннего цикла.
  2. Вложенный цикл:
    • Для каждого числа i из внешнего цикла выполняется полный цикл j от 1 до 10.
    • Результаты умножения выводятся в строку (end="\t" для горизонтального разделения).
  3. После окончания вложенного цикла (for j) используется print() для перехода на следующую строку, чтобы начать новую строку таблицы.

🧪 Практическое задание:

Example

  1. Напишите программу, которая выводит таблицу сложения для чисел от 1 до 5.
  2. Измените таблицу умножения, чтобы результаты выводились в красивой форме с разделением, например:
    1    2    3    4    5
1   1    2    3    4    5
2   2    4    6    8   10
...

Обработка ошибок в циклах try...except.

Note

При выполнении операций внутри цикла могут возникать ошибки, например, деление на ноль, преобразование типов, или доступ к несуществующему индексу. Чтобы цикл продолжал работать даже при возникновении ошибки, можно использовать конструкцию try...except.

Пример: Обработка деления на ноль

numbers = [10, 0, 5, 2]
 
for num in numbers:
    try:
        result = 10 / num
        print(f"Результат деления: {result}")
    except ZeroDivisionError:
        print("Ошибка: Деление на ноль невозможно.")

Вывод:

Результат деления: 1.0
Ошибка: Деление на ноль невозможно.
Результат деления: 2.0
Результат деления: 5.0

Пример: Работа с преобразованием типов

data = ["123", "abc", "456", None]
 
for item in data:
    try:
        number = int(item)  # Попытка преобразования строки в число
        print(f"Число: {number}")
    except (ValueError, TypeError):
        print(f"Ошибка: {item} не удалось преобразовать в число.")

Вывод:

Число: 123
Ошибка: abc не удалось преобразовать в число.
Число: 456
Ошибка: None не удалось преобразовать в число.

Пример: Обработка нескольких типов ошибок

operations = [(10, 2), (5, 0), (8, "string"), (4, 2)]
 
for a, b in operations:
    try:
        result = a / b
        print(f"Результат: {result}")
    except ZeroDivisionError:
        print("Ошибка: Деление на ноль невозможно.")
    except TypeError:
        print(f"Ошибка: Неверный тип данных: {b}")

Вывод:

Результат: 5.0
Ошибка: Деление на ноль невозможно.
Ошибка: Неверный тип данных: string
Результат: 2.0

🧪 Практическое задание

Example

  1. Напишите цикл, который делит число 100 на элементы списка [10, 0, 5, "abc", 2]. Обработайте ошибки деления на ноль и преобразования типов.
  2. Реализуйте цикл, который читает числа из списка и обрабатывает ошибки для значений, которые нельзя преобразовать в числа (например, ["123", "text", None, "456"]).
  3. Напишите программу, которая выполняет операции с числами в парах (например, [ (10, 5), (3, 0), (7, "str") ]), обрабатывая деление на ноль и ошибки типов данных.

Циклы и производительность (Читать, но не заучивать)

Note

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

Почему вложенные циклы могут быть медленными?

Вложенные циклы увеличивают сложность алгоритма. Например:

  • Один цикл: сложность O(n) — количество операций растет линейно.
  • Два вложенных цикла: сложность O(n^2) — операции растут квадратично.
  • Три вложенных цикла: сложность O(n^3) — операции растут кубически.

Для больших объемов данных такие циклы могут стать крайне неэффективными.


Пример неэффективного кода

data = [1, 2, 3, 4, 5]
result = []
 
for i in data:
    for j in data:
        if i != j:
            result.append((i, j))
 
print(result)
  • Здесь каждый элемент сравнивается с каждым. Если data состоит из 100 элементов, то цикл выполнит 10,000 итераций (100 × 100).

🧪 Практика

Example

Повторите все операции и выведите в терминал результаты их выполнения Сделайте конспект темы в миро


⬅️ Назад: 02.06 - If else | Далее: 02.08 - Паттерны решения задач ➡️ Модуль: 02 - MOC