Python:使用 raw_input 接收的字符串表现异常
Python: strings received with raw_input behave strange
在遥控遥控车上工作期间,我遇到了一个问题:汽车是通过一个简单的 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("?")
使用 elif 而不是 if。在您当前的代码中,每个 if 块都被执行。 else 块仅属于最后一个 if 语句。如果最后一个失败,则执行 else 块。所以,即使输入是"forwards",也有两块执行-
if command=="forwards":
块
- 唯一的 else 块(因为最后一个
if
是 false)
因此,您收到 "Invalid input, try again"
消息。
使用 elif 而不是每个 if(当然第一个除外),以便只执行一个块。
如果我们简化您的代码结构,它最终会大致如下所示:
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
,所以您遇到了 else 情况——"invalid input" 情况。
要解决此问题,您应该将所有 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('?')
您也不必在将命令设置为新值之前将其清零,因为它无论如何都会被覆盖。
在遥控遥控车上工作期间,我遇到了一个问题:汽车是通过一个简单的 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("?")
使用 elif 而不是 if。在您当前的代码中,每个 if 块都被执行。 else 块仅属于最后一个 if 语句。如果最后一个失败,则执行 else 块。所以,即使输入是"forwards",也有两块执行-
if command=="forwards":
块- 唯一的 else 块(因为最后一个
if
是 false)
因此,您收到 "Invalid input, try again"
消息。
使用 elif 而不是每个 if(当然第一个除外),以便只执行一个块。
如果我们简化您的代码结构,它最终会大致如下所示:
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
,所以您遇到了 else 情况——"invalid input" 情况。
要解决此问题,您应该将所有 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('?')
您也不必在将命令设置为新值之前将其清零,因为它无论如何都会被覆盖。