【问题标题】:How to repeat the input until a special condition is met in Python?如何重复输入直到满足 Python 中的特殊条件?
【发布时间】:2022-11-23 07:59:45
【问题描述】:

我需要从用户那里获取整数输入并将它们添加到一个集合中。整数的数量未知。当用户输入“完成”时,输入过程将结束。

这是我的代码:

s = set()
print('Please type the number, when you are done please type "Done":')
while True:
    try:
        a = int(input())
        s.add(a)
    except:
        if a == "Done":
            break
        else:
            print('Integer only, please re-type:')
            continue
print(s)

但它没有按预期工作。

我的想法很简单。如果用户键入一个整数那么没关系,只需添加到集合s。如果他们输入一个字符串(int(input() 是错误的),那么它将下降到 except,如果字符串是“完成”,则打破 while True 循环,如果不是,则要求用户重新输入并继续循环。

如果我先输入字符串然后正常输入,则会出现以下错误:

我尝试在开始时使用一个简单的 if-else 语句,但它会在 int(input()) 处引起回溯。

【问题讨论】:

  • a 不是字符串,所以它永远不会等于“完成”
  • 首先将输入保存在变量a = input()中,然后尝试将其转换为int并将其添加到集合s.add(int(a))中。如果失败,a 将保留输入的值,您可以将其与 'DONE' 进行比较
  • @Jacques Gaudin 谢谢。下面有一个人的答案和你的想法一样。

标签: python user-input try-except


【解决方案1】:

使用 iter 的双参数形式读取输入,直到输入 Done。您可以迭代生成的迭代器,处理整数转换并更新 for 循环主体中的集合。

s = set()
def get_input():
    return input('''Please type the number, when you're done please type "Done": ''')

for x in iter(get_input, "Done"):
    # x is guaranteed to *not* be Done here, or the loop
    # would have already exited.
    try:
        a = int(x)
    except ValueError:
        print("Integer only, please re-type")
        continue
    s.add(a)

如果您不关心错误处理,则可以将其简化为一个集合理解:

s = {int(x) for x in iter(get_input, "Done")}

【讨论】:

  • 谢谢你。但是我还没有学会iter方法。我现在正在谷歌上对 iter 方法进行一些研究。看起来像一个有用的方法。
  • 非常简单:调用第一个参数,产生它的返回值,直到它返回第二个参数。好处是它将决定何时停止迭代的逻辑与迭代时做什么的逻辑分开了还在迭代。
【解决方案2】:

当异常发生时,a 保持未设置状态。试试这个。

s = set()
# Notice also correct quoting
print("Please type the number, when you're done please type 'Done':")
while True:
    a = input()
    try:
        n = int(a)
        s.add(n)
    # Avoid blanket except
    except ValueError:
        if a == "Done":
            break
        else:
            print('Integer only, please re-type:')
            continue
print(s)

【讨论】:

  • 非常感谢它有效!哦,它应该是 s.add(n) 而不是 set.add(n)。不过,我真的很感激!
  • 我认为我们仍然可以在 except 块中删除 if else 并只保留异常消息
【解决方案3】:

首先将输入作为字符串,然后在添加到集合之前将其转换为整数。这样您就可以检查用户输入的值是否为“完成”,如果是则退出循环。

类似于下面的代码。另请检查代码中的一些语法错误。

s = {}
print('Please type the number, when you're done please type "Done":')
while True:
    a = input()
    if a == 'Done':
        break
    else:
        try:
            s.add(int(a))
        except:
            print('Integer only, please re-type:')
print(s)

【讨论】:

    【解决方案4】:

    您可以尝试下面的代码。

    s = set()
    print('Please type the number, when you're done please type "Done":')
    while True:
        try:
            a = input()
            if a == "Done":
                break
            s.add(int(a))
        except:
            if a == "Done":
                break
            else:
                print('Integer only, please re-type:')
                continue
    print(s)
    

    【讨论】:

      【解决方案5】:
      s = set()
      b = True
      
      print("Please type the number, when you're done please type 'Done'.")
      
      while b:
          try:
              a = input("Input: ")
              if a == "Done":
                  b = False
                  break
              a = int(a)
              s.add(a)
          except ValueError:
              print("Whoops, please type an integer!")
      print(s)
      

      【讨论】:

        猜你喜欢
        • 2020-12-18
        • 2022-01-14
        • 1970-01-01
        • 2018-11-09
        • 2018-03-13
        • 2015-07-28
        • 1970-01-01
        • 2019-11-07
        • 2015-06-27
        相关资源
        最近更新 更多