问题分析
当我们不知道输入的行数时,最直观的方法就是一直读取输入,直到遇到一个特定的结束标记或达到档案结尾。Python 提供了几种方式来处理这种情况。
解决方案
- 方法一:使用 while 迴圈和 input()
#初始化一个空字符串 result 用来储存最终的结果。
result = ""
#使用 while True 创造一个无限循环。
while True:
line = input()
# 当用户输入内容为空行并按下enter后,表示输入结束,跳出循环。
if not line:
break
result += line + "-"#将读取到的行连同 - 拼接至 result。
print(result)
优点:简单易懂,适合初学者。可以灵活处理各种输入。
- try excpet 预期使用者可能会输入不符合预期格式的数据时使用 try-except 处理不定行输入的优点:
- 错误处理: 可以捕获并处理各种异常,例如 ValueError(当输入无法转换为预期数据类型时)、EOFError(当遇到输入结束符时)等。
- 程式稳定性: 即使使用者输入错误,程式也不会突然终止,而是会进入 except 块,进行相应的处理。
- 弹性: 可以根据不同的异常类型,採取不同的处理措施。
while True:
try:
user_input = input()
if not line:
break
result += line + "-"
except EOFError:
print("输入结束")
break
print(result)
- 使用生成器表达式优化使用 while 迴圈和 input()
def generate_result():
result = ""
while True:
line = input()
if not line:
break
yield result + line + "-"
result = ""
result = "".join(generate_result())
print(result)
为什么使用生成器函数?
- 节省记忆体: 它不会一次性将所有结果都存储在记忆体中,而是在每次迭代时生成一个值,这样可以处理非常大的数据集。
- 提高效率: 生成器函数可以更早地产生结果,不需要等到所有数据处理完毕。解析code:yield result + line + "-"yield 关键字将函数变成一个生成器。每次调用 generate_result() 时,都会从上一次离开的地方继续执行,直到遇到下一个 yield 表达式或函数结束。在这里,它会将当前的 result、读取的 line 以及连接符 - 拼接起来,并作为生成器的返回值。
- 方法二:使用 sys.stdin.readline()
import sys
result = ""
for line in sys.stdin:
line = line.rstrip() # 去除行尾的换行符
result += line + "-"
print(result)
优点:更接近底层,效率更高。可以处理较大的输入。
注意事项
输入结束标记: 在某些特定情况下,你可以使用一个特定的字符串作为输入结束的标记,例如 exit。档案输入: 如果输入来自一个档案,可以使用 with open(\'filename\', \'r\') as f: 来打开档案,然后逐行读取。Python 版本: 不同版本的 Python 在处理输入方面可能略有差异。编码: 如果输入包含非 ASCII 字符,需要指定适当的编码,例如 encoding=\'utf-8\'。范例:从档案读取并处理
with open(\'input.txt\', \'r\') as f:
result = ""
for line in f:
line = line.rstrip()
result += line + "-"
print(result)
拓展
多种分隔符: 可以根据需求使用不同的分隔符,例如空格、逗号等。忽略空行: 如果要忽略空行,可以在判断条件中加入 if line.strip():。处理特殊字符: 如果输入包含特殊字符,需要进行转义或使用 raw_string。
选择最适合的方法
互动式输入: 使用 input() 较为直观。档案输入: 使用 sys.stdin 或 with open() 更高效。性能要求: 对于大规模输入,sys.stdin 可能会有更好的性能。
总结
通过以上方法,我们可以有效地处理未知行数的输入,并根据需求进行定制。选择哪种方法主要取决于具体的应用场景和对性能的要求。