【问题标题】:Ending a loop without going back to the start (Python)结束循环而不回到开始(Python)
【发布时间】:2018-02-22 07:25:09
【问题描述】:

我正在尝试创建一个连续的用户输入,但如果输入了错误的信息,我不希望它从头开始重新启动。例如,

a = 1
while a ==1:
    Number = raw_input("Number: ")
    if len(Number) != 3:
        print "\n Error, please enter 4 digits \n"
    else:    
        Day = raw_input("Day: ")
        if not Day.isdigit():
            print "\n Error, please enter day in digits \n"

在这里,如果该人在第一次输入时输入了非 4 位数字,则循环将结束并再次返回开始。但是,如果他到达第二个输入并输入一个非数字字符串,则循环也将结束并返回到开始。我如何让它不回到开始,而是再次请求这一天?

【问题讨论】:

  • 循环a==1 的条件永远不会变为假,因为a 永远不会改变。如果要结束循环,请更改a
  • 循环的全部意义在于它回到起点,这就是为什么它是一个循环..也许你不需要循环?请澄清您的问题
  • 我不想结束循环,因为我希望用户继续输入数据,并且我可以选择让用户手动结束循环。也许我不应该使用循环,这就是我的问题:还有其他选择可以做我想做的事吗?

标签: python loops user-input


【解决方案1】:
def myMethod():
    a = 1
    while True:
        if a is 1 and len(raw_input("NUMBER: ")) is not 3:
            print "ERROR IS HERE IN NUMBER"
        else:
            a = 2
            if a is not 1 and raw_input("DAY: ").isdigit() is True:
                a = 1
            else:
                print "ERROR IS HERE IN DAY"
myMethod()

您可以将其用于您的目的。关键是您需要维护一个密钥来检查 DAY 或 NUMBER 是否有错误。

如果您需要任何其他说明,请告诉我。 这会问你 DAY: 和 NUMBER: 无限

【讨论】:

    【解决方案2】:

    你可以通过函数来​​简化:

    def input_number(prompt, digits_num=0):
        while 1:
            s = raw_input(prompt)
    
            if not s.isdigit():
                print "\n Error, please input digits \n"
                continue
    
            if digits_num:
                if len(s) != digits_num:
                    print "\n Error, please enter %d digits \n" % digits_num
                    continue
    
            result = int(s)
            break
    
        return result
    
    
    number = input_number("Number: ", 4)
    day = input_number("Day: ")
    
    print "\n number=%d, day=%d" % (number, day)
    

    【讨论】:

    • 这很好用。我可以将它用于其他用户输入。非常感谢。
    【解决方案3】:

    为此,您需要两个单独的 while 循环。一个用于number,另一个用于day。这是更正后的代码:

    number = ""
    day = ""
    
    while True:
        number = raw_input("Number: ")
        if not number.isdigit() or len(number) != 4:
            print "Error, Please enter a 4 digit number \n"
        else:
            break
    
    
    while True:
        day = raw_input("Day: ")
        if not day.isdigit():
            print "\n Error, please enter day in digits \n"
        else:
            break
    
    print "Number: ", number
    print "Day: ", day
    

    【讨论】:

      【解决方案4】:

      如果您可以使用 Python 3,请在此类场景中将 Enum 用于生产级代码。您始终可以根据需要操纵条件。我们开始吧:

      from enum import Enum
      
      class Status(Enum):
          START = 1
          ‎MIDDLE = 2
          ‎END = 3
      
      state = Status.START
      
      while state != Status.END:
          while state == Status.START:
          ‎    Number = input("Number:")
          ‎    if len(Number) != 3:
          ‎        print("Invalid Number !")
          ‎    else:
          ‎        state = Status.MIDDLE
      
          while state == Status.MIDDLE:
          ‎    Day = input("Day:")
          ‎    if not Day.isdigit():
          ‎        print("Invaid Day !")
          ‎    else:
          ‎        state = Status.END 
          ‎
      

      【讨论】:

        【解决方案5】:

        在输入有效之前引发异常

        a = 1
        while a ==1:
            try:
                Number = input("Number: ")
                if len(Number) != 3:
                    print("\n Error, please enter 4 digits \n")
                    raise RuntimeError()
            except RuntimeError:
                continue
            break
        

        【讨论】:

        • 请适当地格式化您的代码,并且不要使用简单分配可以完成工作的异常。
        • continue 替换raise RuntimeError() ...摆脱try/except
        猜你喜欢
        • 2015-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-30
        • 2019-03-30
        • 2018-04-13
        • 2019-05-12
        • 2016-01-30
        相关资源
        最近更新 更多