Python:使用raw_input接收的字符串表现很奇怪

时间:2015-08-02 17:25:46

标签: python raspberry-pi

在我使用遥控遥控车的过程中,我遇到了一个问题:汽车是用简单的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("?")

2 个答案:

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

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