Простые программы на Python: 8 программ с кодом, выводом и разбором

Размытый код программы на Python в редакторе на экране, рабочий стол начинающего разработчика Изучение

Ниже восемь простых программ на 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

Создайте текстовый файл с расширением .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) превращает ключи словаря в список.

Читайте также:  Задачи по Python для начинающих: 10 задач с решениями и разбором

Камень, ножницы и чистый лист бумаги на деревянном столе

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, ...) не даёт задать пароль короче восьми символов. При вашем запуске пароли будут другими.

Читайте также:  Задачи по Python для начинающих: 10 задач с решениями и разбором

Навесной замок и связка ключей на клавиатуре

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 секунд; у человека за клавиатурой выйдет больше.

Читайте также:  Задачи по Python для начинающих: 10 задач с решениями и разбором

Частые ошибки в первых программах

Самая частая: забыть, что 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.

Оцените статью
bestprogrammer.ru
Добавить комментарий