考试这道题,键盘输入一组人员的姓名、性别、年龄等信息,信息间采用空格分隔,每人一行,空行回车结束录入,参考答案是下面这个: fo = open("PY202.txt","w") data = input("请输入一组人员的姓名、性别、年龄:") # 姓名 年龄 性别 women_num = 0 age_amount = 0 person_num = 0 while data: name, sex, age = data.split(' ') if sex == '女': women_num += 1 age_amount += int(age) person_num += 1 data = input("请输入一组人员的姓名、性别、年龄:") average_age = age_amount / person_num fo.write("平均年龄是{:.1f} 女性人数是{}".format(average_age, women_num)) fo.close() 这道题有没有注意到 data = input("请输入一组人员的姓名、性别、年龄:"),
写了两处是不是冗余代码了,
为啥在循环前来一次 data = input("请输入一组人员的姓名、性别、年龄:"),
这样写法是不是错误,实际工作中有这样写法吗
问题2:这种写法是不是可以处理边界值问题
就像用c求一个数字有几位数,也是提前: #include <stdio.h> int main(){ int a; int n = 0; scanf("%d",&a); a/=10; n++; while(a>0){ a/=10; n++; } printf("%d",n); return 0; }
其实你已经敏锐地捕捉到了两种不同场景下的 “预处理”思想
Python 中的 “预读(Priming Read)”:为什么需要?
核心目的:让 while 循环有条件可判
data = input(...) # ← 预读 while data: # 处理 data = input(...) # 再读
while (data := input(...)): # Python 3.8+ 海象运算符 ...
while True: data = input(...) if not data: break ...
Python 在没有 do-while 或海象运算符的传统结构中(像 C 那样先执行一次再判断),所以如果想“至少读一次,直到空行为止”,就必须手动做一次“预读”,必须先有初始值才能进入 while 条件判断。👉 “预读”的作用就是给 while 提供第一次判断的依据,否则 data 未定义,或初始为假,循环根本不会执行。
C 语言求位数的例子a=0
do { n++; a /= 10; } while (a != 0);
现代 Python 更推荐 while True + break,但在以下场景中,“预读”思想(或其变体)依然常见,甚至必要:
场景1️⃣:读取不确定数量的输入,以特定信号结束 典型信号:空行、"quit"、EOF(文件结束)、特殊字符等。 例子: 用户逐行输入数据,空行结束; 从 socket 或串口读数据,直到收到 "END"; 读文件直到某一行匹配终止条件。 Python 编辑 line = input("输入(空行结束): ") while line != "": process(line) line = input("输入(空行结束): ")
这里“预读”是为了让while有初始值可判。
场景2️⃣:处理文件流或生成器,需“窥探”下一个元素 比如解析日志时,遇到某行要结合下一行处理。 先读一行作为“当前行”,循环中不断读“下一行”。 Python 编辑 with open('log.txt') as f: line = f.readline() while line: if 'ERROR' in line: next_line = f.readline() handle_error(line, next_line) line = f.readline()
当语言没有 do-while(比如 Python),但你需要“至少处理一次输入”或“先读再判”的逻辑时,“预读 + while” 就成了最直接的替代方案。
但它带来了代码冗余和维护成本;
现代编程更推荐用 while True + break 来优雅地实现相同逻辑。
Python 中更优的“do-while”模拟 while True: data = input("请输入:") if not data: # 终止条件 break # 处理 data