首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让用户通过文本输入打破循环?

如何让用户通过文本输入打破循环?
EN

Stack Overflow用户
提问于 2020-12-04 16:06:31
回答 4查看 82关注 0票数 2

让我们假设一个老师想把n个学生加到数据库中。

代码语言:javascript
复制
n = 1000
students = dict(input("enter students name and grade. Example 'Student C: '").split()
    for _ in range(n))
print(students)

如果我们有1000名学生,这很好,但如果老师想在10名学生之后完成呢?有什么方法可以输入“退出”来中断循环吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-12-04 16:12:15

代码语言:javascript
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2020-12-04 16:18:21

不要将生成器表达式嵌入到对dict的单个调用中,而是在输入中处理时构建dict

代码语言:javascript
复制
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

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

代码语言:javascript
复制
from itertools import islice


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

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

代码语言:javascript
复制
from itertools import islice


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

最后,如果您只使用n作为一种避免永远读取输入的方法,您可以省略它,因为用户现在可以随时输入quit

代码语言:javascript
复制
students = dict(x.split() for x in iter(lambda: input("..."), "quit"))

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

代码语言:javascript
复制
from functools import partial


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

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

( iter的两个参数形式接受一个函数反复调用,并生成该函数的返回值,直到该函数返回第二个参数为止。iter(lambda: input("..."), n)等价于

代码语言:javascript
复制
def iter(f, stop):
    while True:
        x = f()
        if x == stop:
            break
        yield x

)

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

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

代码语言:javascript
复制
def islice(x, y):
    while y:
        yield next(x)
        y -= 1
票数 3
EN

Stack Overflow用户

发布于 2020-12-04 16:10:53

是的有办法。如果使用python 3,请使用the ()函数将输入的Stdin文本捕获为字符串。将该字符串与单词“退出”和条件if语句匹配。也就是说,如果字符串==“退出”,那么exit()或类似的东西。

一个更好的方法,我认为应该是问有多少条目是需要在开头不?而不是在while循环中不断地输入。只是我的0.2美分。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65146866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档