Pet*_*erH 10 python python-3.5
我试图从控制台获取由换行符分隔的多个名称,并将它们放入变量中.让我们假设我想永远从终端获得输入(我将添加一些代码以便稍后打破循环).我知道如何使用while循环和递归来完成它,但我希望能够使用for循环来完成它.
在下面的例子中,当我"peter"从终端获得输入时,我得到的每个字母而不是一行一行:
for name in input():
print(name)
Run Code Online (Sandbox Code Playgroud)
现在,如果我使用sys.stdin的name变量变成"peter\n":
for name in sys.stdin:
print(name)
Run Code Online (Sandbox Code Playgroud)
是否有一种简单的方法可以input()提供"name"整行而不是单个字符?或者仅仅通过使用的本质for in我将迭代输入中的字符?以这种方式获取输入是否存在任何固有的风险/问题?在这样的情况下,是否有"标准"的输入方式?
我在Ubuntu 15.10上使用Python 3.5.1.
Sha*_*ger 10
您可以换stdin行去除换行符; 如果你可以删除所有尾随空格(通常没问题),那么它只是:
for name in map(str.rstrip, sys.stdin):
...
Run Code Online (Sandbox Code Playgroud)
你在Py3上,所以它按原样运行; 如果你在Py2上,你需要添加一个导入,from future_builtins import map所以你得到一个懒惰的,基于生成器的map(根据请求生成行,而不是stdin在它结束之前啜饮,然后返回list所有行中的一行) ).
如果您需要限制换行,生成器表达式可以执行此操作:
for name in (line.rstrip("\r\n") for line in sys.stdin):
...
Run Code Online (Sandbox Code Playgroud)
或者使用导入允许map将工作推送到C层以获得(略微)更快的代码(每行30个纳秒的速度比genexpr快,但仍然比每个行的40 ns慢于此答案顶部的无参数选项) ):
from operator import methodcaller
for name in map(methodcaller('rstrip', '\r\n'), sys.stdin):
...
Run Code Online (Sandbox Code Playgroud)
像第一个解决方案,对的Py2,确保获得map从future_builtins.