Django-Admin.ru

Задачи по Python с решениями: 30 задач для начинающих

30 задач по программированию на Python для начинающих: числа, условия, циклы, строки, списки, словари, функции, файлы и мини-проекты. С подсказками и решениями.

Редакция Django-Admin.ru
· обновлено · 25 мин чтения

Содержание · 14 разделов
  1. Как пользоваться подборкой
  2. Задачи на числа: ввод, вывод и арифметика
  3. Сумма двух чисел
  4. Площадь и периметр прямоугольника
  5. Сумма цифр трёхзначного числа
  6. Перевод секунд в часы, минуты и секунды
  7. Задачи на условия
  8. Чётное или нечётное
  9. Високосный год
  10. Максимум из трёх чисел
  11. Простой калькулятор
  12. Задачи на циклы
  13. Таблица умножения
  14. Факториал
  15. FizzBuzz
  16. Простое ли число
  17. Числа Фибоначчи
  18. Задачи на строки
  19. Палиндром
  20. Подсчёт гласных
  21. Самое длинное слово
  22. Шифр Цезаря
  23. Задачи на списки
  24. Второй по величине элемент
  25. Удаление дубликатов с сохранением порядка
  26. Пары с заданной суммой
  27. Задачи на словари
  28. Частота слов в тексте
  29. Группировка анаграмм
  30. Средний балл студентов
  31. Задачи на функции
  32. НОД и НОК
  33. Выравнивание вложенного списка
  34. Проверка надёжности пароля
  35. Задачи на работу с файлами
  36. Статистика текстового файла
  37. Обработка CSV: средний балл и отчёт
  38. Мини-проекты
  39. Игра «Угадай число»
  40. Консольный список дел с сохранением в файл
  41. Какие задачи решает Python на практике
  42. Где брать ещё задачи
  43. Частые вопросы
  44. Сколько задач решать, чтобы выучить Python?
  45. Что делать, если задача совсем не получается?
  46. Нужна ли математика для этих задач?
  47. Можно ли смотреть решение сразу?
  48. Как проверить решение, если автопроверки нет?
  49. Можно ли решать задачи с помощью нейросети?
  50. Итог

Здесь собраны 30 задач по Python для начинающих — от сложения двух чисел до консольного списка дел с сохранением в файл. Задачи сгруппированы по темам и идут от простых к сложным: каждая следующая опирается на то, что вы уже умеете.

У каждой задачи есть условие, пример ввода и вывода, подсказка и решение, спрятанное под спойлер. Все решения проверены на Python 3.12, а вывод в примерах — это реальный результат их запуска. Если вы только начинаете, параллельно держите открытой шпаргалку по синтаксису Python: почти всё, что понадобится для этих задач, там есть. Если удобнее сначала разобрать готовые программы, а потом писать свои, начните с примеров кода на Python с разбором.

Как пользоваться подборкой

  1. Подготовьте рабочее место. Нужен установленный Python и редактор — как это сделать, описано в статье про установку Python. Решение сохраняйте в файл и запускайте командой python task.py (Windows) или python3 task.py (macOS/Linux), подробности — в статье о запуске Python-скрипта.
  2. Сначала решайте сами. Дайте себе 15–20 минут. Не получается — прочитайте подсказку, затем попробуйте ещё раз.
  3. Сравните с решением. Приведённый код — один из возможных вариантов. Если ваша программа выдаёт правильный ответ на примерах и на нескольких своих тестах, задача решена.
  4. Проверяйте крайние случаи. Ноль, отрицательные числа, пустая строка, одинаковые элементы — именно на них ломаются решения.

В задачах с вводом данные вводятся с клавиатуры через input(), по одной строке на каждый вызов. Блок «Ввод» показывает, что вводит пользователь, «Вывод» — что печатает программа.

ТемаЗадачиЧто тренируем
Ввод, вывод и числасумма двух чисел, площадь прямоугольника, сумма цифр, перевод секундinput(), int(), float(), //, %, f-строки
Условиячётность, високосный год, максимум из трёх, калькуляторif/elif/else, логические операторы
Циклытаблица умножения, факториал, FizzBuzz, простое число, числа Фибоначчиfor, while, range(), break
Строкипалиндром, гласные, самое длинное слово, шифр Цезарясрезы, методы строк, ord()/chr()
Спискивторой максимум, удаление дубликатов, пары с заданной суммойсортировка, множества, поиск пар
Словаричастота слов, анаграммы, средний баллподсчёт, группировка, Counter, defaultdict
ФункцииНОД и НОК, выравнивание списка, проверка пароляпараметры, return, рекурсия
Файлыстатистика текстового файла, обработка CSVopen(), 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
  • #Задачи
  • #Практика
  • #Для начинающих
  • #Решения
↑ ↓ выборEnter открытьEsc закрыть