Я изучаю 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 ответ
Во-первых, проблема с поведением: в 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.")