Ниже восемь простых программ на Python, которые можно скопировать в файл, запустить и сразу пользоваться: калькулятор, игра «угадай число», камень-ножницы-бумага, конвертер температуры, генератор паролей, счётчик дней до дня рождения, список дел с сохранением в файл и тренажёр таблицы умножения. У каждой есть код, вывод настоящего запуска и разбор мест, где такая программа обычно ломается.
Для них хватит основ Python: переменные, ввод и вывод, условия, циклы и функции. Код проверен на Python 3.14.3. Нужен Python 3.8 или новее: в нескольких программах цикл записан через оператор :=, которого в 3.7 и раньше нет. Все программы обходятся стандартной библиотекой, pip install не нужен.
| Программа | Что в ней разбирается | Модули |
|---|---|---|
| Калькулятор | float, split, деление на ноль | нет |
| Угадай число | цикл while True, try/except | random |
| Камень, ножницы, бумага | словарь вместо цепочки if | random |
| Конвертер температуры | функции, f-строки | нет |
| Генератор паролей | криптостойкий выбор символов | secrets, string |
| Дни до дня рождения | даты, 29 февраля | datetime |
| Список дел | запись в файл JSON | json, pathlib |
| Таблица умножения | случайные примеры, замер времени | random, time |
Если нужна практика с условием и проверкой решения, возьмите задачи по Python для начинающих: там другие десять задач, включая обратную версию игры, где число угадывает компьютер.
- Как запустить программу на Python
- Первая программа: Hello, World и ввод имени
- 1. Калькулятор
- 2. Угадай число
- 3. Камень, ножницы, бумага
- 4. Конвертер температуры
- 5. Генератор паролей
- 6. Сколько дней до дня рождения
- 7. Список дел: работа с файлом
- 8. Тренажёр таблицы умножения
- Частые ошибки в первых программах
- Частые вопросы
- Какую программу на Python написать первой?
- Как остановить программу, которая зависла в цикле?
- Как использовать эти программы, чтобы научиться писать код?
- Почему у меня другие числа и пароли?
- Как сделать из программы окно с кнопками?
Как запустить программу на Python
Создайте текстовый файл с расширением .py, например calc.py, скопируйте в него код и сохраните в кодировке UTF-8. Откройте командную строку (в Windows) или терминал (в Linux и macOS) в папке с файлом и выполните команду:
python calc.py
На Windows работает и короткая команда py calc.py, на Linux и macOS обычно пишут python3 calc.py. Отдельная среда разработки для начала не обязательна: в IDLE, редакторе, который ставится вместе с Python, программа запускается клавишей F5. Как поставить редактор с подсветкой и отладчиком, разобрано в статье VS Code для Python.
В выводе ниже строки, которые ввёл пользователь, стоят сразу после вопроса программы, так же, как их видно в консоли.
Первая программа: Hello, World и ввод имени
print("Hello, World!")
name = input("Как вас зовут? ")
print(f"Привет, {name}!")
Hello, World!
Как вас зовут? Аня
Привет, Аня!
Первая строка выведет на экран Hello, World!: функция print печатает то, что получает в скобках. Функция input печатает подсказку, ждёт, пока пользователь нажмёт Enter, и возвращает введённую строку без символа перевода строки; её сохраняем в переменную name. Буква f перед кавычками делает f-строку: выражение в фигурных скобках подставляется в текст.
1. Калькулятор
Калькулятор выполняет четыре математические операции. Пример вводится целиком, через пробелы: 7 / 2. Программа считает, пока пользователь не введёт q.
while True:
line = input("Пример: ").strip()
if line == "q":
break
try:
a, op, b = line.split()
a, b = float(a), float(b)
except ValueError:
print("Нужно так: число, пробел, знак, пробел, число")
continue
if op == "+":
print(a + b)
elif op == "-":
print(a - b)
elif op == "*":
print(a * b)
elif op == "/":
print(a / b if b != 0 else "На ноль делить нельзя")
else:
print("Знаю только + - * /")
Пример: 7 / 2
3.5
Пример: 0.1 + 0.2
0.30000000000000004
Пример: 5 / 0
На ноль делить нельзя
Пример: 2 ^ 3
Знаю только + - * /
Пример: семь + 1
Нужно так: число, пробел, знак, пробел, число
Пример: q
Метод split() режет строку по пробелам. Если частей не три или float() не смог прочитать число, возникает ValueError, и блок except вместо падения программы печатает подсказку. Без проверки b != 0 деление на ноль остановило бы калькулятор с ZeroDivisionError. Результат 0.30000000000000004 появляется потому, что 0.1 нельзя точно записать двоичной дробью. Для вывода пользователю округлите: round(a + b, 2) даст 0.3.

2. Угадай число
Компьютер загадывает случайное число от 1 до 100, игрок угадывает, программа подсказывает «больше» или «меньше» и считает попытки.
import random
secret = random.randint(1, 100)
attempts = 0
print("Я загадал число от 1 до 100.")
while True:
try:
guess = int(input("Ваш вариант: "))
except ValueError:
print("Нужно целое число")
continue
attempts += 1
if guess < secret:
print("Больше")
elif guess > secret:
print("Меньше")
else:
print("Угадали! Попыток:", attempts)
break
Я загадал число от 1 до 100.
Ваш вариант: пятьдесят
Нужно целое число
Ваш вариант: 50
Меньше
Ваш вариант: 25
Меньше
Ваш вариант: 12
Больше
Ваш вариант: 16
Угадали! Попыток: 4
random.randint(1, 100) включает обе границы, так что 100 тоже может выпасть. Попытка засчитывается только после успешного int(): строка «пятьдесят» не увеличила счётчик. Цикл while True крутится, пока не сработает break. У вас загаданное число будет другим: генератор случайных чисел при каждом запуске стартует с нового значения.
3. Камень, ножницы, бумага
Три раунда против компьютера. Вместо девяти условий на все пары ходов здесь словарь: ключ бьёт значение.
import random
beats = {"камень": "ножницы", "ножницы": "бумага", "бумага": "камень"}
wins = losses = 0
for round_no in range(1, 4):
player = input(f"Раунд {round_no}. Камень, ножницы или бумага? ").strip().lower()
while player not in beats:
player = input("Не понял, ещё раз: ").strip().lower()
computer = random.choice(list(beats))
print("Компьютер:", computer)
if player == computer:
print("Ничья")
elif beats[player] == computer:
print("Раунд ваш")
wins += 1
else:
print("Раунд за компьютером")
losses += 1
print(f"Счёт {wins}:{losses}")
Раунд 1. Камень, ножницы или бумага? Камень
Компьютер: ножницы
Раунд ваш
Раунд 2. Камень, ножницы или бумага? ящерица
Не понял, ещё раз: ножницы
Компьютер: бумага
Раунд ваш
Раунд 3. Камень, ножницы или бумага? камень
Компьютер: бумага
Раунд за компьютером
Счёт 2:1
lower() приводит ввод к нижнему регистру, поэтому «Камень» с большой буквы принят. Проверка player not in beats смотрит, есть ли такое слово среди ключей словаря. random.choice берёт случайный элемент из непустой последовательности; list(beats) превращает ключи словаря в список.

4. Конвертер температуры
Пользователь пишет число и букву шкалы, например 36.6C или 100F, программа переводит градусы Цельсия в Фаренгейты и обратно. Пустая строка (Enter или одни пробелы) завершает работу.
def to_fahrenheit(c):
return c * 9 / 5 + 32
def to_celsius(f):
return (f - 32) * 5 / 9
while text := input("Температура: ").strip():
text = text.upper().replace(",", ".")
scale = text[-1].replace("С", "C") # русская С превращается в латинскую
try:
value = float(text[:-1])
except ValueError:
print("Не вижу число")
continue
if scale == "C":
print(f"{value} °C = {to_fahrenheit(value):.1f} °F")
elif scale == "F":
print(f"{value} °F = {to_celsius(value):.1f} °C")
else:
print("В конце нужна буква C или F")
Температура: 36,6с
36.6 °C = 97.9 °F
Температура: -40F
-40.0 °F = -40.0 °C
Температура: 100K
В конце нужна буква C или F
Температура:
Оператор := присваивает значение и тут же отдаёт его условию цикла: strip() срезает пробелы, пустая строка ложна, и while заканчивается. Русская «С» и латинская «C» выглядят одинаково, но это разные символы, и без замены ввод 36,6с с русской клавиатуры не прошёл бы проверку. float() не понимает запятую, поэтому её заменяем на точку. Формат :.1f округляет до одного знака после запятой.
5. Генератор паролей
Программа выдаёт три пароля заданной длины, в каждом есть строчная, заглавная буква и цифра.
import secrets
import string
ALPHABET = string.ascii_letters + string.digits + "!#$%&*+-=?@_"
def make_password(length):
while True:
password = "".join(secrets.choice(ALPHABET) for _ in range(length))
if (any(c.islower() for c in password)
and any(c.isupper() for c in password)
and any(c.isdigit() for c in password)):
return password
try:
length = max(8, int(input("Длина пароля (Enter = 12): ") or 12))
except ValueError:
length = 12
for _ in range(3):
print(make_password(length))
Длина пароля (Enter = 12):
IncO*6LZqfBP
kE4i#co=D*3T
*RGziKef36ZH
Модуль random для паролей не годится: его генератор сделан для моделирования и симуляций, для защиты данных он не предназначен. Для паролей и токенов в стандартной библиотеке есть secrets. Функция make_password генерирует пароль заново, пока в нём не окажется хотя бы одна строчная буква, одна заглавная и одна цифра. Пустой ввод превращается в 12 через or, нечисловой тоже даёт 12, а max(8, ...) не даёт задать пароль короче восьми символов. При вашем запуске пароли будут другими.

6. Сколько дней до дня рождения
Программа принимает дату в формате ДД.ММ и считает, сколько дней осталось до ближайшего дня рождения. Пустая строка завершает работу. Вывод снят 8 октября 2026 года.
from datetime import date
def next_birthday(day, month, today):
for year in range(today.year, today.year + 9):
try:
birthday = date(year, month, day)
except ValueError: # 29 февраля в невисокосный год или 31.04
continue
if birthday >= today:
return birthday
return None
while text := input("Введите ДД.ММ: "):
try:
day, month = map(int, text.split("."))
except ValueError:
print("Формат ДД.ММ, например 05.03")
continue
birthday = next_birthday(day, month, date.today())
if birthday is None:
print("Такой даты нет")
else:
left = (birthday - date.today()).days
print(f"{birthday:%d.%m.%Y}, осталось дней: {left}")
Введите ДД.ММ: 29.02
29.02.2028, осталось дней: 509
Введите ДД.ММ: 08.10
08.10.2026, осталось дней: 0
Введите ДД.ММ: 31.04
Такой даты нет
Введите ДД.ММ:
date(2026, 2, 29) падает с ValueError: day 29 must be in range 1..28 for month 2 in year 2026, поэтому функция ловит исключение и пробует следующий год, пока не найдёт високосный. Перебор ограничен девятью годами: между високосными годами бывает и восемь лет (2096 и 2104), а 31 апреля не найдётся никогда, и без ограничения цикл не закончился бы. Разность двух дат даёт объект timedelta, количество дней лежит в его атрибуте days.
7. Список дел: работа с файлом
Программа печатает значок > и ждёт одну из команд: +дело добавляет запись, -2 удаляет вторую, Enter показывает список, q выходит. После каждой команды список записывается в файл todo.json, поэтому дела переживают перезапуск. Path("todo.json") задаёт относительный путь: файл создаётся в текущей папке, то есть в той, из которой запущена программа.
import json
from pathlib import Path
FILE = Path("todo.json")
tasks = json.loads(FILE.read_text(encoding="utf-8")) if FILE.exists() else []
while (command := input("> ").strip()) != "q":
if command.startswith("+"):
tasks.append(command[1:].strip())
elif command.startswith("-"):
number = command[1:].strip()
if number.isdecimal() and 1 <= int(number) <= len(tasks):
print("Удалено:", tasks.pop(int(number) - 1))
else:
print("Нет дела с таким номером")
for number, task in enumerate(tasks, 1):
print(f"{number}. {task}")
FILE.write_text(json.dumps(tasks, ensure_ascii=False, indent=2), encoding="utf-8")
> +купить хлеб
1. купить хлеб
> +оплатить интернет
1. купить хлеб
2. оплатить интернет
> +позвонить маме
1. купить хлеб
2. оплатить интернет
3. позвонить маме
> -2
Удалено: оплатить интернет
1. купить хлеб
2. позвонить маме
> -0
Нет дела с таким номером
1. купить хлеб
2. позвонить маме
> q
Второй запуск той же программы сразу читает файл:
>
1. купить хлеб
2. позвонить маме
> q
Без проверки номера команда -0 дала бы tasks.pop(-1), а отрицательный индекс в Python означает отсчёт с конца, и программа молча удалила бы последнее дело. enumerate(tasks, 1) нумерует с единицы, как привычно человеку. ensure_ascii=False пишет кириллицу в файл как есть, без этого флага вместо «купить» в файле окажутся коды вида \u043a. Кодировку указываем явно: без неё Python берёт кодировку системы, а она на разных компьютерах разная (на нашей Windows 10 locale.getencoding() вернул cp1251).

8. Тренажёр таблицы умножения
Пять случайных примеров, в конце число верных ответов и затраченное время.
import random
import time
correct = 0
start = time.perf_counter()
for _ in range(5):
a, b = random.randint(2, 9), random.randint(2, 9)
if input(f"{a} x {b} = ").strip() == str(a * b):
correct += 1
else:
print("Неверно, будет", a * b)
seconds = time.perf_counter() - start
print(f"Верно {correct} из 5 за {seconds:.0f} с")
3 x 5 = 15
8 x 9 = 72
9 x 5 = 54
Неверно, будет 45
2 x 3 = 6
3 x 6 = 18
Верно 4 из 5 за 0 с
Ответ сравнивается как строка с str(a * b), поэтому нечисловой ввод программу не роняет, он просто считается неверным. time.perf_counter() подходит для замера промежутков: важна разница двух значений, само число ничего не значит. В нашем прогоне ответы подавались из файла, отсюда 0 секунд; у человека за клавиатурой выйдет больше.
Частые ошибки в первых программах
Самая частая: забыть, что input() всегда возвращает строку.
age = input("Сколько вам лет? ")
print(age + 1)
Программа спросит возраст, а на второй строке упадёт с TypeError: can only concatenate str (not "int") to str: строку нельзя сложить с числом.
Исправление: age = int(input(...)). Но тогда ввод «семь» уронит программу с ValueError: invalid literal for int() with base 10: 'семь', а float("0,5") с ValueError: could not convert string to float: '0,5'. Поэтому в программах выше преобразование типа обёрнуто в try.
Вторая ошибка касается имени файла. Если сохранить игру как random.py, строка import random загрузит ваш же файл вместо модуля, и Python 3.14 остановится с AttributeError: module 'random' has no attribute 'randint', подсказав переименовать файл. С secrets.py, json.py и другими именами модулей стандартной библиотеки то же самое. Если сообщение начинается с ModuleNotFoundError, причины разобраны в статье про ошибку No module named.
Третья: отступы. Тело if, while, for и функции сдвигается вправо, обычно на четыре пробела. Если строку после if x > 0: оставить без отступа, программа не запустится: IndentationError: expected an indented block after 'if' statement on line 2 (номер строки в сообщении будет тот, где стоит ваш if). Пробелы и табуляция вперемешку в одном блоке дают TabError: inconsistent use of tabs and spaces in indentation. В редакторе IDLE строка после if, while или def сама получает отступ в четыре пробела. Подробнее о циклах и выходе из них через break рассказано в статье о циклах с условием.

Частые вопросы
Какую программу на Python написать первой?
Если вы только начинаете изучать Python, возьмите сначала приветствие и калькулятор: в них есть ввод, вывод, преобразование типов и условия. Потом «угадай число», где появляется цикл и модуль random. Список дел с файлом оставьте напоследок.
Как остановить программу, которая зависла в цикле?
Нажмите Ctrl+C в консоли. Python прервёт выполнение исключением KeyboardInterrupt и напечатает traceback с номером строки, на которой стояла программа. По этой строке видно, какой цикл не закончился.
Как использовать эти программы, чтобы научиться писать код?
Меняйте их по одной детали и запускайте снова. Добавьте в калькулятор возведение в степень **, в «угадай число» ограничение в семь попыток, в тренажёр выбор количества примеров через input. Такие правки задевают то, что уже разобрано выше: условия, циклы, преобразование типов. Когда правки пойдут легко, попробуйте написать программу из этого списка с нуля, не подглядывая.
Почему у меня другие числа и пароли?
Загаданное число, ходы компьютера, примеры тренажёра и пароли случайные и меняются от запуска к запуску. Дни до дня рождения считаются от сегодняшней даты.
Как сделать из программы окно с кнопками?
Окна с кнопками делают модулем tkinter, он входит в стандартную библиотеку Python; в Ubuntu и Debian его ставят отдельным пакетом python3-tk. Все восемь программ выше консольные: интерфейс на tkinter устроен по-другому, ввод там берётся из полей окна, а не из input.








