Генератор случайных чисел [Beginner]

Я изучаю Python и создаю базовый генератор случайных чисел. Код ниже работает должным образом. Мне просто интересно, использует ли он лучшие практики / можно ли улучшить.

Некоторыми будущими соображениями могут быть добавление способа для пользователей выбирать случайное число, которое не ограничено значениями 0-50 или 0-100, и поиск способа динамического масштабирования количества предположений на основе их выбора.

import random

"""
Make a program in which the computer randomly chooses a number between 1 to 10,
1 to 100, or any range.
"""


def intro():
    print(f"Welcome to our number guessing game.")
    print(f"We'll ask you to pick a range of numbers from 0 up to 100."
          f"Then you'll get some chances to guess the number. "
          f"The number of guesses you get will scale based on the range you "
          f"choose. From 0 - 50, you'll get 5 chances. From 0 - 100, you'll"
          f"get 10 chances. Good luck!")
    print("Choose a range: ")
    print("1. 0 - 50")
    print("2. 0 - 100n")
    num_guesses = {
        "1": (5, 50),
        "2": (10, 100)
    }
    num_range = input()
    while True:
        if num_range == "1" or num_range == "2":
            return num_guesses[num_range]
        else:
            print(f"{num_range} is not a valid selection. "
                  f"Please select either 1 or 2.")
            num_range = input()


def guess_number(num_guesses, num_range):
    random_number = random.randint(0, num_range)
    guess_count = 0
    print(f"Random num is: {random_number}")
    while guess_count < num_guesses:
        guess = int(input(f"Pick a random number between 0 and "
                          f"{num_range}: n"))
        if guess == random_number:
            print("CONGRATS, YOU WIN!")
            break
        else:
            guess_count += 1
            print(f"Incorrect, try again! You have "
                  f"{num_guesses - guess_count} guess(es) left.n")
    else:
        print("Womp womp, you lose :(.")


if __name__ == "__main__":
    num_guesses, num_range = intro()
    guess_number(num_guesses, num_range)

1 ответ
1

Во-первых, проблема с поведением: в guess_number вы вообще не убедитесь, что ввод от пользователя является числом. Так что ты можешь позвонить int("oops"). Это вызывает ValueError, и поскольку это не за что ловить, программа вылетает. Вы захотите что-нибудь с этим сделать. Простое решение могло быть

try:
    guess = int(input(...))
    if guess == random_number:
        ...
    else
        ...
except ValueError:
    print("That doesn't look like a number to me, but that's OK, I'll count it anyway :)")
    guess_count += 1

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

Также есть пара мелких проблем с intro

Во-первых, вы дублируете num_range = input() линия. Если вы получите ввод в начале цикла (до if), вместо этого будет легче изменить, если по какой-то причине вам нужно

Во-вторых, в Python обычный подход состоит в том, что лучше просить прощения, чем разрешения. Что если проверка обычно записывается с использованием try/except KeyError блок (немного как выше). Но если вы не хотите этого делать, можно использовать более надежный подход, чем текущий, для проверки if num_range in num_guesses, если добавлена ​​новая опция или программа не принимает 1 и 2 к принятию "a" и "b".

В связи с этим, третье примечание, сообщения на самом деле не знают, какие параметры доступны, поэтому существует риск их рассинхронизации с остальной частью программы. Вы можете получить список допустимых вариантов как num_guesses.keys(), или используйте цикл for для перебора ключей в num_guesses напрямую

Наконец, мне не нравятся имена переменных. num_guesses звучит так, как будто это должно быть количество предположений, но это вовсе не число. По аналогии, num_range не имеет ничего общего с диапазонами чисел. num_range кажется, что его лучше описать таким именем, как selection или же choice, и num_guesses представляет собой набор доступных опций, поэтому, возможно, его можно было бы назвать options?

options = {
    "1": (5, 50),
    "2": (10, 100)
}

print("Welcome to ... on the range you choose.")

for option in options:
    print(f"From 0 - {options[option][1]}, you'll get {options[option][0]} chances.")

while True:
    print("Choose a range:")
    for option in options:
        print(f"{option}. 0 - {options[option][1]}")

    selection = input()
    try:
        return options[selection]
    except KeyError:
        print(f"{selection} is not a valid selection.")

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *