在我使用遥控遥控车的过程中,我遇到了一个问题:汽车是用简单的CLI控制的,有时当我输入正确的命令时,CLI说它们是不正确的,即使他们不是。
下面你会看到导致整个问题的代码。有人可以解释这种行为,并在最好的情况下给出一个解决方案?
command = raw_input("?")
while command != "quit":
if command == "forwards":
forwards()
command = 0
command = raw_input("?")
if command == "backwards":
backwards()
command = 0
command = raw_input("?")
if command == "left forwards":
leftforwards()
command = 0
command = raw_input("?")
if command == "right forwards":
rightforwards()
command = 0
command = raw_input("?")
if command == "right backwards":
rightbackwards()
command = 0
command = raw_input("?")
if command == "left backwards":
leftbackwards()
command = 0
command = raw_input("?")
if command == "selftest":
selftest()
command = 0
command = raw_input("?")
if command == "help":
help()
command = 0
command = raw_input("?")
if command == "distance":
navix()
print navix_distance
command = 0
command = raw_input("?")
else:
print("Invalid input, try again")
command = 0
command = raw_input("?")
答案 0 :(得分:2)
使用elif而不是if。在您当前的代码中,执行每个if块。 else块仅属于最后一个if语句。如果最后一个失败,则执行else块。因此,即使输入是"前进",也有两个部分执行 -
if command=="forwards":
阻止if
是假的)因此,您会收到"Invalid input, try again"
消息。
使用elif代替每个if(当然除了第一个),这样只执行一个块。
答案 1 :(得分:1)
如果我们简化代码的结构,它最终会看起来像这样:
command = raw_input('?')
while command != 'quit':
if command == 'forwards':
forwards()
if command == 'backwards':
backwards()
# ...snip...
if command == "distance":
navix()
else:
print('invalid input')
现在,假设您在被要求输入时输入forwards
。那么,你点击第一个if语句,这是真的,并执行正确的命令。
但是,当你点击最后一个if / else语句时会发生什么?好吧,command
不等于distance
,所以你点击其他情况 - "无效输入"案件。
要解决此问题,您应该将所有if语句转换为if / elif / else语句 - 重构代码,以便一旦命令匹配,您将跳过所有其他语句。
你的代码中还有一堆重复。处理此问题的策略种类繁多,但至少应该合并代码以询问用户输入,而不是在每个子句中重复它:
command = raw_input('?')
while command != 'quit':
if command == 'forward':
forward()
elif command == 'backwards':
backwards()
# ...snip...
elif command == 'distance':
navix()
else:
print('invalid command')
command = raw_input('?')
在将命令设置为新值之前,您也不必将命令归零,因为它无论如何都会被覆盖。