使用生成器整理多行的用户输入
Using generator to collate user inputs on multiple lines
我想在这里节省一些内存 - 我正在构建一个程序,用户可以在其中输入一个(堆叠的)整数列表,例如:
1
2
3
4
5
.
.
.
下面的代码很好用!
input_list = []
while True:
try:
line = input()
except EOFError:
break
input_list.append(int(line))
print(input_list)
但是我现在想使用某种生成器表达式来仅在需要时计算列表,并且我几乎(啊!)到了那里。
此代码有效:
def prompt_user():
while True:
try:
line = input()
except EOFError:
print(line)
break
yield line
input_list = (int(line) for line in prompt_user())
print(list(input_list))
只有一个庸医:用户输入的最后一个整数总是被省略。例如(^D
是我在 pycharm 调试器的控制台输入 CTRL+D):
1
2
3
4^D
3 # ==> seems like after the EOF was detected the integer on the same
# line got completely discarded
[1, 2, 3]
我真的不知道如何更进一步。
感谢@chepner 和 this other thread 我将整个逻辑简化为:
import sys
N = input() # input returns the first element in our stacked input.
input_list = map(int, [N] + sys.stdin.readlines())
print(list(input_list))
利用 sys.stdin
已经可迭代的事实!
我想在这里节省一些内存 - 我正在构建一个程序,用户可以在其中输入一个(堆叠的)整数列表,例如:
1
2
3
4
5
.
.
.
下面的代码很好用!
input_list = []
while True:
try:
line = input()
except EOFError:
break
input_list.append(int(line))
print(input_list)
但是我现在想使用某种生成器表达式来仅在需要时计算列表,并且我几乎(啊!)到了那里。
此代码有效:
def prompt_user():
while True:
try:
line = input()
except EOFError:
print(line)
break
yield line
input_list = (int(line) for line in prompt_user())
print(list(input_list))
只有一个庸医:用户输入的最后一个整数总是被省略。例如(^D
是我在 pycharm 调试器的控制台输入 CTRL+D):
1
2
3
4^D
3 # ==> seems like after the EOF was detected the integer on the same
# line got completely discarded
[1, 2, 3]
我真的不知道如何更进一步。
感谢@chepner 和 this other thread 我将整个逻辑简化为:
import sys
N = input() # input returns the first element in our stacked input.
input_list = map(int, [N] + sys.stdin.readlines())
print(list(input_list))
利用 sys.stdin
已经可迭代的事实!