簡體   English   中英

猜數字游戲:我如何接受數字前面輸入“ guess =”的猜測?

[英]Number guessing game: How can I accept input that says “guess =” before the number?

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的新功能:)謝謝。

我將您的代碼復制並粘貼到Python 3.5中,..除了需要在while語句后縮進所有內容外,它還可以正常工作。

您是否僅輸入數字:30

...或“猜測= 30”? 因為那不是數字,所以確實會引起問題。 您只需要輸入號碼。 :)

如果要接受“猜測= 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?")

這兩行將使用正則表達式在處理之前去除任何非數字字符的輸入。

這取決於您在該課程中學到的知識,但是添加以下行應可以接受30guess = 30 (甚至foo=bar=30 ):

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

它僅使用=作為分隔符來分割輸入,並且僅使用最后一部分( [-1] )。

所以我重新排序了您的代碼:

  • 我將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:查找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

在repl.it在線嘗試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM