Python入门实战:30行代码打造反应时间测试器
1. 项目概述与核心思路最近在整理自己初学编程时的项目翻出来一个特别有意思的小游戏——反应时间测试器。这玩意儿是我小学刚接触Python那会儿写的代码总共不到30行但麻雀虽小五脏俱全几乎把编程入门最核心的几个概念全用上了变量、循环、条件判断、函数库调用和用户输入。如果你刚学完Python语法正愁没地方练手或者想找个简单项目理解这些抽象概念是如何串联起来变成一个“活”的程序那这个项目再合适不过了。简单说这个游戏会随机或者说在你意想不到的时候提示你按下回车键然后程序会精确计算从提示出现到你实际按下回车之间的时间差这就是你的“反应时间”。游戏会连续测试多次最后给你一个平均反应时间。听起来简单吧但就是这么个小东西背后涉及了事件监听、时间戳记录、循环控制、条件分支等多个编程核心思想。当年我靠着它第一次真切地感受到了“我写的代码能跟人互动了”的成就感。为什么选它作为入门练手项目第一反馈即时。你马上能看到结果是好是坏一目了然这种正反馈对初学者保持兴趣至关重要。第二涉及面广。它不像单纯计算器那样只涉及运算也不像纯文本处理那样枯燥它把输入、输出、逻辑、计时都揉在了一起。第三扩展性强。基础版本完成后你完全可以自己加功能比如加入不同颜色的视觉提示、加入声音反馈、甚至做成图形界面让它成为一个你持续打磨的“作品”。2. 环境准备与工具选择工欲善其事必先利其器。做这个项目你只需要两样东西一个能运行Python的环境和一个写代码的编辑器。听起来简单但这里面的门道对新手来说可能第一个“坑”。Python解释器这是执行你代码的“引擎”。直接去Python官网python.org下载最新稳定版就行。安装时务必记得勾选“Add Python to PATH”这个选项这能让你在命令行里直接输入python来启动解释器省去后续一堆配置麻烦。很多新手卡在第一步就是因为没勾这个导致系统找不到Python命令。安装完成后打开命令行Windows上是CMD或PowerShellMac/Linux是Terminal输入python --version如果能看到版本号比如Python 3.11.4恭喜你环境装好了。代码编辑器这是你写代码的“纸笔”。强烈不建议新手直接用系统自带的记事本Notepad或文本编辑TextEdit因为它们没有代码高亮、自动缩进、错误提示这些能极大提升效率和降低错误率的功能。对于这个项目我有几个推荐IDLEPython自带的简易集成开发环境。最大的好处是开箱即用无需额外安装并且有一个交互式窗口Shell可以让你一行行执行代码立刻看到结果特别适合调试和尝试小段代码。我们项目最初就是用IDLE写的。Thonny一款专为编程教学设计的IDE。界面极其简洁自带调试器可以一步步执行代码查看变量值如何变化对理解for循环和if语句的执行流程有奇效。VS Code功能强大的通用编辑器。需要安装Python扩展但一旦配置好它的智能提示、代码补全、集成终端等功能会让你写代码非常舒服。如果你打算长期学习编程建议直接上手这个。注意无论用哪个编辑器创建Python文件时后缀名必须是.py例如reaction_test.py。系统靠这个后缀名识别这是Python脚本。对于这个反应时间测试项目我推荐你第一次就用IDLE。原因很简单它和Python绑定没有复杂的配置它的交互模式能让你方便地测试time.time()等函数而且它足够轻量让你专注于代码逻辑本身而不是折腾编辑器。等这个项目做完你对整个流程熟悉了再换更强大的工具也不迟。3. 核心库导入与time模块详解任何像样的程序很少能从零开始全部自己写。Python强大的地方就在于它有海量的“工具箱”——也就是库Library或模块Module。import语句就是打开这些工具箱的钥匙。我们这个项目核心工具箱只有一个time模块。为什么是time模块反应时间测试本质就是测量两个时间点之间的差值。我们需要一个精度足够高至少到毫秒级、使用简单的计时工具。Python标准库里的time模块完美符合要求。它不需要额外安装功能纯粹其中最关键的函数就是time.time()。time.time()函数深度解析这个函数的作用是返回当前时间的时间戳。什么是时间戳它指的是从协调世界时UTC1970年1月1日0点0分0秒这个时刻被称为“Unix纪元”开始到当前时刻所经过的秒数通常是一个带有很多位小数的浮点数。比如1685432101.123456这样的数字。为什么用时间戳而不是我们熟悉的“几点几分”因为计算机处理数字尤其是做减法计算差值比处理“时:分:秒”格式的字符串要高效和准确得多。想象一下你要计算14:25:30.500和14:25:31.200之间差了多久用字符串处理你得先拆分再换算成秒非常麻烦。而用时间戳直接1685432131.200 - 1685432130.500 0.700一步得出0.7秒简单直接。在我们的代码里用法是这样的import time # 首先引入工具箱 start_time time.time() # 在事件开始时比如提示出现按下“秒表”的开始键 # ... 这里等待用户按下回车 ... end_time time.time() # 用户按下回车时按下“秒表”的停止键 reaction_time end_time - start_time # 计算差值就是反应时间start_time和end_time这两个变量存储的就是两个时刻的时间戳它们的差reaction_time就是以秒为单位的反应时长。因为time.time()返回值是浮点数所以我们的反应时间可以精确到微秒级别对于人类反应测试来说绰绰有余。实操心得第一次用time.time()时我误以为它返回的是本地时间还试图去理解那个巨大的数字代表几点钟走了弯路。记住它就是个用于计算间隔的“刻度尺”我们只关心两次测量之间的刻度差不用关心刻度尺的起点具体对应哪年哪月。导入语句的写法import time是最标准的形式。你可能会看到一些教程里写from time import time然后直接调用time()。这也可以但我不推荐新手这么做。因为import time的写法更清晰地表明了time()函数是来自time模块这个“命名空间”。当你的代码变复杂引入了很多库时这种写法能避免函数名冲突让你一眼就知道某个函数是哪来的。4. 游戏主循环for循环的结构与逻辑程序要测试多次反应时间取平均这就需要循环Loop。我们这里用的是for循环它是编程中最基础、最常用的循环结构之一特别适合用于“已知要重复多少次”的场景。for循环的执行机制for循环的通用格式是for 变量 in 序列:。它会从“序列”中逐个取出元素赋值给“变量”然后执行一次循环体内的代码。取完序列中所有元素后循环结束。for i in range(5): print(f这是第 {i1} 次循环)这段代码中range(5)生成了一个类似[0, 1, 2, 3, 4]的序列注意从0开始。for循环会依次把0,1,2,3,4赋值给变量i然后每次执行print语句。所以屏幕上会打印5行字。为什么用range(10)在我们的游戏里for i in range(10):意味着游戏将进行10轮测试。range(10)产生0到9的整数序列循环10次。变量i的值每次循环会自动递增我们可以利用它来显示当前是第几轮测试比如print(f第{i1}轮测试准备)。这里i1是因为序列从0开始但我们对用户显示习惯从1开始计数。循环体的关键缩进Python用**缩进Indentation**来定义代码块。for循环后面冒号:下面的所有行只要缩进量相同就都属于这个循环体。如果某行缩进结束了就表示它退出了循环。这是Python非常独特且重要的语法规则。for i in range(3): print(我在循环内) # 这行有缩进属于循环体会执行3次 print(我在循环外) # 这行没有缩进不属于循环体只执行1次很多新手会忘记冒号或者弄乱缩进比如混用空格和Tab键导致程序报错或逻辑错误。务必保持一致的缩进风格建议用4个空格。循环内的变量作用域在for循环内部定义的变量比如我们后面会提到的start和reaction_time其作用域主要在这个循环体内。每次循环开始这些变量都会被重新创建和赋值。这意味着第1轮循环中计算的reaction_time和第2轮循环中的reaction_time是两个独立的变量互不影响。这正好符合我们的需求每一轮测试都是独立的。常见错误排查如果你的游戏只进行了一轮就停了或者该循环的代码没循环首先检查两件事1.for语句末尾有没有冒号:2. 循环体内的代码缩进是否正确所有要循环执行的语句必须比for那一行多缩进一层。5. 交互核心变量赋值与input()函数捕获程序要能和人互动就得有“输入”和“输出”。print()是输出把我们想说的话显示给用户。而input()就是输入用来接收用户给我们的信息。在这个游戏里用户的信息就是“我准备好了可以开始计时了”或者“我已经按下回车了”这个动作。input()函数的工作方式input()函数执行时程序会暂停等待用户在命令行里输入一些内容然后按下回车键。用户输入的所有内容包括空格会被作为一个**字符串String**返回。例如name input(请输入你的名字) # 用户输入“小明”并回车 print(f你好{name}) # 会输出你好小明在我们的反应测试游戏中我们并不关心用户具体输入了什么文字我们只关心“用户按下回车”这个事件。所以我们可以利用一个特性即使用户直接按回车input()也会返回一个东西——一个空的字符串。我们代码里写的是input(请快速按下回车)提示用户按回车然后我们并不把输入结果存到变量里或者存了不用因为我们只需要input()函数执行时带来的“程序暂停并等待”的效果。变量的角色数据的临时储物柜变量Variable是编程中最基础的概念。你可以把它理解成一个贴了名字的储物柜。这个等号在编程里叫赋值运算符意思不是“两边相等”而是“把右边的值放进左边名字代表的储物柜里”。start time.time() # 把当前时间戳这个“值”放进叫做“start”的储物柜在这个游戏里我们主要用到三个关键变量start存储测试开始时刻的时间戳。end存储用户按下回车时刻的时间戳这个变量有时可以省略直接计算。reaction_time存储计算出来的反应时间即end - start。变量命名的学问给变量起个好名字能让代码读起来像散文。坏的名字则像天书。基本原则是使用描述性的名字start_time就比s好user_input就比x好。使用小写字母和下划线这是Python社区的约定比如reaction_time这叫“蛇形命名法”。避免使用拼音或含糊的缩写kssj开始时间就不如start_time清晰尤其对可能阅读你代码的其他人。在我们的循环中流程是这样的for i in range(10): print(第{}轮准备....format(i1)) time.sleep(random.uniform(1, 3)) # 随机等待1-3秒增加不确定性 print(就是现在快按回车) start time.time() # 储物柜A记录“提示出现”的时刻 input() # 程序暂停等待用户按回车 end time.time() # 储物柜B记录“用户按下回车”的时刻 reaction_time end - start # 储物柜C计算并存储时间差 print(f你的反应时间是{reaction_time:.3f} 秒) # 输出储物柜C里的值注意事项input()函数会一直等待直到用户按下回车。如果用户一直不按程序就会一直卡在那里。这是正常的也是我们设计的一部分。但如果你在测试时想强制结束程序可以按键盘上的Ctrl C在大多数终端中这会发送一个中断信号终止Python程序的运行。6. 条件判断用if语句实现游戏反馈一个只会机械计时的程序是枯燥的。好的游戏应该有反馈有互动。这就是条件语句Conditional Statement主要是if语句大显身手的地方。它让程序有了“判断”能力可以根据不同的情况执行不同的代码。if语句的基本结构if语句的核心逻辑是“如果某个条件成立True就做某事否则else就做另一件事”。它的语法骨架如下if 条件: # 条件成立时执行的代码块 else: # 条件不成立时执行的代码块和for循环一样if和else后面的代码块也是通过缩进来定义的。条件表达式比较运算符“条件”本质上是一个表达式它的计算结果必须是布尔值Boolean即True真或False假。我们通过比较运算符来构造这样的表达式。最常用的有大于小于大于等于小于等于等于注意是两个等号和一个等号的赋值运算符区分开!不等于在我们的游戏里我们想判断用户的反应时间是快还是慢。假设我们认为超过2秒的反应算“太慢了”可以这样写if reaction_time 2.0: print(哎呀太慢啦下次要更快哦) else: print(反应挺快嘛不错)这里reaction_time 2.0就是一个条件表达式。如果reaction_time变量的值大于2.0表达式结果为True程序就会执行if下面的print语句否则结果为False程序会跳过if块执行else下面的print语句。更灵活的条件组合elif有时候我们不止有两种情况。比如我们想对反应时间进行分级评价if reaction_time 0.2: print(闪电侠非人类速度) elif reaction_time 0.5: print(高手这反应绝了) elif reaction_time 1.0: print(不错在平均水准之上。) elif reaction_time 2.0: print(还行可以再练练。) else: print(嗯……你是不是走神了)elif是else if的缩写意思是“否则如果……”。程序会从上到下依次检查每个条件。一旦某个条件为True就执行对应的代码块然后跳过后面所有的elif和else。这种结构非常适合这种多分支的判断。在游戏循环中集成if语句把if判断放到我们的主循环里游戏就立刻生动起来了total_time 0 # 新增一个变量用于累加总反应时间 for i in range(10): # ... (前面等待、提示、计时的代码不变) ... reaction_time end - start total_time reaction_time # 累加本次反应时间 # 根据本次反应时间给出即时反馈 if reaction_time 2.0: print(f第{i1}轮{reaction_time:.3f}秒 —— 太慢啦) elif reaction_time 1.0: print(f第{i1}轮{reaction_time:.3f}秒 —— 有点慢哦。) else: print(f第{i1}轮{reaction_time:.3f}秒 —— 好快) # 循环结束后计算并输出平均反应时间 average_time total_time / 10 print(f\n游戏结束你的平均反应时间是{average_time:.3f}秒) if average_time 0.8: print(综合评价反应神速) else: print(综合评价多加练习你会更快的)这样每一轮测试用户都能得到即时评价最后还有一个总结游戏体验就完整了。避坑技巧在写if reaction_time 2.0:这样的条件时新手常犯两个错误。一是把比较运算符写成赋值运算符变成了if reaction_time 2.0:这会导致语法错误或逻辑错误。二是注意浮点数的比较由于计算机精度问题直接判断reaction_time 0.3可能不可靠对于时间比较用或更安全。另外if、elif、else后面都不要忘记冒号:。7. 完整代码实现与逐行解析理解了各个部分后我们把它们像拼图一样组合起来形成完整的、可运行的代码。下面是一个增强版的反应时间测试游戏它包含了随机延迟、多级反馈和统计功能。我会逐段进行解析让你清楚每一行代码的意图。# 反应时间测试游戏 - 完整实现 import time import random print(欢迎来到反应时间测试游戏) print(游戏将进行5轮测试。) print(每次屏幕显示快按回车时请以最快速度按下回车键。) print(准备好了吗3...2...1...开始\n) total_reaction_time 0 # 初始化总反应时间变量 test_rounds 5 # 设定测试轮数方便修改 for round_num in range(test_rounds): # 1. 准备阶段随机延迟防止用户预判 delay random.uniform(1.0, 3.5) # 生成1.0到3.5秒之间的随机延迟 time.sleep(delay) # 2. 发出提示并同时开始计时 print(f第 {round_num 1} 轮 - 快按回车) start_time time.time() # 计时起点提示出现的瞬间 # 3. 等待用户输入回车 user_input input() # 程序在此等待用户按下回车后继续 # 4. 计时结束计算本次反应时间 end_time time.time() # 计时终点用户按下回车的瞬间 current_reaction end_time - start_time total_reaction_time current_reaction # 累加到总时间 # 5. 根据反应时间给出即时反馈 if current_reaction 0.15: feedback 不可思议你是机器人吗 elif current_reaction 0.25: feedback 闪电反应太强了 elif current_reaction 0.4: feedback 非常快高手水准。 elif current_reaction 0.8: feedback 还不错在平均范围内。 elif current_reaction 1.5: feedback 稍慢了一点集中注意力。 else: feedback 太慢了是不是走神了 # 6. 输出本轮结果 print(f 反应时间{current_reaction:.3f}秒 | 评价{feedback}\n) # 7. 每轮之间的短暂间隔让用户喘口气 if round_num test_rounds - 1: # 如果不是最后一轮则等待一下 time.sleep(0.5) # 8. 游戏结束输出统计信息 average_time total_reaction_time / test_rounds print( * 40) print(游戏结束成绩汇总) print(f测试总轮数{test_rounds}) print(f平均反应时间{average_time:.3f}秒) # 9. 根据平均成绩给出总评 if average_time 0.3: final_comment 你是反应力超群的精英 elif average_time 0.5: final_comment 表现非常出色 elif average_time 0.8: final_comment 反应速度良好继续保持。 elif average_time 1.2: final_comment 有提升空间多练习会更快。 else: final_comment 反应偏慢可能需要更多练习。 print(f综合评价{final_comment}) print( * 40)逐行解析与关键点导入库import time用于计时import random用于生成随机延迟让每次提示出现的时间点不可预测增加游戏公平性和趣味性。变量初始化total_reaction_time 0和test_rounds 5是典型的变量初始化。前者用于累加必须从0开始后者定义了循环次数单独设为变量使得修改测试轮数非常方便只需改这一个数字。随机延迟random.uniform(a, b)返回一个在a和b之间包括a和b的随机浮点数。这里用它来让“准备”到“提示”之间的间隔在1到3.5秒之间随机变化。time.sleep()函数让程序暂停指定的秒数。计时核心start_time time.time()紧跟在提示信息print之后这是计时的关键。必须确保开始计时和给出视觉提示是几乎同时的。input()函数阻塞程序等待用户动作。end_time time.time()在input()完成后立刻执行。条件判断链使用if/elif/else构成一个多分支判断根据current_reaction的值落入不同的区间给出不同的feedback字符串。这是if语句的典型应用场景。结果输出格式化print(f反应时间{current_reaction:.3f}秒)中的:.3f是格式化语法表示将浮点数current_reaction格式化为保留3位小数。这让输出更整洁。循环控制for round_num in range(test_rounds):中的round_num依次取0,1,2,3,4。我们通过round_num 1来对用户显示更直观的“第1轮”。总分统计在循环中我们用total_reaction_time current_reaction来累加每一轮的时间。循环结束后用总和除以轮数得到平均值。这是处理序列数据的常见模式。经验之谈在写这类交互式程序时用户体验的细节很重要。比如我在每轮输出后加了一个time.sleep(0.5)的短暂停顿最后一轮除外并使用了print(“\n”)换行和print(““*40)制作分隔线。这些小小的“修饰”能让程序输出看起来更清晰、专业也让用户有喘息和阅读反馈的时间。编程不仅是让机器能跑通更是创造好的用户体验。8. 调试技巧与常见问题解决即使代码逻辑清晰第一次运行时也难免遇到各种错误或意外行为。别担心这是学习过程的一部分。下面我总结了这个项目中最可能遇到的几个“坑”以及如何排查和解决。问题1程序报错NameError: name time is not defined错误信息含义Python说它不认识time这个名字。可能原因你忘记了在代码最开头写import time。解决方案确保文件的第一行或第二行有import time语句。import语句通常放在文件顶部。问题2程序报错IndentationError: unexpected indent错误信息含义缩进错误出现了意外的缩进。可能原因你的代码缩进不一致。比如混合使用了空格和Tab键进行缩进或者在不需要缩进的地方多敲了空格。解决方案在编辑器里显示所有空白字符在VS Code或IDLE中通常可以设置。确保整个文件要么全用空格推荐4个空格要么全用Tab不要混用。检查for、if、elif、else语句后面的代码块是否统一缩进了一级。检查代码行首是否有不必要的空格。问题3程序运行后还没提示“快按回车”就开始计时了或者计时明显不准错误现象反应时间异常地长或短逻辑混乱。可能原因start_time time.time()这行代码放错了位置。它必须紧跟在显示提示信息的print语句之后并且在input()语句之前。解决方案仔细检查循环内的代码顺序。正确的顺序是time.sleep(...)随机等待print(快按回车)显示提示start_time time.time()立刻开始计时input()等待用户end_time time.time()用户按下后立刻结束计时计算差值问题4游戏只进行了一轮就结束了错误现象程序没有循环5次只执行了一次就打印最终结果。可能原因for循环的缩进不正确导致本该循环执行的代码被放在了循环体外。解决方案从for那一行开始检查直到计算average_time之前的所有代码。确保从delay random.uniform(...)开始到if round_num test_rounds - 1:这一大段代码全部都比for那一行多缩进了一次通常是4个空格。只有最后的游戏总结部分计算平均成绩和打印总评应该和for语句保持对齐不在循环体内。问题5input()语句导致程序卡住按回车没反应错误现象程序打印了提示语后光标闪烁按回车程序也不继续。可能原因这通常不是代码错误而是运行环境的问题。你可能在某个集成开发环境IDE的“输出”面板里运行程序而这个面板有时并不完全支持交互式输入。解决方案确保你在终端命令行或IDLE的交互窗口中运行Python脚本。在VS Code中使用内置的“终端”运行快捷键Ctrl。在IDLE中直接按F5运行。如果问题依旧尝试在input()的提示字符串中加入更明确的说明如input(请按回车键继续...)。问题6反应时间出现负数错误现象打印出来的反应时间是个负数例如“-0.123秒”。可能原因这是最诡异但原理简单的问题。start_time和end_time赋值顺序反了。你可能先记录了end_time后记录了start_time导致计算end_time - start_time时结果为负。解决方案严格确保计时顺序提示出现后立即记录start_time用户按下回车后立即记录end_time。通用调试方法打印大法Print Debugging对于逻辑错误最朴素也最有效的方法就是在你怀疑的地方插入print()语句输出关键变量的值看看它们是不是和你想象的一样。for round_num in range(test_rounds): delay random.uniform(1.0, 3.5) print(fDEBUG: 本轮延迟为 {delay:.2f} 秒) # 调试语句1 time.sleep(delay) print(f第 {round_num 1} 轮 - 快按回车) start_time time.time() print(fDEBUG: start_time {start_time}) # 调试语句2 input() end_time time.time() print(fDEBUG: end_time {end_time}) # 调试语句3 current_reaction end_time - start_time print(fDEBUG: 时间差 {current_reaction}) # 调试语句4 ...通过查看这些DEBUG信息你可以清晰地看到程序每一步的执行状态和数据的流动很容易定位问题所在。问题解决后再把这些调试用的print语句删除或注释掉即可。9. 项目扩展与创意改进基础版本跑通后你就可以发挥创意把这个小游戏改造成属于你自己的版本。这里提供几个扩展方向每个都对应着新的编程知识点可以作为你下一步学习的练手题。扩展1增加视觉干扰或听觉提示思路现在的提示是纯文本可以改成在屏幕上随机位置显示一个彩色字符或者播放一个短促的声音作为开始信号。这更接近真实的反应测试。涉及知识清屏使用os.system(cls)Windows或os.system(clear)Mac/Linux在提示前清空屏幕让提示更醒目。需要import os。颜色可以使用colorama库需安装在终端输出彩色文字。声音可以使用winsound仅Windows或playsound库跨平台需安装播放一个“嘀”声。代码片段示例清屏与颜色import os # 假设安装了colorama库 from colorama import Fore, Back, Style, init init(autoresetTrue) # 初始化自动重置颜色 # 在循环内提示部分改为 os.system(cls if os.name nt else clear) # 清屏 print(Fore.RED Back.YELLOW *** 快按回车 ***) # 红字黄底 start_time time.time()扩展2保存历史成绩与排行榜思路把每次游戏的平均成绩连同玩家名字和日期保存到一个文本文件或CSV文件中。程序启动时可以显示历史最佳成绩排行榜。涉及知识文件操作使用open()函数打开文件用write()方法写入数据用read()方法读取数据。数据格式学习使用CSV逗号分隔值格式来存储结构化数据Python有内置的csv模块方便处理。数据类型转换将字符串、浮点数等组合成需要保存的格式。核心步骤游戏结束后询问玩家姓名。以追加模式a打开一个文件如scores.txt或scores.csv。将玩家姓名,平均成绩,日期这样的字符串写入文件。读取文件所有行解析成绩排序后输出前5名作为排行榜。扩展3图形用户界面GUI版本思路告别黑乎乎的终端做一个有按钮、有颜色、有进度条的桌面小软件。涉及知识Python的GUI库如tkinter内置简单、PyQt功能强大较复杂。tkinter简易思路创建一个窗口中间放一个大大的标签Label初始显示“准备...”。随机延迟后将标签文字和颜色突然改变如变成红色的“点击”。同时开始计时。用户点击一个“反应”按钮或直接点击窗口。停止计时弹出对话框显示本次反应时间。进行多轮最后显示平均成绩。扩展4网络对战版进阶思路两个玩家在不同的电脑上同时看屏幕上的提示谁先按下键谁赢。这需要网络通信。涉及知识Socket网络编程socket模块。这属于中级课题需要了解客户端/服务器模型。简化版流程一台电脑作为服务器负责发出“开始”指令。两台电脑作为客户端连接服务器。服务器广播“开始”信号并记录时间。客户端收到信号后等待本地用户按键然后将按键时间发回服务器。服务器比较两个客户端返回的时间判断胜负。从最简单的文本交互到加入文件存储再到图形界面和网络功能这个小小的反应测试游戏可以像一个核心不断吸附新的知识模块成长为一个越来越复杂的项目。每一次扩展都是对你编程能力的绝佳锻炼。动手去试遇到问题就查资料、调试这才是学习编程最有效的方式。