Угадай номер Обратная связь Пожалуйста

В эти дни я начал изучать 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 ответа
3

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

  1. black и isort можно переформатировать этот код, чтобы он стал более идиоматическим, не изменяя функциональность.

  2. 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
    
  3. Множественное число от «пытаться» — «пытается».

  4. trys += 1 синтаксический сахар для trys = trys + 1.

  5. Код смешивает ввод / вывод (input/print) и логики, что обычно усложняет сопровождение кода. Возможно, лучше разделить это на две функции: одна для проверки правильного ответа, а вторая для получения ввода и вывода на печать.

  6. Чтобы разрешить повторное использование кода, я бы добавил 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? 
    

  • 1

    спасибо за отзыв, я еще новичок и у меня есть некоторые термины, которые я никогда раньше не видел, например isort, но я ищу в Google, так что нет проблем. Мне есть над чем работать и над чем работать. еще раз спасибо, попробую применить ваши советы ^ _ ^.

    — Джон Лопес

Предлагаю реорганизовать его следующим образом:

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


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

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