用pyhon实现自动识别输入截止功能
一、 序言与题目引入
对于新接触编程语言如python和c的新同学来说,学校的oj平台上有很好配套练习,既有一定难度,又不会像LeetCode等程序员公用的成熟平台那样太难上手,不过学长学姐们在设计题目时为了增加趣味(或者恶趣味?),第一题的解答需要额外学一个知识点。
接下来看题:

初看这题只是简单的加减,如果我们直接上手解答,可以得到这些代码(python):

当然我们看到有部分代码功能重复,显得有些冗余,或许可以尝试优化成函数形式,并用map代替原有列表:

其实这个时候已经初见端倪了,输出要输出两遍呢,题目有说要输出几遍吗?暂且按下疑问,我们试运营看看

哎呀,果然出问题了,我们再细看要求,它说的是需要输入的一系列a和b对,也就是n对(a,b),但n却是未知数,我们并不知道输入的人会输入几对(a,b),也许是一对,也许像测试样例一样是两对,但也有可能是更多对。
这个时候很多人可能会想到循环,诶我循环读取不就好了吗,可以读取更多对数,但是循环的终止条件又该怎么设置呢?总不能让它一直循环,那就是死循环了,但如果设置了具体的数,那也还是预判了要输入的对数
所以遇到这样非固定的输入到底该怎么办呢?
二、 解题过程
2.1 用c语言解决
先注意看学长学姐们留下的小Tips——‘查查EOF’,哦?EOF又是什么呢?,我们来详细看看
(1)EOF定义
通过查询资料,我们可以了解到:
在编程中,EOF,即End of File,为文件结束符,它是一个标记,用于表示输入流(如文件、标准输入、管道等)的结束,它并非一个实际的字符,而是输入设备或系统在数据读取完毕后返回的 “终止信号”。
而在C语言中,EOF是一个预定义的宏(通常定义为-1),用于标记输入流的结束。大多数输入函数(如getchar()、fgets()、fscanf()等)会通过返回特定值来表示 “已读取到 EOF”。
(2)用c语言实操
简单来说,当系统在读取我们的输入时,只要捕捉到EOF这个终止信号,就会停止读取,这样说,只要我们在循环的过程中加入这个信号不就行了,如果一直没捕捉到就可以一直输入,输入结束后加入这个信号就能示意输入结束了,岂不是完美符合我们的要求。那么究竟可不可以呢,也得要我们来试试(记得切换成c语言):

可以看到我们将循环条件改成了只要没捕捉到终止信号就一直输入,结果是正确的。
tips:
这里值得一提的是,代码中的终止信号也就是EOF,在实际操作中发出与正常结束的回车不同,在本题不需要答题者实操,仅作了解,以下是两个系统的发送信号终止的操作:
Linux/macOS:在命令行输入时,按 Ctrl+D(直接按,无需额外回车),系统会向程序发送 “EOF 信号”,表示输入流结束。
Windows:在命令行输入时,按 Ctrl+Z,然后按回车,系统发送 EOF 信号。
2.2 用Python解决
虽然我们用EOF成功解决了这道题,但那是基于C语言解决的,如我一样常用python的人难道就解不了这道题吗?这自然是不可能的,直接的EOF用法只存于C语言,但类似的逻辑在大部分编程语言中都是存在的。
在python语言中没有像C语言那样的EOF宏,但可以通过异常捕获或迭代器特性来检测输入流的结束,其效果与C的EOF机制一致。
2.2.1 异常捕获
用input()+eoferror:input()函数用于读取一行输入(默认从标准输入stdin读取),当读取到 EOF 时会抛出EOFError异常,通过捕获该异常即可检测输入终止。
原理:
input()本质是从sys.stdin读取数据,当sys.stdin中没有更多数据(即 EOF)时,input()无法获取内容,因此抛出EOFError。

2.2.2 基于sys.stdin迭代器
sys.stdin是 Python 的标准输入流对象,它本身是一个可迭代对象,迭代时会自动逐行读取数据,直到 EOF 时终止迭代,无需手动处理异常。
原理:
sys.stdin的迭代器会在读取到输入流末尾(EOF)时自动停止,因此for line in sys.stdin循环会自然结束。
tips:sys.stdin读取的每行包含末尾的换行符(\n),需用strip()等方法处理。
