В эти дни я начал изучать Python и написал свой первый код. Guess_The_Number, и я хотел бы улучшить некоторые комментарии, или если я на правильном пути. Заранее большое спасибо Ps: пытаюсь создать свою функцию.
def guess_number (answer):
trys = 0
while trys < 5:
guessing = int(input("Your guessing is? "))
if guessing == answer:
print ("Yes!! it's Right!!")
break
elif guessing < answer:
print ("Big")
elif guessing > answer:
print ("smaller")
trys = trys+1
if trys == 5:
print("WoW, your trys are over , try again!!")
print("The number was ", answer)
print("Welcome to guess the number!!")
print("You have 5 trys to guess the number")
print("Good Luck!!")
print("I'm thiking in a number from 0 to 100")
print('')
import random
num_right = random.randint(0,100)
guess_number(num_right)
3 ответа
Это может показаться многословным, но я рассматриваю это так, как будто оно предназначено для производственного кода:
black
иisort
можно переформатировать этот код, чтобы он стал более идиоматическим, не изменяя функциональность.pylint
,flake8
или оба могут сказать вам о некоторых проблемах с этим кодом:$ pylint --disable=missing-function-docstring,missing-module-docstring q.py ************* Module q q.py:3:0: C0303: Trailing whitespace (trailing-whitespace) q.py:14:0: C0303: Trailing whitespace (trailing-whitespace) q.py:6:8: R1723: Unnecessary "elif" after "break" (no-else-break) q.py:23:0: C0413: Import "import random" should be placed at the top of the module (wrong-import-position) ------------------------------------------------------------------ Your code has been rated at 8.26/10
Множественное число от «пытаться» — «пытается».
trys += 1
синтаксический сахар дляtrys = trys + 1
.Код смешивает ввод / вывод (
input
/print
) и логики, что обычно усложняет сопровождение кода. Возможно, лучше разделить это на две функции: одна для проверки правильного ответа, а вторая для получения ввода и вывода на печать.Чтобы разрешить повторное использование кода, я бы добавил
main
функция и идиоматикаif __name__ == "__main__": main()
строки в нижней части скрипта, чтобы его запустить. По сути, если вы просто импортируете свой файл в другой, ничего не должно печататься при импорте. Прямо сейчас невозможно чисто импортировать из скрипта:
$ python Python 3.9.1 (default, Dec 13 2020, 11:55:53) [GCC 10.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import q Welcome to guess the number!! You have 5 trys to guess the number Good Luck!! I'm thiking in a number from 0 to 100 Your guessing is?
Предлагаю реорганизовать его следующим образом:
import random
def guess_number (answer):
for num_tries in range(5):
try:
guess = int(input("Your guess: "))
except:
break
if guess < answer:
print ("Too low")
elif guess > answer:
print ("Too high")
else:
print ("Yes! It's right!")
return
print("Wow, your guesses are over!")
print(f"The number was {answer}")
print("Welcome to guess the number!")
print("You have 5 tries to guess the number")
print("Good Luck!")
print("I'm thinking of a number from 0 to 100")
my_num = random.randint(0, 100)
guess_number(my_num)
Ниже приведены некоторые комментарии к вашему коду:
def guess_number (answer):
# Needs a better name. Also, plural of try is tries:
trys = 0
while trys < 5:
# guess is a better name.
guessing = int(input("Your guessing is? "))
if guessing == answer:
print ("Yes!! it's Right!!")
# change to return:
break
elif guessing < answer:
# Improve the message - it is not clear:
print ("Big")
elif guessing > answer:
print ("smaller")
# Use a for loop instead, which combines incrementing
# and < 5 check:
trys = trys+1
# It is 5 anyway, after the while loop exits. Remove this if:
if trys == 5:
print("WoW, your trys are over , try again!!")
# Use an f-string instead:
print("The number was ", answer)
print("Welcome to guess the number!!")
print("You have 5 trys to guess the number")
print("Good Luck!!")
print("I'm thiking in a number from 0 to 100")
print('')
# import should be at the top:
import random
# use a better name:
num_right = random.randint(0,100)
guess_number(num_right)
```
Я должен здесь добавить, что вы всегда должны проверять / дезинфицировать вводимые пользователем данные.
guessing = int(input("Your guessing is? "))
Преобразование простого пользовательского ввода в int
, без проверки может вызвать проблемы. Я бы предложил создать isInteger(something: str)
(что-то всегда будет строкой), чтобы проверить это.
def safeInt(something: str): # maybe you could be more creative with that name
""" If `something` can be converted to an int return that otherwise reutrn False """
try:
return int(something)
except ValueError:
return False
И теперь вы можете снова и снова спрашивать пользователя, input
это неверно
while trys < 5:
guessing = input("Your guessing is? ")
# Keep asking until you get a valid response
while type(guessing := safeInt(guessing)) != int: # walrus operator
guessing = input("You did not enter a valid int. Your guessing is? ")
# Once this point is reached `guessing` will be an `int`.
# guessing := safeInt(guessing) sets guessing = safeInt(guessing)
# and evaluates `type(safeInt(guessing)) != int` at the same time
Кстати, if trys == 5
избыточно. То есть, потому что это происходит после while trys < 5
который выйдет один раз tries >= 5
и потому что вы увеличиваете на 1
, когда цикл разрывается, trys
будет точно 5
. Можно с уверенностью сказать, что вы можете удалить это if
заявление.
Хорошая концепция, за исключением функции с возвращаемым типом Union[int, Literal[False]]
Я бы предпочел просто поймать ValueError
в функции с input
вызов.
— l0b0
спасибо за отзыв, я еще новичок и у меня есть некоторые термины, которые я никогда раньше не видел, например isort, но я ищу в Google, так что нет проблем. Мне есть над чем работать и над чем работать. еще раз спасибо, попробую применить ваши советы ^ _ ^.
— Джон Лопес