Задачи по Python с решениями: 30 задач для начинающих
30 задач по программированию на Python для начинающих: числа, условия, циклы, строки, списки, словари, функции, файлы и мини-проекты. С подсказками и решениями.
Содержание · 14 разделов
- Как пользоваться подборкой
- Задачи на числа: ввод, вывод и арифметика
- Сумма двух чисел
- Площадь и периметр прямоугольника
- Сумма цифр трёхзначного числа
- Перевод секунд в часы, минуты и секунды
- Задачи на условия
- Чётное или нечётное
- Високосный год
- Максимум из трёх чисел
- Простой калькулятор
- Задачи на циклы
- Таблица умножения
- Факториал
- FizzBuzz
- Простое ли число
- Числа Фибоначчи
- Задачи на строки
- Палиндром
- Подсчёт гласных
- Самое длинное слово
- Шифр Цезаря
- Задачи на списки
- Второй по величине элемент
- Удаление дубликатов с сохранением порядка
- Пары с заданной суммой
- Задачи на словари
- Частота слов в тексте
- Группировка анаграмм
- Средний балл студентов
- Задачи на функции
- НОД и НОК
- Выравнивание вложенного списка
- Проверка надёжности пароля
- Задачи на работу с файлами
- Статистика текстового файла
- Обработка CSV: средний балл и отчёт
- Мини-проекты
- Игра «Угадай число»
- Консольный список дел с сохранением в файл
- Какие задачи решает Python на практике
- Где брать ещё задачи
- Частые вопросы
- Сколько задач решать, чтобы выучить Python?
- Что делать, если задача совсем не получается?
- Нужна ли математика для этих задач?
- Можно ли смотреть решение сразу?
- Как проверить решение, если автопроверки нет?
- Можно ли решать задачи с помощью нейросети?
- Итог
Здесь собраны 30 задач по Python для начинающих — от сложения двух чисел до консольного списка дел с сохранением в файл. Задачи сгруппированы по темам и идут от простых к сложным: каждая следующая опирается на то, что вы уже умеете.
У каждой задачи есть условие, пример ввода и вывода, подсказка и решение, спрятанное под спойлер. Все решения проверены на Python 3.12, а вывод в примерах — это реальный результат их запуска. Если вы только начинаете, параллельно держите открытой шпаргалку по синтаксису Python: почти всё, что понадобится для этих задач, там есть. Если удобнее сначала разобрать готовые программы, а потом писать свои, начните с примеров кода на Python с разбором.
Как пользоваться подборкой
- Подготовьте рабочее место. Нужен установленный Python и редактор — как это сделать, описано в статье про установку Python. Решение сохраняйте в файл и запускайте командой
python task.py(Windows) илиpython3 task.py(macOS/Linux), подробности — в статье о запуске Python-скрипта. - Сначала решайте сами. Дайте себе 15–20 минут. Не получается — прочитайте подсказку, затем попробуйте ещё раз.
- Сравните с решением. Приведённый код — один из возможных вариантов. Если ваша программа выдаёт правильный ответ на примерах и на нескольких своих тестах, задача решена.
- Проверяйте крайние случаи. Ноль, отрицательные числа, пустая строка, одинаковые элементы — именно на них ломаются решения.
В задачах с вводом данные вводятся с клавиатуры через input(), по одной строке на каждый вызов. Блок «Ввод» показывает, что вводит пользователь, «Вывод» — что печатает программа.
| Тема | Задачи | Что тренируем |
|---|---|---|
| Ввод, вывод и числа | сумма двух чисел, площадь прямоугольника, сумма цифр, перевод секунд | input(), int(), float(), //, %, f-строки |
| Условия | чётность, високосный год, максимум из трёх, калькулятор | if/elif/else, логические операторы |
| Циклы | таблица умножения, факториал, FizzBuzz, простое число, числа Фибоначчи | for, while, range(), break |
| Строки | палиндром, гласные, самое длинное слово, шифр Цезаря | срезы, методы строк, ord()/chr() |
| Списки | второй максимум, удаление дубликатов, пары с заданной суммой | сортировка, множества, поиск пар |
| Словари | частота слов, анаграммы, средний балл | подсчёт, группировка, Counter, defaultdict |
| Функции | НОД и НОК, выравнивание списка, проверка пароля | параметры, return, рекурсия |
| Файлы | статистика текстового файла, обработка CSV | open(), with, модуль csv |
| Мини-проекты | «Угадай число», консольный список дел | всё вместе плюс random, json, try/except |
Задачи на числа: ввод, вывод и арифметика
Сумма двух чисел
Пользователь вводит два целых числа в одной строке через пробел. Выведите их сумму в формате a + b = сумма.
Ввод: 7 5
Вывод: 7 + 5 = 12
Подсказка: строку разбейте методом split(), а каждую часть превратите в число.
Решение
a, b = map(int, input().split())
print(f"{a} + {b} = {a + b}")input() всегда возвращает строку, поэтому без int() вы получили бы склейку "75". Конструкция map(int, input().split()) подробно разобрана в статье про функцию map().
Площадь и периметр прямоугольника
Пользователь вводит ширину и высоту прямоугольника (дробные числа, каждое на своей строке). Выведите площадь и периметр с двумя знаками после запятой.
Ввод:
3.5
2
Вывод:
Площадь: 7.00
Периметр: 11.00
Подсказка: используйте float() и форматирование :.2f в f-строке.
Решение
width = float(input())
height = float(input())
area = width * height
perimeter = 2 * (width + height)
print(f"Площадь: {area:.2f}")
print(f"Периметр: {perimeter:.2f}")Обратите внимание: дробную часть в Python отделяют точкой. Ввод 3,5 вызовет ValueError.
Сумма цифр трёхзначного числа
Дано трёхзначное число. Найдите сумму его цифр, не превращая число в строку.
Ввод: 472
Вывод: 13
Подсказка: n // 100 даёт сотни, n % 10 — последнюю цифру.
Решение
n = int(input())
hundreds = n // 100
tens = n // 10 % 10
units = n % 10
print(hundreds + tens + units)// — целочисленное деление, % — остаток. Короткий вариант через строку: sum(map(int, str(n))) — он работает для чисел любой длины.
Перевод секунд в часы, минуты и секунды
Дано количество секунд. Выведите время в формате ЧЧ:ММ:СС с ведущими нулями.
Ввод: 3725
Вывод: 01:02:05
Подсказка: функция divmod(a, b) возвращает сразу частное и остаток.
Решение
seconds = int(input())
hours, rest = divmod(seconds, 3600)
minutes, secs = divmod(rest, 60)
print(f"{hours:02d}:{minutes:02d}:{secs:02d}")Формат :02d дополняет число нулями до двух знаков.
Задачи на условия
Чётное или нечётное
Дано целое число. Выведите чётное или нечётное.
Ввод: -7
Вывод: нечётное
Подсказка: число чётное, если остаток от деления на 2 равен нулю.
Решение
n = int(input())
if n % 2 == 0:
print("чётное")
else:
print("нечётное")В Python остаток от деления на положительное число всегда неотрицательный: -7 % 2 равно 1, поэтому решение верно и для отрицательных чисел.
Високосный год
Год високосный, если он делится на 4, но не делится на 100, либо если он делится на 400. Выведите високосный или обычный.
Ввод: 1900 → обычный
Ввод: 2000 → високосный
Ввод: 2024 → високосный
Ввод: 2023 → обычный
Подсказка: соберите условие из and и or, расставив скобки.
Решение
year = int(input())
if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
print("високосный")
else:
print("обычный")В стандартной библиотеке есть готовая проверка — calendar.isleap(year), но написать условие самому полезно.
Максимум из трёх чисел
Даны три целых числа в одной строке. Выведите наибольшее, не используя функцию max().
Ввод: 4 9 2
Вывод: 9
Подсказка: сначала проверьте, не является ли наибольшим первое число, затем сравните оставшиеся два.
Решение
a, b, c = map(int, input().split())
if a >= b and a >= c:
biggest = a
elif b >= c:
biggest = b
else:
biggest = c
print(biggest)Знак >= вместо > нужен, чтобы программа работала при одинаковых числах. В реальном коде пишите max(a, b, c).
Простой калькулятор
Пользователь вводит выражение из двух чисел и операции через пробелы: 10 / 4. Поддержите +, -, *, /. При делении на ноль и неизвестной операции выведите понятное сообщение.
Ввод: 10 / 4 → 2.5
Ввод: 3 * 7 → 21.0
Ввод: 5 / 0 → Ошибка: деление на ноль
Ввод: 2 ^ 3 → Неизвестная операция: ^
Подсказка: split() вернёт три части; операцию сравнивайте со строками "+", "-" и т. д.
Решение
left, op, right = input().split()
a = float(left)
b = float(right)
if op == "+":
print(a + b)
elif op == "-":
print(a - b)
elif op == "*":
print(a * b)
elif op == "/":
if b == 0:
print("Ошибка: деление на ноль")
else:
print(a / b)
else:
print(f"Неизвестная операция: {op}")Деление на ноль можно не проверять заранее, а перехватить исключение ZeroDivisionError — этот подход описан в статье про try/except.
Задачи на циклы
Таблица умножения
Дано число n. Выведите таблицу умножения для него от 1 до 10.
Ввод: 7
Вывод:
7 x 1 = 7
7 x 2 = 14
...
7 x 10 = 70
Подсказка: range(1, 11) перебирает числа от 1 до 10 включительно — правая граница не входит.
Решение
n = int(input())
for i in range(1, 11):
print(f"{n} x {i} = {n * i}")Факториал
Вычислите факториал числа n — произведение всех чисел от 1 до n.
Ввод: 5
Вывод: 120
Подсказка: заведите переменную result = 1 и умножайте её в цикле.
Решение
n = int(input())
result = 1
for i in range(2, n + 1):
result *= i
print(result)Для n = 0 и n = 1 цикл не выполнится ни разу, и ответ будет 1 — так и должно быть. Готовая функция — math.factorial(n).
FizzBuzz
Выведите числа от 1 до 15, но вместо чисел, кратных 3, печатайте Fizz, кратных 5 — Buzz, а кратных и 3, и 5 — FizzBuzz.
Подсказка: проверку на кратность 15 ставьте первой, иначе до неё дело не дойдёт.
Решение
for i in range(1, 16):
if i % 15 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzzПростое ли число
Дано целое число. Выведите простое, если оно делится только на 1 и на себя, иначе — составное. Числа меньше 2 простыми не считаются.
Ввод: 97 → простое
Ввод: 91 → составное
Подсказка: достаточно проверить делители до квадратного корня из n: если у числа есть делитель больше корня, то есть и парный меньше корня.
Решение
n = int(input())
is_prime = n >= 2
d = 2
while d * d <= n:
if n % d == 0:
is_prime = False
break
d += 1
print("простое" if is_prime else "составное")Условие d * d <= n заменяет вычисление корня. break прекращает цикл, как только найден первый делитель: 91 = 7 × 13, поэтому проверка остановится на семёрке.
Числа Фибоначчи
Выведите первые n чисел Фибоначчи в одну строку. Первые два числа — 0 и 1, каждое следующее равно сумме двух предыдущих.
Ввод: 10
Вывод: 0 1 1 2 3 5 8 13 21 34
Подсказка: храните два последних числа и обновляйте их одновременно: a, b = b, a + b.
Решение
n = int(input())
a, b = 0, 1
numbers = []
for _ in range(n):
numbers.append(a)
a, b = b, a + b
print(*numbers)print(*numbers) распаковывает список в отдельные аргументы, и print выводит их через пробел. Переменная _ означает, что номер итерации не нужен.
Задачи на строки
Палиндром
Проверьте, читается ли фраза одинаково слева направо и справа налево. Регистр, пробелы и знаки препинания не учитываются.
Ввод: А роза упала на лапу Азора → палиндром
Ввод: Python → не палиндром
Подсказка: оставьте только буквы и цифры (ch.isalnum()), приведите к нижнему регистру и сравните с перевёрнутой копией — срез [::-1].
Решение
text = input()
cleaned = [ch.lower() for ch in text if ch.isalnum()]
if cleaned == cleaned[::-1]:
print("палиндром")
else:
print("не палиндром")Подсчёт гласных
Посчитайте, сколько гласных букв (русских и английских) в строке.
Ввод: Программирование на Python
Вывод: 9
Подсказка: перечислите гласные в одной строке и проверяйте каждый символ оператором in.
Решение
VOWELS = "аеёиоуыэюяaeiou"
text = input()
count = sum(1 for ch in text.lower() if ch in VOWELS)
print(count)Английскую y мы не считаем гласной, поэтому в слове Python засчитана только o.
Самое длинное слово
Найдите самое длинное слово в предложении и выведите его вместе с длиной. Знаки препинания не должны входить в слово.
Ввод: Python — простой, читаемый и выразительный язык!
Вывод: выразительный 13
Подсказка: у max() есть параметр key — передайте в него len.
Решение
import string
sentence = input()
words = [word.strip(string.punctuation + "—«»") for word in sentence.split()]
words = [word for word in words if word]
longest = max(words, key=len)
print(longest, len(longest))string.punctuation содержит только ASCII-знаки, поэтому тире и кавычки-ёлочки добавлены вручную. Вторая строка убирает «слова», от которых после очистки ничего не осталось, — например, отдельно стоящее тире. Разбивка строки подробно описана в статье про split().
Шифр Цезаря
Напишите функцию caesar(text, shift), которая сдвигает каждую латинскую букву на shift позиций по алфавиту с сохранением регистра. Остальные символы не меняются. Отрицательный сдвиг расшифровывает текст.
caesar("Hello, World!", 3) → Khoor, Zruog!
caesar("Khoor, Zruog!", -3) → Hello, World!
Подсказка: ord() возвращает код символа, chr() — символ по коду. Чтобы после z снова шла a, используйте остаток от деления на 26.
Решение
def caesar(text, shift):
result = []
for ch in text:
if "a" <= ch <= "z":
result.append(chr((ord(ch) - ord("a") + shift) % 26 + ord("a")))
elif "A" <= ch <= "Z":
result.append(chr((ord(ch) - ord("A") + shift) % 26 + ord("A")))
else:
result.append(ch)
return "".join(result)
encrypted = caesar("Hello, World!", 3)
print(encrypted) # → Khoor, Zruog!
print(caesar(encrypted, -3)) # → Hello, World!Символы собираются в список и склеиваются один раз через "".join() — так быстрее, чем прибавлять к строке в цикле. Подробнее — в статье про метод join().
Задачи на списки
Второй по величине элемент
Дан список целых чисел. Найдите второе по величине уникальное значение. Если его нет, выведите сообщение.
Ввод: 5 1 9 3 9 7
Вывод: 7
Подсказка: повторы удобно убрать через set(), а потом отсортировать.
Решение
nums = list(map(int, input().split()))
unique = sorted(set(nums))
if len(unique) < 2:
print("второго по величине нет")
else:
print(unique[-2])Вариант за один проход без сортировки — полезен для собеседований:
nums = [5, 1, 9, 3, 9, 7]
first = second = None
for n in nums:
if first is None or n > first:
first, second = n, first
elif n != first and (second is None or n > second):
second = n
print(second) # → 7Удаление дубликатов с сохранением порядка
Удалите из списка повторяющиеся элементы, оставив первое вхождение каждого и сохранив исходный порядок.
Ввод: 3 1 3 2 1 5
Вывод: [3, 1, 2, 5]
Подсказка: set хранит то, что уже встречалось, но сам порядок не гарантирует — результат собирайте в отдельный список.
Решение
items = list(map(int, input().split()))
seen = set()
result = []
for item in items:
if item not in seen:
seen.add(item)
result.append(item)
print(result) # → [3, 1, 2, 5]
print(list(dict.fromkeys(items))) # → [3, 1, 2, 5]Вторая строка — идиоматичный однострочник: ключи словаря уникальны и хранятся в порядке добавления. Методы списков собраны в статье про списки в Python.
Пары с заданной суммой
Дан список чисел и число target. Найдите все пары элементов, сумма которых равна target.
nums = [2, 7, 11, 15, 1, 8], target = 9
Вывод: [(2, 7), (1, 8)]
Подсказка: вложенные циклы дадут ответ, но медленно. Быстрее идти по списку один раз и хранить уже просмотренные числа в множестве: для числа n нужная пара — target - n.
Решение
nums = [2, 7, 11, 15, 1, 8]
target = 9
seen = set()
pairs = []
for n in nums:
if target - n in seen:
pairs.append((target - n, n))
seen.add(n)
print(pairs) # → [(2, 7), (1, 8)]Проверка x in set выполняется в среднем за постоянное время, поэтому весь алгоритм линейный, а не квадратичный, как с двумя вложенными циклами.
Задачи на словари
Частота слов в тексте
Посчитайте, сколько раз встречается каждое слово в тексте, без учёта регистра и знаков препинания. Выведите три самых частых слова.
text = "Код пишут один раз, а читают много раз. Пишите код для людей, а не для машин."
Подсказка: d.get(word, 0) возвращает 0 для слова, которого ещё нет в словаре.
Решение
import string
from collections import Counter
text = "Код пишут один раз, а читают много раз. Пишите код для людей, а не для машин."
words = [word.strip(string.punctuation).lower() for word in text.split()]
counts = {}
for word in words:
counts[word] = counts.get(word, 0) + 1
print(counts["код"], counts["раз"]) # → 2 2
print(Counter(words).most_common(3))
# → [('код', 2), ('раз', 2), ('а', 2)]Ручной подсчёт через словарь показывает принцип, а Counter из модуля collections делает то же самое одной строкой. При равных частотах most_common сохраняет порядок первого появления, поэтому для (тоже 2 раза) в тройку не попало. Больше о словарях — в статье про словари в Python.
Группировка анаграмм
Сгруппируйте слова, состоящие из одних и тех же букв.
Ввод: ["кот", "ток", "сон", "нос", "кто", "рот"]
Вывод:
['кот', 'ток', 'кто']
['сон', 'нос']
['рот']
Подсказка: у анаграмм одинаковый набор букв, а значит, одинаковая отсортированная строка. Её можно сделать ключом словаря.
Решение
from collections import defaultdict
words = ["кот", "ток", "сон", "нос", "кто", "рот"]
groups = defaultdict(list)
for word in words:
key = "".join(sorted(word))
groups[key].append(word)
for group in groups.values():
print(group)defaultdict(list) сам создаёт пустой список для нового ключа — не нужна проверка if key not in groups.
Средний балл студентов
Дан словарь «студент → список оценок». Выведите средний балл каждого по убыванию и имя лучшего студента.
Анна: 4.75
Вера: 4.50
Борис: 3.50
Лучший результат: Анна
Подсказка: сначала постройте словарь средних генератором словаря, затем отсортируйте его пары по значению.
Решение
grades = {
"Анна": [5, 4, 5, 5],
"Борис": [3, 4, 4, 3],
"Вера": [5, 4, 4, 5],
}
averages = {name: sum(marks) / len(marks) for name, marks in grades.items()}
for name, avg in sorted(averages.items(), key=lambda item: item[1], reverse=True):
print(f"{name}: {avg:.2f}")
best = max(averages, key=averages.get)
print("Лучший результат:", best)max(averages, key=averages.get) перебирает ключи, но сравнивает их по значениям — частый приём для поиска ключа с максимальным значением.
Задачи на функции
НОД и НОК
Напишите функции gcd(a, b) — наибольший общий делитель по алгоритму Евклида — и lcm(a, b) — наименьшее общее кратное.
gcd(48, 18) → 6
lcm(48, 18) → 144
Подсказка: алгоритм Евклида: пока b не ноль, заменяйте пару (a, b) на (b, a % b). НОК равен a * b // НОД.
Решение
import math
def gcd(a, b):
while b:
a, b = b, a % b
return a
def lcm(a, b):
return a * b // gcd(a, b)
print(gcd(48, 18), lcm(48, 18)) # → 6 144
print(math.gcd(48, 18), math.lcm(48, 18)) # → 6 144В модуле math есть готовые gcd и lcm (последняя — с Python 3.9), но реализовать алгоритм самостоятельно — классическое упражнение.
Выравнивание вложенного списка
Напишите функцию flatten(items), которая превращает список с любой глубиной вложенности в плоский.
flatten([1, [2, [3, 4], 5], [6]]) → [1, 2, 3, 4, 5, 6]
Подсказка: если элемент — список, вызовите flatten для него же (рекурсия) и добавьте результат.
Решение
def flatten(items):
result = []
for item in items:
if isinstance(item, list):
result.extend(flatten(item))
else:
result.append(item)
return result
print(flatten([1, [2, [3, 4], 5], [6]])) # → [1, 2, 3, 4, 5, 6]extend добавляет все элементы другого списка, а append — один элемент. Если перепутать их, вложенность сохранится.
Проверка надёжности пароля
Напишите функцию check_password(password), которая возвращает список проблем: меньше 8 символов, нет цифры, нет заглавной буквы, нет строчной буквы. Пустой список означает надёжный пароль.
qwerty -> меньше 8 символов, нет цифры, нет заглавной буквы
Secret123 -> надёжный
12345678 -> нет заглавной буквы, нет строчной буквы
Подсказка: функция any() возвращает True, если хотя бы один элемент последовательности истинный.
Решение
def check_password(password):
problems = []
if len(password) < 8:
problems.append("меньше 8 символов")
if not any(ch.isdigit() for ch in password):
problems.append("нет цифры")
if not any(ch.isupper() for ch in password):
problems.append("нет заглавной буквы")
if not any(ch.islower() for ch in password):
problems.append("нет строчной буквы")
return problems
for pwd in ["qwerty", "Secret123", "12345678"]:
problems = check_password(pwd)
print(pwd, "->", "надёжный" if not problems else ", ".join(problems))Функция не печатает, а возвращает результат — так её легко использовать в другом коде и тестировать.
Задачи на работу с файлами
Статистика текстового файла
Посчитайте количество строк, слов и символов (без переводов строк) в файле text.txt. Пример содержимого файла:
Простое лучше, чем сложное.
Сложное лучше, чем запутанное.
Читаемость имеет значение.
Вывод: Строк: 3, слов: 11, символов: 83
Подсказка: открывайте файл через with open(...) и указывайте encoding="utf-8", иначе на Windows кириллица может прочитаться неправильно.
Решение
lines = words = chars = 0
with open("text.txt", encoding="utf-8") as f:
for line in f:
lines += 1
words += len(line.split())
chars += len(line.rstrip("\n"))
print(f"Строк: {lines}, слов: {words}, символов: {chars}")Перебор файла построчно не загружает его в память целиком, поэтому решение подойдёт и для больших файлов. Файл должен лежать в папке, из которой запускается скрипт, — иначе будет FileNotFoundError.
Обработка CSV: средний балл и отчёт
Файл students.csv содержит имена и баллы. Выведите число студентов, средний балл и лучшего студента, а имена всех, кто набрал 70 и больше, запишите в файл passed.txt.
name,score
Анна,92
Борис,78
Вера,85
Глеб,64
Студентов: 4
Средний балл: 79.8
Лучший: Анна (92)
Подсказка: csv.DictReader возвращает каждую строку как словарь с ключами из заголовка. Значения читаются строками — не забудьте int().
Решение
import csv
with open("students.csv", encoding="utf-8", newline="") as f:
rows = list(csv.DictReader(f))
scores = [int(row["score"]) for row in rows]
best = max(rows, key=lambda row: int(row["score"]))
print(f"Студентов: {len(rows)}")
print(f"Средний балл: {sum(scores) / len(scores):.1f}")
print(f"Лучший: {best['name']} ({best['score']})")
with open("passed.txt", "w", encoding="utf-8") as f:
for row in rows:
if int(row["score"]) >= 70:
f.write(row["name"] + "\n")После запуска в passed.txt окажутся три строки: Анна, Борис, Вера. Режим "w" перезаписывает файл; чтобы дописывать в конец, используйте "a". Для больших таблиц удобнее библиотека pandas.
Мини-проекты
Игра «Угадай число»
Программа загадывает случайное число от 1 до 100. Пользователь вводит варианты, а программа отвечает «Больше» или «Меньше». При угадывании выводится число попыток. Некорректный ввод не должен ломать программу и не считается попыткой.
Я загадал число от 1 до 100. Попробуйте угадать!
Ваш вариант: 50
Меньше
Ваш вариант: 25
Больше
Ваш вариант: abc
Нужно ввести целое число.
Ваш вариант: 37
Меньше
Ваш вариант: 31
Больше
Ваш вариант: 34
Угадали за 5 попыток!
Подсказка: random.randint(1, 100) возвращает случайное целое число, включая границы. Бесконечный цикл while True завершается через break, а ошибку int("abc") перехватывает try/except ValueError.
Решение
import random
secret = random.randint(1, 100)
attempts = 0
print("Я загадал число от 1 до 100. Попробуйте угадать!")
while True:
answer = input("Ваш вариант: ")
try:
guess = int(answer)
except ValueError:
print("Нужно ввести целое число.")
continue
attempts += 1
if guess < secret:
print("Больше")
elif guess > secret:
print("Меньше")
else:
print(f"Угадали за {attempts} попыток!")
breakЕсли каждый раз называть середину оставшегося диапазона (двоичный поиск), число от 1 до 100 угадывается не больше чем за 7 попыток. Попробуйте доработать игру: ограничить число попыток или предложить сыграть ещё раз.
Консольный список дел с сохранением в файл
Напишите программу для списка задач с командами: add <текст> — добавить, list — показать, done <номер> — отметить выполненной, del <номер> — удалить, exit — выйти. Список должен сохраняться в todo.json и загружаться при следующем запуске.
Команды: add <текст>, list, done <номер>, del <номер>, exit
> add Купить молоко
> add Решить 5 задач по Python
> list
1. [ ] Купить молоко
2. [ ] Решить 5 задач по Python
> done 2
> del 1
> list
1. [x] Решить 5 задач по Python
> exit
Подсказка: храните задачи списком словарей {"title": ..., "done": ...}. Модуль json превращает такой список в текст и обратно, а метод строки partition(" ") удобно делит команду и аргумент.
Решение
import json
from pathlib import Path
FILE = Path("todo.json")
def load_tasks():
if FILE.exists():
return json.loads(FILE.read_text(encoding="utf-8"))
return []
def save_tasks(tasks):
FILE.write_text(json.dumps(tasks, ensure_ascii=False, indent=2), encoding="utf-8")
def show(tasks):
if not tasks:
print("Список пуст")
for i, task in enumerate(tasks, start=1):
mark = "x" if task["done"] else " "
print(f"{i}. [{mark}] {task['title']}")
tasks = load_tasks()
print("Команды: add <текст>, list, done <номер>, del <номер>, exit")
while True:
command, _, arg = input("> ").strip().partition(" ")
if command == "add" and arg:
tasks.append({"title": arg, "done": False})
elif command == "list":
show(tasks)
elif command in ("done", "del") and arg.isdigit() and 1 <= int(arg) <= len(tasks):
index = int(arg) - 1
if command == "done":
tasks[index]["done"] = True
else:
tasks.pop(index)
elif command == "exit":
break
else:
print("Не понимаю команду")
continue
save_tasks(tasks)ensure_ascii=False сохраняет кириллицу в файле читаемой, а нумерацию задач с единицы даёт функция enumerate() с параметром start=1. Неизвестная команда или неверный номер (done 5 при одной задаче) выводят «Не понимаю команду» и ничего не меняют. Идеи для развития: сроки выполнения, сортировка, интерфейс в браузере на Flask.
Какие задачи решает Python на практике
Учебные задачи тренируют базовые конструкции, а в работе Python применяют для веб-разработки (Django, FastAPI, Flask), анализа данных, автоматизации рутины, написания скриптов и ботов, машинного обучения. Обзор областей и того, с чего начать в каждой, — в статье что такое Python. Когда задачи из этой подборки перестанут вызывать трудности, переходите к небольшим проектам в интересной вам области: так практика становится осмысленной.
Где брать ещё задачи
Сборников задач по программированию на Python много — выбирайте по уровню и формату:
- Задачники с автоматической проверкой. informatics.msk.ru и acmp.ru — большие русскоязычные архивы школьных и олимпиадных задач, решения проверяются на тестах.
- Тренажёры с уровнями сложности. Codewars и Exercism — короткие задачи, после решения можно посмотреть чужие варианты; на Exercism есть менторская обратная связь.
- Задачи для подготовки к собеседованиям. LeetCode — алгоритмы и структуры данных с разбором сложности.
- Математические и праздничные задачи. Project Euler — задачи на стыке математики и программирования; Advent of Code — ежегодный декабрьский марафон задач-головоломок.
- Олимпиадное программирование. Codeforces — регулярные соревнования и архив задач с рейтингом сложности.
Сайты с задачами принимают решение на Python, но обычно читают входные данные из стандартного ввода — поэтому приём map(int, input().split()) из задачи «Сумма двух чисел» пригодится постоянно.
Частые вопросы
Сколько задач решать, чтобы выучить Python?
Точного числа нет: важнее регулярность, чем объём. Несколько задач в день, решённых самостоятельно, дают больше, чем десятки разобранных по готовым решениям. Если после решения вы можете объяснить каждую строку своего кода — вы двигаетесь правильно.
Что делать, если задача совсем не получается?
Разбейте её на шаги и решите самый простой: прочитать ввод, вывести его, затем добавить одно преобразование. Выводите промежуточные значения через print(). Если программа падает, внимательно прочитайте сообщение об ошибке — как это делать, рассказано в статье про traceback.
Нужна ли математика для этих задач?
Для подборки достаточно школьной арифметики: деление с остатком, делимость, среднее значение. Глубокая математика нужна для отдельных направлений вроде машинного обучения, а не для изучения языка.
Можно ли смотреть решение сразу?
Можно, но польза будет меньше. Лучше прочитать подсказку, попробовать ещё раз, а после просмотра решения закрыть его и написать код заново по памяти.
Как проверить решение, если автопроверки нет?
Оформите решение функцией и сравните результат с ожидаемым через assert: если ответ неверный, программа остановится с AssertionError.
def is_leap(year):
return (year % 4 == 0 and year % 100 != 0) or year % 400 == 0
assert is_leap(2000) and is_leap(2024)
assert not is_leap(1900) and not is_leap(2023)
print("Все проверки пройдены") # → Все проверки пройдены
Добавьте проверки для крайних случаев: ноль, отрицательные числа, пустой ввод.
Можно ли решать задачи с помощью нейросети?
Для обучения — только как наставника: просите подсказку или объяснение ошибки, а код пишите сами. Готовое решение от нейросети засчитывает задачу, но не тренирует навык, ради которого она решается.
Итог
Тридцать задач из подборки покрывают основу языка: ввод и вывод, условия, циклы, строки, коллекции, функции и работу с файлами, а два мини-проекта показывают, как эти части складываются в программу. Если какая-то тема даётся тяжело, вернитесь к шпаргалке по синтаксису Python или пройдите маршрут изучения Python для начинающих. Другие материалы для практики собраны в разделе «Задачи и практика».
- #Python
- #Задачи
- #Практика
- #Для начинающих
- #Решения