【问题标题】:How can I get a user to break out of a loop via text input?如何让用户通过文本输入跳出循环?
【发布时间】:2021-03-16 16:50:24
【问题描述】:

假设一位老师想要将 n 个学生添加到数据库中。

n = 1000
students = dict(input("enter students name and grade. Example 'Student C: '").split()
    for _ in range(n))
print(students)

如果我们有 1000 个学生,这很好,但如果老师想在 10 个学生之后完成呢?有没有办法可以输入“退出”来打破循环?

【问题讨论】:

  • input("") 保存到一个变量并检查它,如果它等于“退出”或其他什么,则使用break
  • 没有办法打破列表理解,而是使用循环。然后你可以检查输入并使用break
  • 欢迎来到 Stack Overflow! StackOverflow 不是免费的编码服务。你应该try to solve the problem first。请更新您的问题以在minimal reproducible example 中显示您已经尝试过的内容。如需更多信息,请参阅How to Ask,并拨打tour :)

标签: python list loops


【解决方案1】:

是的,有办法。如果您使用的是 python 3,请使用 input() 函数,它将输入的标准输入文本捕获到字符串中。将该字符串与单词“quit”和条件 if 语句匹配。即如果 string == "quit" 然后 exit() 或类似的东西。

我认为更好的方法是在开始时询问需要多少条目?而不是在while循环中不断输入输入。只是我的 0.2 美分。

【讨论】:

  • exit() 将杀死整个脚本,它们应该跳出循环。
  • '或类似的东西'。
  • breakexit() 根本不相似,恕我直言。
  • 他的意图是退出。无论如何,答案比比皆是。
  • 不,不是,他的目的是创建一个字典,其中包含在输入“quit”之前输入的所有名称。
【解决方案2】:

将用户的输入存储到一个变量中,如果是使用break语句退出循环或将输入添加到字典,则检查该值是否退出。

【讨论】:

    【解决方案3】:
    m = {}
    while True:
        grade = input("enter students name and grade. Example 'Student C: '").split()
        if grade[0] == 'quit':
           break
        else:
            m[grade[0]] = grade[1]
    
    
    print(m)
    

    【讨论】:

    • 这并不能解决提问者的问题
    • @YeshwinVermaTheProgrammer 怎么样?
    • 他希望用户继续输入数据,当数据退出时退出循环。
    • @YeshwinVermaTheProgrammer 这是解决没有 1000 名学生的相同问题的另一种方法。
    • 所以你应该在回答中包括它是一种不同的方式
    【解决方案4】:

    与其在对dict 的单个调用中嵌入生成器表达式,不如在处理输入时构建您的dict

    n = 1000
    students = {}
    for _ in range(n):
        x = input("enter students name and grade. Example 'Student C: '")
        if x == "quit":
            break
        # You might want to do more error checking here.
        student, grade = x.split()
        students[student] = grade
    

    更高级一点,如果输入quit,您可以使用iter(见下文)的两个参数形式终止循环,并使用itertools.islice将循环限制为n条目。

    from itertools import islice
    
    
    n = 1000
    students = {}
    for x in islice(iter(lambda: input("..."), "quit"), n):
        student, grade = x.split()
        students[student] = grade
    

    您可能会注意到,这允许您(在拆分输入行时忽略任何错误检查)在调用 dict 时回到您最初的生成器想法:

    from itertools import islice
    
    
    n = 1000
    students = dict(x.split() for x in islice(iter(lambda: input("..."), "quit"), n))
    

    最后,如果您只使用n 作为a 方式来避免永远读取输入,您可以省略它,因为用户现在可以随时输入quit: p>

    students = dict(x.split() for x in iter(lambda: input("..."), "quit"))
    

    另外,创建零参数可调用以用作iter 的第一个参数的另一种方法是使用functools.partial

    from functools import partial
    
    
    students = dict(x.split() for x in iter(partial(input, "..."), "quit"))
    

    iter(x, y) 是做什么的?

    (iter的双参数形式接受一个函数重复调用,并产生该函数的返回值,直到该函数返回第二个参数。iter(lambda: input("..."), n)相当于

    def iter(f, stop):
        while True:
            x = f()
            if x == stop:
                break
            yield x
    

    )

    islice(x, y) 是做什么的?

    这会产生一个新的迭代器,如果它有多个 y 元素,则它只返回 x 的第一个 y 元素。大致相当于

    def islice(x, y):
        while y:
            yield next(x)
            y -= 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-18
      • 2017-08-29
      相关资源
      最近更新 更多