Python · Синтаксис · Начальный уровень

Цикл for, списки и кортежи

15 задач

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

Цикл for и итерируемые объекты

#
Цикл for обходит каждый элемент итерируемого объекта — списка, кортежа, строки или любой последовательности — по одному. Счётчиком управлять вручную не нужно: Python обрабатывает шаги сам. ```python numbers = [3, 7, 1, 9, 4] for n in numbers: print(n) ``` На каждой итерации n привязывается к следующему элементу списка. Когда список заканчивается — цикл завершается. Та же синтаксическая форма работает с кортежами и строками — строки итерируются символ за символом. Отличие от while — в намерении. Используйте for, когда знаете, что именно итерируете. Используйте while, когда количество итераций зависит от условия, вычисляемого во время выполнения. enumerate даёт и индекс, и значение, когда они нужны вместе: ```python days = ("Monday", "Tuesday", "Wednesday") for i, day in enumerate(days, start=1): print(f"День {i}: {day}") ``` Без enumerate потребовалась бы отдельная переменная-счётчик — enumerate убирает этот лишний код.

Построение коллекций во время итерации

#
Многие задачи с for имеют одинаковую форму: начинаем с пустого списка, проходим по источнику, решаем, включать ли каждый элемент, и добавляем выбранных. ```python numbers = [2, 5, 0, 8, 11, 14, 17, 0] result = [] for n in numbers: if n % 2 == 0 and n != 0: result.append(n) print(result) ``` Добавление в список внутри цикла — стандартный паттерн фильтрации. append выполняется за O(1) — он не копирует список каждый раз. Накопление суммы работает так же, только вместо списка используется число: ```python numbers = [5, 10, 15, 20] total = 0 for n in numbers: total += n print(total) ``` Отслеживание текущего максимума — начинаем с первого элемента как начального предположения, затем обновляем, когда находим что-то большее: ```python numbers = [8, 3, 15, 6, 2] max_num = numbers[0] for n in numbers: if n > max_num: max_num = n print(max_num) ``` Начинать с numbers[0], а не с 0, важно. Если все числа отрицательные, начало с 0 дало бы неправильный ответ.

Ключевые паттерны из задач

#
Построение строки через объединение элементов списка — вместо того чтобы дописывать к строке внутри цикла (что создаёт новую строку каждый раз), собираем элементы и объединяем в конце: ```python numbers = [3, 7, 1, 9, 4] result = "-".join(str(n) for n in numbers) print(result) # 3-7-1-9-4 ``` str(n) преобразует каждое целое число в строку перед объединением. join требует, чтобы все элементы уже были строками. Построение списка кортежей — объединяем каждый элемент с вычисленными данными: ```python words = ["Python", "is", "cool"] result = [] for word in words: result.append((word, len(word))) print(result) # [('Python', 6), ('is', 2), ('cool', 4)] ``` Фильтрация по свойству строки: ```python words = ["python", "java", "go", "javascript", "c"] count = 0 for word in words: if len(word) > 5: count += 1 print(count) ``` Разбор структурированных данных — разбиваем по разделителю, затем сравниваем части. Задача на фильтрацию дат следует той же схеме: сравниваем части строки даты (год, месяц, день) с порогом.

Быстрый справочник: цикл for, списки и кортежи

#
**Синтаксис цикла for** ```python for элемент in итерируемый: # список, кортеж, строка, range # тело # с индексом — использовать enumerate for i, элемент in enumerate(items): # i начинается с 0 for i, элемент in enumerate(items, start=1): # i начинается с 1 # по индексу — использовать range for i in range(5): # 0, 1, 2, 3, 4 for i in range(1, 6): # 1, 2, 3, 4, 5 for i in range(0, 10, 2): # 0, 2, 4, 6, 8 (шаг=2) ``` **Быстрый справочник по кортежу** ```python point = (3, 7) # создание со скобками point[0] # доступ по индексу — как список x, y = point # распаковка в переменные len(point) # 2 # кортежи неизменяемы — point[0] = 5 вызовет TypeError ``` **Типичные паттерны цикла for** | Паттерн | Шаблон | |---|---| | Фильтрация в новый список | `result = []; for x in xs: if условие: result.append(x)` | | Сумма / накопление | `total = 0; for x in xs: total += x` | | Подсчёт совпадений | `count = 0; for x in xs: if условие: count += 1` | | Найти макс / мин | `m = xs[0]; for x in xs: if x > m: m = x` | | Построение строки | `result = ''.join(str(x) for x in xs)` | | Список кортежей | `result.append((x, вычисленное))` | **Полезные встроенные функции заменяющие ручные циклы** ```python sum([1, 2, 3]) # 6 max([3, 1, 4]) # 4 min([3, 1, 4]) # 1 len([1, 2, 3]) # 3 sorted([3, 1, 2]) # [1, 2, 3] '-'.join(['a', 'b']) # 'a-b' ```
01

Числа через дефис.

#

Дан список чисел. Выведите каждое число из списка в той же строке в терминале через дефис. 3-7-1-9-4

numbers = [3, 7, 1, 9, 4]

Решение
numbers = [3, 7, 1, 9, 4]

result = ""
for n in numbers:
    result += str(n) + "-"

result = result[:-1]
print(result)

# или
numbers = [3, 7, 1, 9, 4]

for n in numbers[:-1]:
    print(n, end="-")
print(numbers[-1])

# или самый короткий вариант через join
numbers = [3, 7, 1, 9, 4]

result = "-".join(str(n) for n in numbers)
print(result)
02

Чётные числа без нулей.

#

Дан список чисел. Добавьте в новый список только чётные числа, нули пропустить.

numbers = [2, 5, 0, 8, 11, 14, 17, 0]
new = []

Решение
numbers = [2, 5, 0, 8, 11, 14, 17, 0]
new = []

for n in numbers:
    if n != 0 and n % 2 == 0:
        new.append(n)

print(new)

# или так можно: сначала проверить ноль, а потом чётность
numbers = [2, 5, 0, 8, 11, 14, 17, 0]
new = []

for n in numbers:
    if n == 0:
        continue
    if n % 2 == 0:
        new.append(n)

print(new)
03

Сумма элементов списка.

#

Дан список чисел. Найдите сумму всех элементов списка.

numbers = [5, 10, 15, 20]

total = 0
Решение
numbers = [5, 10, 15, 20]

total = 0
for n in numbers:
    total += n

print("Сумма:", total)

# или
numbers = [5, 10, 15, 20]

total = sum(numbers)

print("Сумма:", total)
04

Непустые строки.

#

Дан список строк. Добавьте в новый список строки, если они не пустые.

words = ["0000-0000-0000-0000", "", "1111-1111-1111-1111", "2222-2222-2222-2222", ""]
new_words = []

Решение
words = ["0000-0000-0000-0000", "", "1111-1111-1111-1111", "2222-2222-2222-2222", ""]
new_words = []

for w in words:
    if w != "":
        new_words.append(w)

print(new_words)

# или

words = ["0000-0000-0000-0000", "", "1111-1111-1111-1111", "2222-2222-2222-2222", ""]
new_words = []

for w in words:
    if w:
        new_words.append(w)

print(new_words)
05

Квадраты чисел больше 10.

#

Дан список чисел. Создайте новый список, в котором будут возведённые в квадрат только числа больше 10.

numbers = [3, 12, 5, 18, 7, 25]

result = []
Решение
numbers = [3, 12, 5, 18, 7, 25]

result = []
for n in numbers:
    if n > 10:
        result.append(n ** 2)

print(result)

# или так можно: сначала сохранить квадрат в переменную
numbers = [3, 12, 5, 18, 7, 25]

result = []
for n in numbers:
    if n > 10:
        square = n ** 2
        result.append(square)

print(result)
06

Дни недели с номерами.

#

Дан кортеж с названиями дней недели. Выведите каждый день в формате: "День X: <название>" .

days = ("Понедельник", "Вторник", "Среда", "Четверг", "Пятница")

Решение
days = ("Понедельник", "Вторник", "Среда", "Четверг", "Пятница")

day_num = 1
for day in days:
    print(f"День {day_num}: {day}")
    day_num += 1

# или так можно через enumerate
days = ("Понедельник", "Вторник", "Среда", "Четверг", "Пятница")

for number, day in enumerate(days, 1):
    print(f"День {number}: {day}")
07

Максимум через цикл.

#

Дан список чисел. Найдите максимальное число в списке, используя цикл for .

numbers = [8, 3, 15, 6, 2]

max_num = numbers[0]
Решение
numbers = [8, 3, 15, 6, 2]

max_num = numbers[0]
for n in numbers:
    if n > max_num:
        max_num = n

print("Максимум:", max_num)

# а вообще, для это есть встроенная функция max:
numbers = [8, 3, 15, 6, 2]

max_num = max(numbers)
print("Максимум:", max_num)
08

Строки длиннее 5 символов.

#

Дан список строк. Подсчитайте, сколько строк длиннее 5 символов.

words = ["python", "java", "go", "javascript", "c"]

count = 0
Решение
words = ["python", "java", "go", "javascript", "c"]

count = 0
for w in words:
    if len(w) > 5:
        count += 1

print("Количество строк:", count)

# или так можно: сохранить длину в переменную
words = ["python", "java", "go", "javascript", "c"]

count = 0
for w in words:
    length = len(w)
    if length > 5:
        count += 1

print("Количество строк:", count)
09

Положительные числа из кортежа.

#

Дан кортеж чисел. Выведите только те числа, которые больше 0.

numbers = (-3, 5, -1, 7, 0, -2)

Решение
numbers = (-3, 5, -1, 7, 0, -2)

for n in numbers:
    if n > 0:
        print(n)

# или так можно: положительные числа собрать в новый список
numbers = (-3, 5, -1, 7, 0, -2)
positive = []

for n in numbers:
    if n > 0:
        positive.append(n)

print(positive)
10

Строка через запятую.

#

Дан список строк. Создайте строку, которая будет состоять из всех элементов списка, разделённых запятой и пробелом.

words = ["Python", "это", "круто"]

result = ""
Решение
words = ["Python", "это", "круто"]

result = ""
for w in words:
    result += w + ", "

result = result[:-2]
print(result)

# или короче через join
words = ["Python", "это", "круто"]

result = ", ".join(words)
print(result)
11

Слова и их длина.

#

А будьте так любезны 🧐, создать из этого списка строк, новый список, в котором элементами будут кортежи. В каждом кортеже два элемента: строка и ее длина например: words = ["Python", "это", "круто"] new = [("Python", 6), ("это", 3), ("круто", 5)]

words = ["Python", "это", "круто"]
new = []

Решение
words = ["Python", "это", "круто"]
new = []

for word in words:
    t = (word, len(word))
    new.append(t)

print(new)


# Или то же сомое короче:
words = ["Python", "это", "круто"]
new = []

for word in words:
    new.append((word, len(word)))

print(new)
12

Символы строки в нижнем регистре.

#

Хм... Срочно нужно сделать из этой строки "Этой", список, который будет состоять из символов этой строки в нижнем регистре!!! (маленькие буковки)

word = "Этой"

Решение
word = "Этой"

arr = list(word.lower())  # да, это всё.

print(arr)

# или через цикл, чтобы явно увидеть добавление каждого символа
word = "Этой"
arr = []

for char in word:
    arr.append(char.lower())

print(arr)
13

Номер карты через дефис.

#

Опять же срочно! Какой-то умник сохранил номер банковской карты в виде списка по 4 цифры карты: card = ["1111", "2222", "3333", "4444"] Сделайте из этого строку в таком формате: norm_card = "1111-2222-3333-4444"

card = ["1111", "2222", "3333", "4444"]

Решение
card = ["1111", "2222", "3333", "4444"]

# Это срочно:
norm_card = "-".join(card)
print(norm_card)


# Это не срочно:
norm_card = ""

for part in card:
    norm_card += part + "-"
else:
    norm_card = norm_card[:-1]
print(norm_card)
14

Минимум, максимум и среднее.

#

Продолжаем срочный квест! Найдите по быстрому: - минимальное значение в списке; - максимальное значение в списке; - сумму всех значений в списке; - среднее арифметическое значений в списке. А потом, по желанию, не по быстрому.

arr = [10, 100, 500, 11, 18, 99, -3, 101]

Решение
arr = [10, 100, 500, 11, 18, 99, -3, 101]

# по быстрому:
mn = min(arr)
mx = max(arr)
sm = sum(arr)
am = sum(arr)/len(arr)
print(mn, mx, sm, am)


# не по быстрому:
mn = arr[0]
mx = arr[0]
sm = 0

for num in arr:
    sm += num
    if num < mn:
        mn = num
    if num > mx:
        mx = num

am = sm/len(arr)

print(mn, mx, sm, am)
15

Фильтр дат после 2027.09.01.

#

На последок, за 5 минут до окончания рабочего дня нужно: Есть список с датами в четком формате yyyy.mm.dd: dates = ["2027.09.25", "2027.10.14", "2027.03.01", "2027.12.29", "2027.09.11", "2027.05.06"] Нужен новый список где будут только даты после 2027.09.01. Подсказка: попробуйте посравнивать строки через < - > , иногда это полезно😉.

dates = ["2027.09.25", "2027.10.14", "2027.03.01", "2027.12.29", "2027.09.11", "2027.05.06"]
new = []
Решение
dates = ["2027.09.25", "2027.10.14", "2027.03.01", "2027.12.29", "2027.09.11", "2027.05.06"]

new = []

for date in dates:
    if date >= "2027.09.01":
        new.append(date)

print(new)

Тут важно понимать, что строки сравниваются лексикографически - то есть не как числа дат, а просто как каждый отдельный символ. И это один из редких случаев, когда сравнение строк через < > можно применить, кроме ,конечно, сортировки по алфавиту.
ВАЖНО: формат дат должен быть именно такой, иначе если записать dd.mm.yyyy это уже не будет работать так как мы бы хотели.

# или так можно: сохранить границу в отдельную переменную
dates = ["2027.09.25", "2027.10.14", "2027.03.01", "2027.12.29", "2027.09.11", "2027.05.06"]
border = "2027.09.01"
new_dates = []

for date in dates:
    if date > border:
        new_dates.append(date)

print(new_dates)