...序列永远不会停止。示例:1 2 -1 2 -3 -1 34 12 ............它永远不会停止。但是遇到-1就得停止阅读了。
raw_input() 总是读取整行。
如果您不想阅读整行;你可以试试sys.stdin.read(1):
import sys
def read_until_minus_one():
buf = []
seen_minus = False
while True:
char = sys.stdin.read(1)
if not char: # EOF
break
if char == '1' and seen_minus:
buf.pop() # chop the last minus
break # seen -1
else:
seen_minus = (char == '-')
buf.append(char)
return ''.join(buf)
print(read_until_minus_one())
12 22 -23 13 -12 23 -1 23 12
输出
12 22 -23 13
注意:一旦读取-1,它就会停止。在这种情况下,后续的sys.stdin.read(1) 返回'2'。
如果您只想在遇到-1 作为空格分隔标记(而不是像-12 中的数字的一部分)时才停止,那么输入解析可以分为两个阶段:
- 将输入拆分为以空格分隔的标记
- 在遇到
-1 之前获取令牌
#!/usr/bin/env python
import sys
from functools import partial
from itertools import takewhile
def get_tokens(stream=sys.stdin):
token = []
for char in iter(partial(stream.read, 1), ''):
if char.isspace(): # use any space as a separator
if token:
yield ''.join(token)
del token[:]
else:
token.append(char)
if token:
yield ''.join(token)
print(' '.join(takewhile(lambda s: s != '-1', get_tokens())))
12 22 -23 13 -12 23
注意:在这种情况下它会读取更多内容,因为在这种情况下-12 内部无法识别-1。
注意:您不需要curses 或other means of reading a single character from the user in this case。仅当输入是交互式的并且您希望在用户按下 Enter(或 EOF)之前获得内容时才需要它。
sys.stdin 默认被缓冲。因此.read(1) 可能在内部读取多个字符。如果我们是流的唯一消费者(很可能),那没关系,因为从我们的末尾.read(1) 总是一次返回一个字符。