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('?')

您也不必在将命令设置为新值之前将其清零,因为它无论如何都会被覆盖。