的@誠的例子的改進版本:
def player1():
x = raw_input("please select: Rock(r)/Paper(p)/Scissors(s): ").lower()
while True:
if x in ['r', 'p', 's', 'rock', 'paper', 'scissors']:
return x[0]
else:
print "Error - wrong input!"
x = raw_input("please select: Rock(r)/Paper(p)/Scissors(s): ").lower()
這是多一點簡潔比許多or
表情,如果你有很多的條件要檢查它變得有點笨拙!
一點解釋:
我們檢查,看看x
(我們的用戶輸入)爲有效輸入預先定義的列表。
一個甚至這成爲可重用更一般化版本:
實施例:(可重複使用的,非遞歸:)
#!/usr/bin/env python
from __future__ import print_function # For Python 2/3 compat
try:
input = raw_input # For Python 2/3 compat
except NameError:
pass
def prompt(prompt="Enter: ", valid=None):
s = input(prompt)
while valid and s not in valid:
print("Invalid input! Please try again. Valid inputs are {0:s}".format(" ".join(valid)))
s = input(prompt)
return s
x = prompt("Enter action ([r]ock, [p]aper, [s]cissors): ", ["r", "p", "s", "rock", "paper", "scissors"])
演示:
$ python foo.py
Enter action ([r]ock, [p]aper, [s]cissors): a
Invalid input! Please try again. Valid inputs are r p s rock paper scissors
Enter action ([r]ock, [p]aper, [s]cissors): foo
Invalid input! Please try again. Valid inputs are r p s rock paper scissors
Enter action ([r]ock, [p]aper, [s]cissors): r
$ python foo.py
Enter action ([r]ock, [p]aper, [s]cissors): a
Invalid input! Please try again. Valid inputs are r p s rock paper scissors
Enter action ([r]ock, [p]aper, [s]cissors): foo
Invalid input! Please try again. Valid inputs are r p s rock paper scissors
Enter action ([r]ock, [p]aper, [s]cissors): rock
PS:對不起,我沒有用遞歸回答你的問題。 IHMO對於遞歸不是一個好的用例。 呵呵 :)然而;這是很容易改變:
例子:(可重複使用的,遞歸)
def userprompt(prompt="Enter: ", valid=None):
s = input(prompt)
while valid and s not in valid:
print("Invalid input! Please try again. Valid inputs are {0:s}".format(" ".join(valid)))
s = userprompt(prompt, valid)
return s
在發佈的代碼中的評論狀態'#我知道我可以運行一個While循環,但我需要這樣運行它.'似乎需要@JMG來進行遞歸調用。正如@kirelagin指出的那樣,在你的'else'中你需要:'return player1()' – Scott
嗯(*我錯過了這個!*);但是,這不是一個遞歸IHMO的好用例:) –