数字猜谜游戏:我怎样才能接受输入" guess ="在号码之前?

时间:2016-09-13 04:36:07

标签: python python-3.x

import random
guess = input("What is your guess?")
answer = random.randint(0,100)

while guess != answer:
    try:
        guess = float(guess)
        if guess > answer:
            print ("Your guess is too high!")
        elif guess < answer:
            print ("Your guess is too low!")
        elif guess == answer:
            print ("Congratulations!")
            break
        guess = input("What is your guess?")
        continue
    except ValueError:
        print ("Bad input. Try again!")
        guess = input("What is your guess?")

所以我的代码工作,但是当我输入例如:guess = 30时,输入似乎无效...我怎么能这样做才能接受它作为正确的猜测?

这里的python新手:) 感谢。

3 个答案:

答案 0 :(得分:0)

我将你的代码复制并粘贴到Python 3.5中,除了需要在while语句之后缩进所有内容之外,它还能正常工作。

您是否仅输入数字:30

......还是“猜= 30”?因为它确实会引起问题,因为它不是数字。 您只需输入数字。 :)

如果你想接受“guess = 30”,那么:

import random
import re ###<-Add this

guess = input("What is your guess?")
answer = random.randint(0,100)

while guess != answer:
    try:
        guess = re.sub("[^0-9]", "", guess) ###<- Add this
        guess = float(guess)
        if guess > answer:
            print ("Your guess is too high!")
        elif guess < answer:
            print ("Your guess is too low!")
        elif guess == answer:
            print ("Congratulations!")
            break
        guess = input("What is your guess?")
        continue
    except ValueError:
        print ("Bad input. Try again!")
        guess = input("What is your guess?")

这两行将使用正则表达式在处理之前去除任何非数字字符的输入。

答案 1 :(得分:0)

这取决于您在该课程中学到了多少,但添加以下行应该允许您同时接受30guess = 30(或甚至foo=bar=30):

...
while guess != answer:
    guess = guess.split('=')[-1]    # Add this line
    try:
        guess = float(guess)
        ...

它只是使用=作为分隔符拆分输入,并仅使用最后一部分([-1])。

答案 2 :(得分:0)

所以我重新排序了你的代码:

  • 我将try/except缩小到可能导致ValueError的行,因为这清楚地说明了这个except块试图处理的特定错误 - 将错误处理放在错误的来源。这也是continue的一个很好的理由,因为它现在跳过了“太高/太低”的代码,而不是在代码中它什么也没做。

  • 我更改了while循环条件,因此它显示while True:使其成为无限循环。在您的代码中,while guess != answer意味着它会在猜测正确时中断,您实际上使用break来退出循环,这样会产生误导。使用while guess != answer并且break没有任何地方是明智的,但如果你必须使用break作为任务的一部分,那么我的代码有一些'理由'来使用它(打破)无限循环)。

  • 我只将guess = input(...)代码移到循环中,因为它不需要在错误处理的顶部或内部复制。 (想象一下,如果你不得不改变文字,3个地方比1个地方更烦人。)

  • 有很多方法可以处理guess = 30输入。您可以通过查找if "guess = " in guess:来实现这一点,只有这样,然后如果该文本匹配,请使用guess = guess.replace("guess = ", "")将其替换掉,只留下数字。或者使用正则表达式,因为另一个答案用于删除文本和留下数字,或使用字符串split(),这是另一个答案。我在这里的答案有filter(),它使用测试过滤一些东西 - 在这种情况下,它测试某些东西是否为数字,并且只允许数字通过,因此它会丢弃所有文本。与正则表达式相同,实际上只是一种不同的方法。

代码:

import random

answer = random.randint(0,100)

while True:
    guess = input("What is your guess?")

    # filters out only the numbers
    # and makes them into a string, e.g.
    # 1) "guess = 30"
    # 2) [3,0]
    # 3) "30"
    guess = ''.join(filter(str.isdigit, guess))

    try:
        guess = float(guess)
    except ValueError:
        print ("Bad input. Try again!")
        continue

    if guess > answer:
        print ("Your guess is too high!")
    elif guess < answer:
        print ("Your guess is too low!")
    else:
        print ("Congratulations!")
        break

Try it online at repl.it