Циклы в программировании — это способ автоматизировать выполнение повторяющихся действий. Вместо того чтобы вручную дублировать один и тот же код несколько раз, можно задать условия, при которых код будет выполняться столько раз, сколько необходимо.
Зачем нужны циклы?
Note
1️⃣
Снижение объёма кода: Вместо копирования одинаковых строк кода, цикл позволяет их повторить в нужном количестве итераций.
Пример: Вывести числа от 1 до 100 проще с циклом, чем писать 100 строк print().
Note
2️⃣
Гибкость: Циклы могут выполнять действия на основе условий или содержимого структур данных.
Пример: Обработать все элементы списка или проверить значения в словаре.
Note
3️⃣
Автоматизация: Циклы позволяют автоматизировать задачи, такие как обработка файлов, запрос данных с API или выполнение операций над большими наборами данных.
Note
4️⃣
Повторение: В некоторых задачах результат одной операции становится входными данными для следующей, и такие операции можно легко реализовать с помощью циклов.
Введение в автоматизацию повторяющихся действий
Пример из жизни:
Note
Представьте, что вы хотите раздать флаеры на улице каждому прохожему. Если вы будете дублировать каждое движение вручную, это займет кучу времени. С циклом вы могли бы сказать: «Каждому прохожему, пока у меня есть флаеры, выдавать один». Цикл будет повторять это действие, пока не закончатся прохожие или флаеры.
Циклы в Python
Python поддерживает два основных типа циклов:
Цикл for: Для работы с известными наборами данных, например, списками, строками или диапазонами чисел.
Цикл while: Для выполнения действий, пока выполняется определённое условие.
Пример 1: Цикл for
numbers = [1, 2, 3, 4, 5]for number in numbers: print("Число:", number)
Цикл for в Python используется для итерации по элементам последовательности, такой как список, строка, кортеж, словарь, множество или объект, поддерживающий итерацию.
1. Итерация по последовательности
Note
Что такое итерация?
Итерация — это последовательный проход по элементам структуры данных. Например, проход по списку чисел или буквам в строке.
unique_numbers = {10, 20, 30}for number in unique_numbers: print("Число из множества:", number)
🧪 Практика:
Example
Создаем в папке Data types свой файлик Cycles
Итерация по списку:
Напишите цикл, который выводит все элементы списка чисел [10, 20, 30, 40, 50].
Итерация по строке:
Напишите цикл, который выводит каждый символ строки "Hello, Python!".
Работа со словарём:
Создайте словарь с именами друзей и их возрастами. Напишите цикл, который выводит имя друга и его возраст.
Заключение по циклу 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
Возвращает строку:
Всё, что вводит пользователь, возвращается в виде строки. Если вы ожидаете числа, нужно использовать преобразование типа, например, int() или float().
Обработка ошибок:
Если пользователь вводит некорректное значение для преобразования типов, программа выдаст ошибку. Это можно предотвратить, используя try...except:
try: number = int(input("Введите число: ")) print("Квадрат числа:", number ** 2)except ValueError: print("Ошибка: нужно вводить только числа!")
Использование без параметра:
Если вы вызовете input() без аргументов, пользователь увидит пустую строку для ввода.
Типичные ошибки и как их избежать
Ошибка при вводе числа:
number = input("Введите число: ")print(number + 10) # Ошибка: нельзя сложить строку и число
Как исправить:
number = int(input("Введите число: "))print(number + 10)
Забыли указать текст для подсказки:
Если вы не добавите текстовое сообщение, пользователь может не понять, что требуется ввести.
user_input = ""while user_input != "да": user_input = input("Хотите выйти? (да/нет): ")print("Вы вышли из программы.")
Пример работы:
Хотите выйти? (да/нет): нетХотите выйти? (да/нет): нетХотите выйти? (да/нет): даВы вышли из программы.
Пример 3: Бесконечный цикл
counter = 0while 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 = 0for char in text: if char in vowels: count += 1print("Количество гласных:", count)
Вывод:
Количество гласных: 3
Example
Повторите эти операции и выведите в терминал результаты их выполнения
🧪 Практика
Example
Напишите программу, которая находит первое число больше 50 в списке и завершает цикл (break).
Создайте цикл, который пропускает все числа, кратные 3, из диапазона от 1 до 20 (continue).
Заключение по ключевым операторам
Warning
Операторы break и continue помогают гибко управлять выполнением циклов, а вложенные циклы открывают возможности для работы со сложными данными. Обработка строк через циклы позволяет решать задачи, связанные с текстом, от подсчёта символов до фильтрации.
Вложенные циклы
Note
Что такое вложенные циклы?
Вложенные циклы — это циклы, которые находятся внутри других циклов. Они используются, когда требуется выполнять повторяющиеся действия на нескольких уровнях. Например, для создания двумерных структур, работы с матрицами или построения таблиц.
Вложенный цикл будет выполняться полностью для каждой итерации внешнего цикла.
Что такое \t в Python?
Note
\t — это управляющий символ, который используется для добавления горизонтальной табуляции (табуляции вправо) в строку. Табуляция добавляет несколько пробелов, перемещая текст к следующей “табуляционной позиции”. Она полезна для форматирования текста, например, для создания таблиц в консоли.
Преимущество \t: Использование табуляции делает код чище и форматирует текст автоматически.
Особенности и советы
Не равномерное форматирование: Если длина текста перед \t сильно различается, выравнивание может быть нарушено. Например:
print("Яблоко\t100")print("ДлинноеНазвание\t200")
Результат:
Яблоко 100
ДлинноеНазвание 200
Для идеального выравнивания можно использовать методы форматирования, такие как str.ljust() или f-строки.
Используйте с осторожностью: На больших текстах табуляция может сбивать отображение из-за разного поведения в текстовых редакторах и терминалах.
🧪Практика:
Example
Создайте таблицу с именами сотрудников, их должностями и зарплатами, используя \t для форматирования.
Пример:
Имя Должность Зарплата
Иванов Менеджер 50000
Петров Программист 70000
Напишите программу, которая выводит список продуктов и их цен, форматируя их с помощью \t.
Question
Короче я правильно понимаю что вложенные циклы это плохо и нужно стараться их избегать?
Да, ты правильно понимаешь, вложенные циклы часто считаются неэффективными, особенно когда их использование приводит к увеличению сложности алгоритма. Вложенные циклы могут существенно замедлить выполнение программы, особенно если обрабатываемые данные большие.
Когда вложенные циклы — это нормально?
Если ты работаешь с небольшим объемом данных (например, 10x10).
Если их использование делает код проще и понятнее для выполнения задачи.
Пример: Таблица умножения
Создадим таблицу умножения от 1 до 10:
# Внешний цикл по числам от 1 до 10for i in range(1, 11): # Вложенный цикл для умножения каждого числа на числа от 1 до 10 for j in range(1, 11): print(f"{i} * {j} = {i * j}", end="\t") # Результаты отображаются в строку print() # Переход на новую строку после внутреннего цикла
Каждое число будет умножаться на числа из внутреннего цикла.
Вложенный цикл:
Для каждого числа i из внешнего цикла выполняется полный цикл j от 1 до 10.
Результаты умножения выводятся в строку (end="\t" для горизонтального разделения).
После окончания вложенного цикла (for j) используется print() для перехода на следующую строку, чтобы начать новую строку таблицы.
🧪 Практическое задание:
Example
Напишите программу, которая выводит таблицу сложения для чисел от 1 до 5.
Измените таблицу умножения, чтобы результаты выводились в красивой форме с разделением, например:
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
Напишите цикл, который делит число 100 на элементы списка [10, 0, 5, "abc", 2]. Обработайте ошибки деления на ноль и преобразования типов.
Реализуйте цикл, который читает числа из списка и обрабатывает ошибки для значений, которые нельзя преобразовать в числа (например, ["123", "text", None, "456"]).
Напишите программу, которая выполняет операции с числами в парах (например, [ (10, 5), (3, 0), (7, "str") ]), обрабатывая деление на ноль и ошибки типов данных.
Циклы и производительность (Читать, но не заучивать)
Note
Циклы — мощный инструмент для работы с данными, но они могут стать узким местом по производительности, особенно если используются неэффективно. Вложенные циклы и избыточные операции внутри циклов могут существенно замедлить выполнение программы.