Основы 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, тем надёжнее пароль. Можно добавить текстовую оценку.