这个Python程序能否简化或优化写作?

3

好的,我在过去的两三天里学了相当多的Python。 我决定将我的知识用于创建一个简单但有趣的游戏 - 猜数字游戏。

在大约30分钟内编写完这个程序并使其100%工作后,我在思考是否有什么可以做得更好的地方,等等。 我希望能从任何错误中吸取教训,所以感谢您!

以下是代码:

import random

def guessingGame():

    randomNumber = random.randrange(1, 10)
    yourGuess = int(input("Take A Guess, Numbers 1 Through 10: "))

    while yourGuess != randomNumber:
        print("DOH! You Did Not Guess Right, TRY AGAIN")
        yourGuess = int(input("Take A Guess, Numbers 1 Through 10: "))
    else:
        if yourGuess == randomNumber:
            print("Congrats You Beat The Guess Game!")

playGame = input("Would You Like To Play The Guessing Game (Y/N): ")

if playGame == "Y" or playGame == "y":
    print("Okay Lets Play!")
    guessingGame()

elif playGame == "N" or playGame == "n":
    print("Okay Thanks Anyways!")
    break

再次感谢您!

2
这个问题可能应该发布在 CodeReview 上。 - Joel Cornett
randrange(1, 10)将为您提供数字0-9。在此处查看文档。您要执行的操作是randrange(1, 11)或更明显的randint(1, 10) - Joel Cornett
在循环外使用 break 是语法错误。 - wim
谢谢你的建议,我并不是想添加break语句,它实际上并没有在程序中出现。但是,确实我完全忘记了使用randrange(1, 11)代替1到10之间的随机数。谢谢! - JenkinsDev
不需要在 else 中重新检查条件 - 你已经知道它是 ==。 - John3136
5个回答

4

不是

if playGame == "Y" or playGame == "y":
    print("Okay Lets Play!")
    guessingGame()

I kind of like

if playGame.lower() == "y":
    # ...

我更喜欢:

def quit():
    print("Okay Thanks Anyways!")


actions = {"y": guessingGame}
actions.get(playGame.lower(), quit)()

2

我注意到了几件事情:

  • 你应该处理用户尝试猜测不像数字的东西的情况,比如字母'a'。
  • Python风格指南建议在变量名中使用lower_with_underscores而不是CamelCase。
  • yourGuess = int(input("Take A Guess, Numbers 1 Through 10: "))是不必要的重复,下面是一种可能的重构方法。

一般清理:

import random

def guessing_game():
  random_number = random.randint(1, 10)
  assert random_number in range(1, 11)
  your_guess = None
  while your_guess != random_number:
    try:
      your_guess = int(input("Take A Guess, Numbers 1 Through 10: "))
    except ValueError:
      print("That wasn't a number")
      continue

    if your_guess != random_number:
      print("DOH! You Did Not Guess Right, TRY AGAIN")
    else:
      print("Congrats You Beat The Guess Game!")
      break

play_game = None
while play_game not in ['y', 'n']:
  play_game = input("Would You Like To Play The Guessing Game (Y/N): ").lower()

if play_game == "y":
  print("Okay Lets Play!")
  guessing_game()
else:
  assert play_game == "n":
  print("Okay Thanks Anyways!")

这里的一个缺点是,如果输入非数字,它仍然会执行your_guess != random_number检查,并从上一次循环/默认None值输出错误消息。将(不必要的) pass改为continue或将循环的剩余部分放入try语句的else中可能更好一些。 - Danica
是的,很好的发现...实际上我想写的是continue,但出于某种原因我写了一个无用的pass语句。 - wim

2
from random import randint

def getInt(prompt):
    while True:
        try:
            return int(input(prompt))
        except ValueError:
            print("That's no integer!")

def play():
    secret = randint(1,10)
    while True:
        guess = getInt("Take a guess (1-10):")
        if guess==secret:
            print("Congrats, you beat The Guess Game!")
            break
        else:
            print("D'oh! You guessed wrong. Try again!")

def main():
    while True:
        inp = input("Would you like to play The Guessing Game? (Y/N)").lower()
        if inp=="y":
            print("Okay, let's play!")
            play()
        elif inp=="n":
            print("Alright. Thanks anyways!")
            break
        else:
            print("You don't follow directions too good, eh?")

if __name__=="__main__":
    main()

1

我想你可以在while循环中使用"break"语句,例如

import random

def guessingGame():    
    randomNumber = random.randrange(1, 10)

    while True:

        yourGuess = input("Take A Guess, Numbers 1 Through 10: ")

        if !yourGuess.isdigit():
            print ("That's not a number!")
        elif int(yourGuess) not in range(1,10):
            print("I said between 1 and 10!")
        elif int(yourGuess) != randomNumber:
            print("DOH! You Did Not Guess Right, TRY AGAIN")
        else:
            break

    print("Congrats You Beat The Guess Game!")

playGame = input("Would You Like To Play The Guessing Game (Y/N): ")

if playGame.lower() == "y":
    print("Okay Lets Play!")
    guessingGame()

elif playGame.lower() == "n":
    print("Okay Thanks Anyways!")
    break

1

阅读有关命名约定和Python编程风格的Pep 8文档。

import random

def guessing_game(x=1, y=10):
    """
    A simple number guessing game.
    """
    while int(input("Take A Guess, Numbers 1 Through 10: ")) \
                                          != random.randrange(x, y):
        print("DOH! You Did Not Guess Right, TRY AGAIN")

    print("Congrats You Beat The Guess Game!")

    if input("Would You Like To Play The Guessing Game (Y/N): ") == 'Y':
        print("Okay Lets Play!")
        guessing_game()
    else:
        print("Okay Thanks Anyways!")

if __name__ == '__main__':
    guessing_game(1, 10)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接