【问题标题】:Way to loop from the middle of the while loop从while循环中间循环的方式
【发布时间】:2018-06-13 07:52:38
【问题描述】:

我有 2 个输入要输入,如果用户输入不正确的输入,我想遍历它们。我所做的是我设置为 True 然后尝试和 except 然后继续。但是,如果输入错误,则在第二个输入的情况下,整个循环将从头开始重复 - 即从第一个输入开始。我希望从第二个输入重复它。我能想到的唯一一件事是在第一次正确输入后在代码中添加中断,然后为第二次输入设置另一个 while True。有什么更好的方法来做到这一点?

while True:
    try:
        a = int(input("Type positive integer: "))
    except ValueError:
        print(" Enter a positive NUMBER!")
        continue
    if a <= 0:
        print("Input can't be 0 or negative!")
        continue
    else:
        try:
            b = int(input("Type second positive integer: "))
        except ValueError:
                print(" Enter a positive NUMBER!")
                continue
        if b <= 0:
            print("Input can't be 0 or negative!")
            continue
        else:
            break

【问题讨论】:

  • 没有比这更好的方法了。
  • 您不需要第一个 else: 子句,因为您正在跳出循环。删除 else: 并取消缩进其余部分会使其更具可读性。
  • 您可以将它们保存在一个元组中,对两个变量使用相同的循环,一旦正确输入第一个数字,将元组索引从 0 增加到 1。
  • 您可以将 while 循环放在 for 循环中。这将删除相当多的重复代码。
  • Paul Panzer 能否举一个 for 循环的例子。具体来说,该循环中的迭代器是什么?

标签: python python-3.x


【解决方案1】:

由于每个循环的条件相同,您可以尝试将 try-except 部分存储为返回值的函数(或指示成功或失败的布尔值,并带有该值的参数),在为您需要的每个输入进行 for 循环,将结果存储在列表中,然后将您需要的内容作为元组获取。

例如

def try_get_number_input():
    try:
        value = int(input("Type positive integer: "))
    except ValueError:
        print(" Enter a positive NUMBER!")
        return False, 0
    if value <= 0:
        print("Input can't be 0 or negative!")
        return False, 0

    return True, value


# We require 2 inputs from the user
required_inputs = 2
received_inputs = []
for num in range(0, required_inputs):
    values = try_get_number_input()
    while not values[0]:
        values = try_get_number_input()

    received_inputs.append(values[1])

这可确保代码是 DRY(不会重复自身)并且易于更改(如果您需要 3 个输入,则可以轻松更改它,而不必添加 while 循环的另一个分支)

【讨论】:

    【解决方案2】:
    def getNumber(second=False):
        while True:
            try:
                if second:
                    number = int(input("Type second positive integer: "))
                else:
                    number = int(input("Type positive integer: "))
            except ValueError:
                print(" Enter a positive NUMBER!")
                continue
            if number <= 0:
                print("Input can't be 0 or negative!")
                continue
            return number
    
    a, b =  getNumber(second=False),  getNumber(second=True)
    print(a,b)
    

    【讨论】:

      【解决方案3】:

      您问过for 循环是什么样的,这里有一个例子:

      vals = []
      for msg in ['', 'second ']:
          while True:
              try:
                  n = int(input(f"Type {msg}positive integer: "))            # PY3.6
                  # n = int(input("Type {}positive integer: ").format(msg))) # <=PY3.5
              except ValueError:
                  print(" Enter a positive NUMBER!")
                  continue
              if n <= 0:
                  print("Input can't be 0 or negative!")
                  continue
              vals.append(n)
              break
      a, b = vals
      

      【讨论】:

        【解决方案4】:

        您可以使用装饰器进行重试逻辑和单个函数来读取 int 值

        def retry(func):
            def wrapper(msg):
                while True:
                    try:
                        return func(msg)
                    except Exception as e:
                        print(e)
            return wrapper
        
        @retry
        def read_int(msg):
            try:
                a = int(input(msg))
            except:
                raise ValueError('Invalid Number')
            else:
                if a < 0:
                    raise ValueError('Number should be positive')
            return a
        
        
        a = read_int('type valid positive number: ')
        b = read_int('type other valid positive number: ')
        print(a, b)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-04-24
          • 2014-11-02
          • 1970-01-01
          • 1970-01-01
          • 2011-04-07
          • 2016-11-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多