Циклы — это сердце любого языка программирования, и Python предлагает для них не только простой и понятный синтаксис, но и целый набор "секретных ингредиентов", которые делают код элегантным и эффективным. В этой статье мы разберем все о циклах в Python: от базы, которую нужно знать каждому, до интересных трюков, которые превратят вас из новичка в настоящего питониста.
Погнали!
1. База: while и for
Прежде чем колдовать, нужно понять основу. В Python есть два верных друга: while и for.
Цикл while прост и суров: он выполняет команды снова и снова, пока верно заданное условие. Это идеальный выбор, когда вы не знаете заранее, сколько шагов потребуется. Например, ждать от пользователя правильный пароль до победного конца.
secret = "волшебство"
answer = ""
while answer != secret:
answer = input("Угадайте секретное слово: ")
print("Добро пожаловать в мир магии!")
- Цикл for — это король перебора. Он идеален, когда нужно пройтись по элементам коллекции (списку, строке, словарю) или повторить действие известное количество раз -3-5. Вместо того чтобы писать 100 строк print, вы пишете одну -6:pythonКопироватьСкачатьfor i in range(5): # range(5) создает последовательность 0, 1, 2, 3, 4
print(f"Итерация номер {i}")
2. Трюк №1: Моржовый оператор :=
Хотите сделать код с while еще компактнее? В Python 3.8 появился "моржовый оператор" (walrus operator). Он позволяет одновременно и присвоить значение переменной, и проверить его в условии -1-4.
Посмотрите на разницу. Было:
name = input("Введите имя: ")
while name != "СТОП":
print(f"Привет, {name}!")
name = input("Введите имя: ")
Стало (смотрите, как элегантно!):
while (name := input("Введите имя: ")) != "СТОП":
print(f"Привет, {name}!")
Мы избавились от дублирования кода — имя теперь вводится ровно в одном месте -4.
3. Трюк №2: Волшебная палочка enumerate
Часто новички, пришедшие из других языков, пишут так -2:
my_list = ['яблоко', 'банан', 'вишня']
for i in range(len(my_list)):
print(i, my_list[i])
Это работает, но это некрасиво. В Python для этого есть встроенная функция enumerate. Она дает нам одновременно и индекс, и значение элемента -2-6-7.
for index, value in enumerate(my_list):
print(index, value)
Код стал чище, понятнее и быстрее работает.
4. Трюк №3: Ракетница zip
Что делать, если нужно пройтись сразу по двум (или больше) спискам параллельно? Конечно же, использовать zip -6-7! Эта функция, как аккуратная ракетница, собирает элементы из нескольких обойм в один блок.
names = ["Анна", "Борис", "Виктор"]
ages = [25, 30, 35]
cities = ["Москва", "Сочи", "Казань"]
for name, age, city in zip(names, ages, cities):
print(f"{name}, {age} год, город {city}")
Вывод будет аккуратным и синхронным.
5. Трюк №4: Избегаем вложенных циклов с itertools.product
Вложенные циклы — это часто боль и путаница. Например, нам нужно найти комбинацию чисел из трех списков, сумма которых равна 2077 -2.
Обычный "квадратный" код:
list_a = [1, 2020, 70]
list_b = [2, 4, 7, 2000]
list_c = [3, 70, 7]
for a in list_a:
for b in list_b:
for c in list_c:
if a + b + c == 2077:
print(a, b, c)
А теперь — магия модуля itertools:
from itertools import product
for a, b, c in product(list_a, list_b, list_c):
if a + b + c == 2077:
print(a, b, c)
Функция product генерирует все возможные комбинации (декартово произведение), и нам хватает одного цикла -2. Код сразу становится плоским и читаемым.
6. Трюк №5: Блок else у цикла
Это фишка, которая есть только в Python. У циклов for и while может быть блок else. Он выполняется только в том случае, если цикл завершился естественным путем, без команды break -3-6.
Это идеально подходит для поиска.
def search_number(numbers, target):
for num in numbers:
if num == target:
print(f"Нашли {target}!")
break
else:
print(f"Число {target} не найдено.")
search_number([1, 2, 3, 4, 5], 3) # Нашли 3!
search_number([1, 2, 3, 4, 5], 10) # Число 10 не найдено.
Обратите внимание: сообщение "не найдено" выводится только после того, как цикл честно перебрал все элементы и не наткнулся на break.
7. Трюк №6: Тонкая настройка с itertools
Модуль itertools — это набор швейцарских ножей для циклов. Мы уже видели product. Вот еще пара примеров -2:
chain() — склеивает несколько итераторов в один, позволяя пройтись по ним в одном цикле, как по единому списку.
from itertools import chain
for i in chain([1, 2], ['a', 'b'], (5, 6)):
print(i) # Выведет: 1, 2, a, b, 5, 6
- groupby() — группирует подряд идущие элементы. Например, можно сжать строку, сосчитав повторения.
8. Трюк №7: Пишем свои генераторы для циклов
Самый мощный трюк — вы можете научить цикл for работать так, как нужно вам. Для этого используются функции-генераторы с ключевым словом yield -2.
Хотите цикл, который перебирает только четные числа?
def even_only(numbers):
for i in numbers:
if i % 2 == 0:
yield i
my_numbers = [1, 2, 3, 4, 5, 6]
for n in even_only(my_numbers):
print(n) # Выведет: 2, 4, 6
Мы создали свой собственный итератор, который отфильтровывает ненужное.
Итоги
Циклы в Python — это не просто скучные повторения действий. С помощью небольших трюков — enumerate, zip, itertools или хитрого else — вы можете писать код, который будет не только работать, но и радовать глаз своей красотой и эффективностью -7. Используйте эти инструменты, и ваш код станет по-настоящему "pythonic"!