Python开发反应时间测试如何防止用户过早按键导致计时为0
问题根源
出现0.0秒反应时间的原因很简单:程序执行time.sleep()等待的那3-5秒里,用户提前按的回车键会存在系统输入缓冲区里排队,等休眠结束程序走到input()那行时,会直接读到提前存好的回车,相当于瞬间完成输入,计时结果自然接近0。
修复方案
核心逻辑很简单:在打印GO!提示、正式开始计时之前,把输入缓冲区里提前攒的所有按键内容全部清空,这样后续的input()只会等提示出现后用户新按的回车,不会读到提前输入的内容。
下面是改好的跨平台兼容代码(Windows、macOS、Linux都能跑):
import time import random import sys # 适配不同系统的输入清空依赖 try: import msvcrt # Windows系统专用模块 except ImportError: import termios # macOS/Linux系统专用模块 import tty def clear_input_buffer(): """清空输入缓冲区中所有提前输入的内容""" if sys.platform.startswith("win"): while msvcrt.kbhit(): msvcrt.getch() else: termios.tcflush(sys.stdin, termios.TCIOFLUSH) print("When you see GO! press enter.") start_check = input("Type y to start:").strip().lower() if start_check != "y": print("---------") print("***END***") print("---------") quit() print("Get Ready!") time.sleep(random.randint(3, 5)) # 打印提示前先清掉所有提前按的输入 clear_input_buffer() print("---------") print(" GO! ") print("---------") start = time.perf_counter() input() end = time.perf_counter() reaction_time = round(end - start, 3) print(f"Your reaction time is {reaction_time}s")
改动说明
- 新增跨平台的输入缓冲区清空函数,在正式出GO提示前执行,彻底屏蔽提前按键的影响
- 简化了启动输入的判断逻辑:用
.strip()自动去掉输入前后的空格,.lower()自动统一大小写,不用再写一长串判断y/Y/Y的条件 - 修正了原代码提示的笔误:把原来写错的
G0!(数字0)改成了正确的GO!(字母O) - 优化了输出格式,结果加了秒单位,可读性更好
额外优化建议:人类的反应速度极限基本在0.1秒以上,如果测出来的结果小于0.1秒,大概率还是误触,可以加个判断提示用户过早按下,重新走测试流程。
内容的提问来源于stack exchange,提问作者Ultra Legend
相关产品推荐
相关产品推荐

