重点摘要
1. 程序反映人类问题解决能力
计算机科学家最重要的技能就是解决问题。
计算思维。 编程本质上是一种结构化的问题解决方法,反映了人类如何将复杂任务分解为更小、更易管理的步骤。这包括明确问题、创造性地设计解决方案,并以计算机能够理解的语言清晰准确地表达这些解决方案。
基本指令。 每个程序,无论复杂程度如何,都是由一些基本指令构成的:
- 输入:收集数据。
- 输出:显示结果。
- 数学:进行计算。
- 条件执行:做出决策。
- 重复:重复操作。
抽象与分解。 编程涉及将大型复杂任务分解为更小、更简单的子任务,直到每个子任务可以用基本指令之一来执行。这种抽象和分解的过程是管理复杂性和创建有效程序的关键。
2. 变量:持有值的名称
变量是指向值的名称。
赋值与状态。 变量是编程的基础,充当值的命名容器。赋值语句创建变量并为其分配特定值,使程序能够存储和操作数据。状态图形象地表示了在特定时间点变量及其对应的值。
命名约定。 选择有意义的变量名称对于代码的可读性和可维护性至关重要。变量名称应具有描述性,使用小写字母并用下划线分隔单词(例如,user_name
,total_count
)。避免使用关键字(例如,class
,def
,while
)作为变量名称。
表达式与语句。 表达式结合值、变量和运算符以产生结果。而语句则是执行某个操作的代码单元,例如创建变量或显示值。理解表达式与语句之间的区别对于编写正确有效的代码至关重要。
3. 函数:可重用的代码块
在编程的上下文中,函数是执行计算的一系列命名语句。
定义与调用。 函数是执行特定任务的命名代码块。定义函数时需要指定其名称、参数(输入)以及执行的语句序列。调用函数会执行这些语句,每次可能使用不同的参数。
模块化与可重用性。 函数通过将程序分解为更小的自包含单元来促进模块化。这使得代码更易于阅读、调试和维护。函数还支持代码重用,因为同一个函数可以从程序的不同部分多次调用。
局部作用域与栈图。 在函数内部定义的变量是局部的,意味着它们仅在该函数的作用域内存在。参数也是局部变量。栈图对于可视化函数的执行非常有用,显示每一步的函数调用、局部变量和参数。
4. 接口设计:函数协同工作
函数的接口是其使用方式的总结:参数是什么?函数做什么?返回值是什么?
封装与泛化。 封装涉及将一段代码包装成一个函数,赋予其名称并使其可重用。泛化则是向函数添加参数,使其更灵活,适应不同的输入。
清晰接口。 函数的接口是其使用方式的总结,包括参数、目的和返回值。清晰的接口使用户能够与函数交互,而无需理解其内部工作原理。
重构与开发计划。 重构是改善现有代码结构和设计的过程,而不改变其功能。开发计划提供了一种结构化的方法来编写程序,例如“封装与泛化”方法,涉及从小程序开始,将其封装成函数,使用参数进行泛化,并重复该过程。
5. 条件与递归:决策制定
布尔表达式是一个要么为真要么为假的表达式。
条件执行。 条件语句(if、elif、else)允许程序根据特定条件执行不同的代码块。布尔表达式用于控制执行流程,评估结果为真或假。
逻辑运算符。 逻辑运算符(and、or、not)结合布尔表达式以创建更复杂的条件。这些运算符使程序能够基于多个因素做出决策。
递归。 递归是一种强大的技术,其中一个函数在其自身定义中调用自己。递归函数必须有一个基例,以停止递归并防止无限循环。栈图对于可视化递归函数的执行非常有用。
6. 有效函数:返回结果
当你调用一个有效函数时,你几乎总是想对结果做些什么;例如,你可能会将其赋值给一个变量或将其用作表达式的一部分。
返回值。 有效函数是返回值的函数,这些值可以在程序的其他部分使用。return
语句指定函数将返回的值。
增量开发。 增量开发是一种编写大型函数的策略,通过逐步添加和测试小量代码来实现。这种方法有助于避免长时间的调试会话,并使识别和修复错误变得更容易。
组合与布尔函数。 函数可以通过在另一个函数内调用一个函数来组合。布尔函数返回真或假,通常用于将复杂测试隐藏在函数内部。
7. 迭代:重复操作
计算机常用于自动化重复任务。
重新赋值与更新。 变量可以被重新赋值为新值,并且其值可以根据之前的值进行更新。这使得程序能够跟踪变化的状态并执行迭代计算。
While 循环。 while
语句提供了一种在特定条件为真时重复代码块的方法。循环体应更改一个或多个变量的值,以便条件最终变为假,从而终止循环。
Break 语句与算法。 break
语句允许你根据特定条件提前退出循环。算法是解决某类问题的逐步程序,通常涉及迭代计算。
8. 字符串:字符序列
字符串是字符的序列。
索引与长度。 字符串是字符的序列,单个字符可以使用括号运算符和索引进行访问。len
函数返回字符串中的字符数。
遍历与切片。 字符串可以使用for
循环进行遍历,允许你逐个处理每个字符。字符串切片允许你根据索引范围提取字符串的部分内容。
不可变性与方法。 字符串是不可变的,意味着其字符不能直接更改。然而,可以使用字符串方法基于原始字符串的修改创建新字符串。
9. 文字游戏:案例研究
在没有使用最常见的符号的情况下,构建一个孤立的思想是困难的。
阅读与处理。 本案例研究专注于通过搜索具有特定属性的单词来解决文字谜题。它涉及从文件中读取单词列表,去除空格和标点符号,并将单词转换为小写。
搜索函数。 练习涉及编写函数,搜索满足特定条件的单词,例如不包含“e”、避免某些字母、仅使用某些字母或使用所有必需字母。
开发计划。 开发计划涉及将问题简化为之前解决过的问题,例如认识到uses_all
可以通过uses_only
来解决。
10. 列表:可变序列
列表是值的序列。
列表基础。 列表是多功能的可变序列,可以容纳任何类型的元素。它们使用方括号创建,并可以通过索引访问。
列表操作与方法。 列表支持各种操作,包括连接(+)、重复(*)和切片。它们还提供添加元素(append
、extend
)、删除元素(pop
、remove
、del
)和排序(sort
)的方法。
映射、过滤与归约。 常见的列表操作可以表示为映射、过滤和归约模式的组合。这些模式涉及转换元素、根据条件选择元素以及将元素组合成单一值。
11. 字典:键值映射
字典类似于列表,但更为通用。
字典基础。 字典是将键映射到值的数据结构。与列表不同,字典是无序的,并且使用键而不是索引进行访问。
字典操作。 字典支持添加键值对、使用键访问值、检查键的存在性以及遍历键等操作。get
方法提供了一种访问值的方式,如果未找到键,则返回默认值。
反向查找与备忘录。 反向查找涉及查找与给定值关联的键,这需要在字典中进行搜索。备忘录是存储在字典中的先前计算值,以避免冗余计算,从而提高效率。
12. 元组:不可变序列
元组是值的序列。
元组基础。 元组是不可变序列,类似于列表,但其元素在创建后不能修改。它们使用括号和逗号定义。
元组赋值。 元组赋值允许你同时将序列中的值赋给多个变量。这是一种简洁优雅的方式来交换变量值或从列表或元组中解包元素。
可变长度参数与列表和元组。 函数可以使用*args
语法接受可变数量的参数,这会将参数收集到一个元组中。zip
函数将多个序列组合成一个元组列表,允许你并行遍历它们。
13. 数据结构选择:案例研究
算法分析的实际目标是预测不同算法的性能,以指导设计决策。
词频分析。 本案例研究涉及分析文本文件中的词频,展示了使用字典和列表存储和处理数据的用法。它还引入了随机数的概念及其在模拟中的应用。
马尔可夫分析。 马尔可夫分析是一种表征单词在序列中相互跟随概率的技术。这涉及构建一个字典,将前缀映射到可能的后缀,从而生成模仿原始文本风格的随机文本。
数据结构选择。 关键要点是选择适当的数据结构以应对特定任务的重要性。需要考虑的因素包括实现的简易性、运行时性能和存储空间。
14. 文件:持久存储
本书的目标是教你像计算机科学家一样思考。
读取与写入文件。 文件提供了一种在硬盘或其他存储介质上持久存储数据的方法。Python提供了打开、读取和写入文本文件的函数。
格式运算符与文件名和路径。 格式运算符(%)允许你创建带有格式化值的字符串。os
模块提供了处理文件名和路径的函数,包括查找当前目录、检查文件是否存在以及列出目录内容。
捕获异常与数据库。 try
语句允许你捕获在文件操作过程中可能发生的异常,防止程序崩溃。dbm
模块提供了创建和更新数据库文件的接口,这些文件以键值格式存储数据。
最后更新日期:
评论
《思考Python》获得了大多数积极的评价,因其清晰、简洁以及适合初学者的方式而受到赞扬。读者们欣赏其中的实用练习、免费提供的资源以及对计算机科学概念的关注。有些人认为对于完全的初学者来说,这本书有些挑战,指出其中包含较多数学相关的例子和练习。该书因其结构化的方式而受到称赞,涵盖了Python基础和编程基本概念。尽管少数评论者觉得书中内容令人沮丧或过于技术化,但许多人仍然推荐它作为学习Python和计算机编程的优秀入门书籍,适合初学者以及有一定经验的读者。
Similar Books









