学习指南 /

Python第一本书怎么选:写出能解释、能测试的小程序

第一个有用的里程碑,是能解释、修改并测试一个小程序,而不是见过一长串语法。选一本主教材,把同一个数据汇总任务从预测推进到函数、集合、文件和测试;其他书用来定点补充,不必安排三套相互竞争的进度。

课程专题: 程序设计导论

学习路线与例题编辑责任:University Reading List 编辑项目。 编辑与选书方法 · 来源核验日期:

适用范围与编辑责任

适合会基本算术、能操作文件的编程新手。章节对应 Think Python 第3版、Python Crash Course 第3版和 Guttag 的 Introduction to Computation and Programming Using Python 第3版。任务为本站建议;数据与函数均为本指南原创,不是书中原题或生产监测系统。

选择你的起点

我想从免费、重解释的路线开始

用作者公开的 Think Python 网页,运行笔记本或自己写的小文件。先预测再执行,记录差异;免费在线阅读不等于免费获得纸书。

我更适合边做项目边学

用 Python Crash Course 第一部分打底,再选第二部分的一个项目。先完成可测试的小核心,再接图形或网站;同时启动三套工具会掩盖自身逻辑的问题。

我想进一步做计算模型与数据分析

用 Guttag,从前面的编程与测试章节开始。数学基础较好的新手也可把它作为第一本,但后半部分的模拟与数据方法比掌握基本语法需要更长路线。

三本书如何取舍

Python编程思维:如何像计算机科学家一样思考

Allen B. Downey · 版次: 3 · 2024

免费的概念入门主线

适合何时选择
希望通过短小可运行的例子、明确术语和渐进解释打好基础,再做大应用。
何时另选路线
马上需要指定项目技术栈或完整的统计建模课程。
建议阅读范围
本路线先用第1—3、5—7、9—10章;文本处理可读第8章,文件可读第13章;第14—17章的对象内容可以后置。
局限与取舍
第3版重排了章节并使用笔记本,旧版章号未必对应同一主题。作者提供免费网页;Colab是可选的第三方运行服务,并非课程证书。

选书前试做

读Think Python列表与字典章节后,不运行程序,追踪[("A",0),("A",None),("A",6)],逐行画出总和与计数。

检查标准: 最终总和6、计数2、均值3.0;None不增加计数,零要计数。解释状态如何变化,而不只复述输出。

官方免费阅读 ↗

书目信息与获取方式 →

Python Crash Course: A Hands-On, Project-Based Introduction to Programming(Python编程:从入门到实践)

Eric Matthes · 版次: 3 · 2022

有引导的项目路线

适合何时选择
希望做出游戏、数据可视化或网站,并愿意先完成语言基础。
何时另选路线
还不能追踪短循环或函数的执行;直接进入完整框架可能遮住这项短板。
建议阅读范围
第一部分第1—8、10—11章支持本路线。大型项目分别在第12—14、15—17、18—20章,小程序跑通后选一条。
局限与取舍
出版社注明第3版于2022年12月发行。项目依赖与部署方案会改变,应查作者勘误与更新,不把印刷版中的服务名当作永久有效。

选书前试做

读Python Crash Course第10–11章后,把计算与文件、输入处理分开,分别为空输入、只有零、全部缺失写三个小测试。

检查标准: 计算函数接收行并返回结果,不打开文件;三类输入的契约与预期值清楚,测试失败不依赖手动操作整个项目。

书目信息与获取方式 →

Python计算和编程导论

John V. Guttag · 版次: 3 · 2021

计算问题求解的延伸

适合何时选择
想把程序连接到算法、模拟和数据解释,并愿意说明数学假设。
何时另选路线
眼下只需要第一段小脚本,或目标是部署教程而非计算课程。
建议阅读范围
先读第1—5、7—9章;第11—12章扩展算法,第16—22章进入模拟与统计,第23章介绍pandas。
局限与取舍
所选第3版出版于2021年,附Python 3.8速查表,不保证所有历史库示例能在今天原样运行。记录环境,查阅配套代码与勘误。

选书前试做

沿Guttag早期函数与测试路线,说明接受的数据契约,并写出连接累计总和、计数和已处理行的循环不变量。

检查标准: 不变量只覆盖目前处理过的合规行,区分缺失与数值大小;举出一种契约外输入,以及普通单元测试不能保证的一项数值限制。

书目信息与获取方式 →

检查先修准备

字符串“12”与数字12是同一种值吗?

不是。类型不同,支持的操作也不同。应主动转换输入,并先定义非法值如何处理,再进行计算。

零值能和缺失值互换吗?

不能。本例零是有效观测,None表示缺失;两者在真假测试中都为假,因此必须用明确的数据规则筛选。

实现函数之前应说明什么?

规定可接受输入、返回输出和边界行为。本例省略没有有效读数的站点,不修改调用者的数据;没有有效值不意味着均值为零。

六步学习与具体成果

勾选用于自我记录,不是成绩评定;标记不会发送给本站。

  1. 1. 预测短表达式并检查类型

    建议阅读范围: Think Python 第1—2章;Crash Course 第1—2章;Guttag 第1—2章。

    动手产出: 写一个小脚本或笔记本,列出涉及数值、字符串、比较和除法的六个表达式。执行前写下预期值与类型,再解释不一致之处。

    检查标准: 看到输出并不等于理解;能分清数字、数字打印后的文字,以及输入得到的字符串。

  2. 2. 把数据规则变成条件

    建议阅读范围: Think Python 第5、7章;Crash Course 第4—5、7章;Guttag 第2.3—2.6节。

    动手产出: 先手工追踪下方数据,标出零值和缺失值是否计入,再写一个每行只遍历一次的循环。

    检查标准: 保留零,只跳过None;换序不改变哪些观测有效,也不在遍历时删除原集合中的条目。

  3. 3. 给计算写一份契约

    建议阅读范围: Think Python 第3、6章;Crash Course 第8章;Guttag 第4章。

    动手产出: 在实现前写清函数输入、输出及空输入行为,将返回结果与打印友好报告分开。

    检查标准: 别人不必在提示框输入就能调用函数;返回值能被后续使用,原始输入保持不变。

  4. 4. 先按键累加,再求均值

    建议阅读范围: Think Python 第9—10章;Crash Course 第3—4、6章;Guttag 第5章。

    动手产出: 按完整例题分别维护总和与计数字典,新增一个站点,追踪其第一条有效读数怎样建立条目。

    检查标准: 每条有效记录只给其站点加一次总和、一次计数;不能除以站点数,也不能把缺失记录计入分母。

  5. 5. 让文件与失败可见

    建议阅读范围: Think Python 第8、13章;Crash Course 第10章;Guttag 第7、9章。

    动手产出: 保存一份小型本地测试数据,单独写加载器,说明空白、格式错误与非数字字段如何处理,不把这些决定偷偷塞进已约定的均值函数。

    检查标准: 文件加载失败要报告,不静默伪装成成功的空结果;使用虚构数据,无须个人信息或生产记录。

  6. 6. 交付可复现的小项目

    建议阅读范围: 重读 Think Python 第7、9章;Crash Course 第11章;Guttag 第8章。

    动手产出: 提交函数、测试数据、测试和运行说明,检查基准、空输入、全缺失、只有零、输入不变,以及换序或整体重复。

    检查标准: 预期答案须独立手算,不能从程序输出抄回测试;读者能重跑并识别未支持的输入,少数测试通过不代表生产可用。

原创例题与解析

零是读数,None不是

对数据[("A", 12), ("B", None), ("A", 0), ("B", 8), ("A", 18)],返回各站点有效读数的均值。保留零、跳过None、省略没有有效读数的站点,并保持原始数据不变。

前提假设

每行包含字符串站点和有限整数/浮点数或None;布尔值、格式错误行、NaN不在本例输入契约内。所有读数使用相同的任意单位。空输入或全缺失输入返回空字典。这是虚构教学数据。 读数的大小与记录数量还须保证各站点累加总和保持有限;这个简单的浮点计算不处理溢出,也不保证所有有限输入都能精确计算。

  1. 先看数据:A有12、0、18,总和30,共3条;B仅有有效读数8,None既不贡献数值,也不贡献计数。
  2. 分别建立总和、计数字典;遍历时以value is None决定是否跳过,不使用if value判断有效性。
  3. 每条有效记录加到对应站点的总和,并把该站点计数加一;循环结束后,各总和除以各自计数。
  4. A得到30 / 3 = 10.0,B得到8 / 1 = 8.0。没有有效观测的站点没有总和、计数条目,会被省略,因此不会产生零分母。
  5. 若错误地按真假值筛选,A的零会被丢弃,得到(12 + 18) / 2 = 15.0。程序可能没有异常,却在回答另一个问题。

答案与解释

结果为{"A": 10.0, "B": 8.0}。下方完整函数表达约定的数据规则,返回结果,不改变输入,也不把计算绑定在文件、笔记本或输入提示上。


            def means_by_site(rows):
    totals = {}
    counts = {}
    for site, value in rows:
        if value is None:
            continue
        totals[site] = totals.get(site, 0) + value
        counts[site] = counts.get(site, 0) + 1
    means = {}
    for site in totals:
        means[site] = totals[site] / counts[site]
    return means
          

检验结果

检查[] → {}、[("A", None)] → {}和[("A", 0)] → {"A": 0.0}。对题给小整数,重排行或复制全部有效行会保持均值;一般浮点输入还需单独分析舍入,不能保证顺序变化后精确相等。("A", "bad")等行需要在本有限契约之外另定验证规则。

改变假设,再做一题

合并批次不能只保留均值

将原虚构数据分为batch1=[("A",12),("A",0),("B",None)]和batch2=[("A",18),("B",8)],保留输入与缺失规则。若不保存原始行,怎样合并批次摘要得到各站点均值?直接平均批次均值是否足够?本题使用可精确表示的小整数。

  1. batch1得到A:(总和12,计数2),B没有有效摘要;batch2得到A:(18,1)、B:(8,1)。没有摘要不等于测得零。
  2. 逐站点相加总和与计数,得A:(30,3)、B:(8,1),最后除一次得A10.0、B8.0,与一起处理原始行相同。
  3. A的两个批次均值为6和18,直接平均得12,因批次样本数不同而错误。加权平均(2×6+1×18)/(2+1)=10才与合并结果一致。

答案与解释

每批为每站点保留(总和,计数),分别相加后再除。只有均值而无计数,通常无法恢复合并均值。本题返回{"A":10.0,"B":8.0}。

检验结果

把一行移到另一批重算:这些小整数的合并均值不变,但批次均值的简单平均可能变化。一般浮点输入在数学上重新分组,并不保证逐位相等;还须单独评估舍入与有依据的误差界限。

常见误区

输出看起来合理,不等于程序正确

错误结果A = 15.0也很普通。保留能区分正确规则与诱人错误实现的手算案例。

把教材版本当成软件环境

章节号对应特定版次,依赖和托管说明却会演变。记录实际Python与库版本,部署前查作者更新。

还没隔离逻辑就堆库

均值函数只需内置功能。先独立测试,再连接绘图、CSV加载或网页,否则环境错误和逻辑错误更难分开。

进入下一阶段之前

  • 能选择概念、项目或建模导向的主教材,并说明暂时后置哪些内容。
  • 能追踪完整函数,解释零与None的区别,以及某站点没有有效读数时的结果。
  • 小项目有独立预期值、边界检查与运行说明,不把少量通过案例视为普遍正确的证明。

来源与版次核验

来源核验日期:

这些是本站建议的学习活动,并非大学官方作业,也不代表对每本书逐页通读。

编辑与选书方法 →