Основы Python: создание простых приложений с примерами

Раздел: Основы Python -> Написание простых программ

Основы создания простых программ на Python

В этом разделе рассмотрим создание несложной программы - игры "Угадай число". Это отличный пример для изучения основных конструкций: циклов, условий, обработки исключений и работы со случайными числами.

Как написать игру "Угадай число" с ограничением попыток и подсказками?

Наиболее эффективное решение включает использование модуля random для генерации случайного числа, цикл for с фиксированным числом попыток, подсказки "больше/меньше" и обработку ошибок ввода. Пример кода:

import random

secret = random.randint(1, 100)
attempts = 7
print("Угадайте число от 1 до 100. У вас 7 попыток.")
for i in range(attempts):
    try:
        guess = int(input("Ваше предположение: "))
    except ValueError:
        print("Пожалуйста, введите целое число.")
        continue
    if guess == secret:
        print("Поздравляю, вы угадали!")
        break
    elif guess < secret:
        print("Загаданное число больше.")
    else:
        print("Загаданное число меньше.")
else:
    print(f"Попытки закончились. Число было {secret}.")

Python несложные программы (несложные программы на python)

Шаги: импорт random, генерация secret, установка количества попыток, цикл for с блоком else (выполняется, если не было break), обработка исключения при вводе нечислового значения.

Типичные проблемы и их решение:

  • Пользователь вводит не число - вызывает ValueError. Решение: обернуть в try/except с continue.
  • Бесконечный цикл при неправильном условии. В коде используется for с фиксированным range, поэтому бесконечного цикла нет. Если использовать while, нужно явно обновлять счётчик.
  • Некорректный диапазон (если загадать число меньше 1 или больше 100). Для простоты диапазон фиксирован, но можно добавить проверку.

Как добавить выбор уровня сложности?

Программа может предложить пользователю выбрать уровень, от которого зависят диапазон и количество попыток. Пример:

import random

print("Выберите уровень: 1 - легкий (1-50, 10 попыток), 2 - средний (1-100, 7), 3 - сложный (1-200, 5)")
level = input("Ваш выбор: ")
if level == "1":
    max_num = 50
    attempts = 10
elif level == "2":
    max_num = 100
    attempts = 7
elif level == "3":
    max_num = 200
    attempts = 5
else:
    print("Неверный выбор, установлен средний уровень.")
    max_num = 100
    attempts = 7

secret = random.randint(1, max_num)
print(f"Угадайте число от 1 до {max_num}. У вас {attempts} попыток.")
# цикл аналогичен предыдущему ...

Проблемы:

При вводе нечислового значения или неверного номера уровняя программа устанавливает значение по умолчанию, но не сообщает пользователю о допущенной ошибке. Можно добавить проверку через while, требует дополнительного кода.

Как организовать несколько раундов с подсчетом очков?

После каждой игры пользователь может продолжить или выйти. Очки (количество угадываний) сохраняются. Пример с while:

import random

score = 0
play = True
while play:
    secret = random.randint(1, 100)
    attempts = 7
    print("\nНовый раунд!")
    for i in range(attempts):
        # ... код игры с подсказками ...
        # если угадал: score += 1; break
    answer = input("Хотите сыграть еще? (да/нет): ").lower()
    if answer != "да":
        play = False
print(f"Игра окончена. Ваш счёт: {score}")

Проблемы:

Необходимо правильно инициализировать score и обновлять его внутри цикла. Также нужно обрабатывать повторный ввод при неверном ответе (можно использовать while).

Как использовать функции для переиспользования кода?

Функции позволяют отделить логику игры от пользовательского интерфейса. Например, функция play_game принимает диапазон и количество попыток:

import random

def play_game(max_num, attempts):
    secret = random.randint(1, max_num)
    print(f"Угадайте число от 1 до {max_num}. У вас {attempts} попыток.")
    for i in range(attempts):
        # ... тело цикла с обработкой ...
        if guess == secret:
            return True
    return False

def main():
    score = 0
    while True:
        if play_game(100, 7):
            score += 1
            print("Вы угадали!")
        else:
            print("Попытки закончились.")
        if input("Продолжить? (да/нет): ").lower() != "да":
            break
    print(f"Итоговый счёт: {score}")

if __name__ == "__main__":
    main()

Проблемы:

Функция play_game не обрабатывает исключения внутри себя - это можно добавить. Также важно использовать if __name__ == "__main__" для возможности импорта модуля.

Расширенные примеры: генератор паролей

Генератор паролей - ещё одна несложная программа, которая демонстрирует работу со строками, случайными числами и пользовательским вводом. Ниже приведены несколько вариантов с увеличением функциональности.

Базовый генератор пароля из букв и цифр

Пример
import random
import string

length = 8
characters = string.ascii_letters + string.digits
password = ''.join(random.choice(characters) for _ in range(length))
print(password)
a7Gk2pQw

Используются константы string.ascii_letters (a-z, A-Z) и string.digits (0-9). random.choice выбирает случайный символ из строки. Цикл в генераторе списка повторяется length раз.

Генератор с пользовательскими опциями

Пользователь может задать длину, а также включить знаки пунктуации и исключить похожие символы (например, 0 и O).

Пример
import random
import string

def generate_password(length=12, use_punctuation=True, exclude_similar=False):
    chars = string.ascii_letters + string.digits
    if use_punctuation:
        chars += string.punctuation
    if exclude_similar:
        similar = '0O1lI|'
        chars = ''.join(c for c in chars if c not in similar)
    return ''.join(random.choice(chars) for _ in range(length))

print(generate_password(16, use_punctuation=True, exclude_similar=True))
k9@zB&qP2x*Fv#a

Проблемы:

При исключении похожих символов можно случайно удалить все доступные символы, если длина слишком мала. Следует проверять, что chars не пустая строка, иначе вызовется ошибка.

Криптостойкий генератор с использованием модуля secrets

Модуль secrets предназначен для генерации криптографически безопасных случайных чисел, подходящих для паролей.

Пример
import secrets
import string

def generate_secure_password(length=16):
    alphabet = string.ascii_letters + string.digits + string.punctuation
    return ''.join(secrets.choice(alphabet) for _ in range(length))

print(generate_secure_password(20))
*h1A$s3z#vB8cD@e5Fg

Замена random.choice на secrets.choice делает пароль устойчивым к угадыванию.

Генератор с записью в файл

Созданные пароли можно сохранять в текстовый файл для последующего использования.

Пример
import secrets
import string

def save_password_to_file(filename, password):
    with open(filename, 'a') as f:
        f.write(password + '\n')

password = ''.join(secrets.choice(string.ascii_letters + string.digits) for _ in range(12))
save_password_to_file('passwords.txt', password)
print(f"Пароль {password} сохранён в файл.")
Пароль kDm3nR9qWx7p сохранён в файл.

Проблемы:

Файл будет расти, нет шифрования. Для учебного примера достаточно. Важно открывать файл в режиме 'a' (append), а не 'w', чтобы не перезаписывать предыдущие пароли.

Генератор с проверкой сложности (score)

Можно оценить стойкость пароля по длине и используемым наборам символов.

Пример
import string
import secrets

def password_strength(password):
    score = 0
    if len(password) >= 8:
        score += 1
    if any(c.islower() for c in password):
        score += 1
    if any(c.isupper() for c in password):
        score += 1
    if any(c.isdigit() for c in password):
        score += 1
    if any(c in string.punctuation for c in password):
        score += 1
    return score

password = ''.join(secrets.choice(string.ascii_letters + string.digits + string.punctuation) for _ in range(10))
print(f"Пароль: {password}, сложность: {password_strength(password)}/5")
Пароль: &9fT3k@Lz, сложность: 5/5

Чем выше score, тем надёжнее пароль. Можно добавить текстовую оценку.

Несложные программы на Python - comments

En
Python несложные программы (python)