我试图从控制台获取由换行符分隔的多个名称并将它们放入变量中。让我们假设我想永远从终端获得输入(我将添加一些代码以便稍后退出循环)。我知道如何使用while循环和递归来完成它,但我希望能够使用for循环来完成它。
在下面的例子中,当我从终端获得"peter"
作为输入时,我得到的每个字母而不是一行一行:
for name in input():
print(name)
现在,如果我使用sys.stdin
name
变量变为"peter\n"
:
for name in sys.stdin:
print(name)
是否有一种简单的方法可以让input()
为"name"
提供整行而不是单个字符?或者仅仅通过使用for in
的本质,我将迭代输入中的字符?以这种方式获取输入是否存在任何固有的风险/问题?是否有"标准"在这种情况下获取输入的方式?
我在Ubuntu 15.10上使用Python 3.5.1。
答案 0 :(得分:7)
您可以将stdin
换行以删除换行符;如果你可以删除所有尾随空格(通常没问题),那么它只是:
for name in map(str.rstrip, sys.stdin):
...
你在Py3上,所以它按原样运行;如果您使用的是Py2,则需要添加导入from future_builtins import map
,这样您就会得到一个基于生成器的惰性map
(因为它们会生成这些行)请求,而不是在stdin
结束之前啜饮,然后返回所有行的list
。
如果您需要限制换行符,则生成器表达式可以执行此操作:
for name in (line.rstrip("\r\n") for line in sys.stdin):
...
或者使用导入允许map
将工作推送到C层以获得(略微)更快的代码(每行30个纳秒的速度比genexpr快,但仍然每行40 ns比这个答案顶部的无争议选项):
from operator import methodcaller
for name in map(methodcaller('rstrip', '\r\n'), sys.stdin):
...
与第一个解决方案一样,在Py2上,请务必从map
获取future_builtins
。
答案 1 :(得分:0)
我不建议你这样做,但你可以创建一个在for
循环中使用的生成器来逐行迭代输入:
def getlines():
while True:
yield input()
for name in getlines():
print(name)
## Remember to break out of the loop at some point