Python中文网

Python程序设计与实践:用计算思维解决问题,由清华大学出版社在2018-05-01月出版发行,本书编译以及作者信息为: 焦福菊,孙青 著,李莹 编,这是第1次发行, 国际标准书号为:9787302473893,品牌为清华大学出版社(TSINGHUA UNIVERSITY PRESS), 这本书采用平装开本为16开,纸张采为纯质纸,全书共有168页,字数17万5000字,值得推荐。

此书内容摘要

本教材主要讲授Python程序设计知识,采用案例教学和问题驱动的撰写方法,注重实践思维、计算思维和创新思维等教育理念与教材内容的结合。本教材将知识点和实际应用相结合,以教学案例引出理论讲解。案例源于现实生活,旨在让读者理解实际问题被抽象化、模型化和程序化的全过程。内容涵盖Python应用的各个方面,以对比方式阐述人和计算机在解决问题时的异同,让读者理解计算思维的本质。教材在设计上由易到难,分别阐述计算机如何描述和处理现实世界中的各类事物,如何表示各类事物之间的关系,如何组织和优化程序结构等,使读者能够将程序设计和现实问题相关联。在讲解某一知识点时,横向延伸与之相关的各类知识点;在讲解某一个案例时,纵向扩展该案例所能实现的各种功能模块,使读者能够比较全面、深入地理解问题和掌握知识。教材穿插了一些技巧性、实用性的说明,并且对重要代码添加了注释。本教材免费提供与内容相配套的教学课件和各个案例的程序源代码。

本教材的内容涵盖范围较广,案例贴近实际,既可作为以Python为基础的程序设计类课程的配套教材,又可作为学习Python的很好的自学参考书,也适合各层次Python开发人员阅读参考。


关于此书作者

暂无.

编辑们的推荐

暂无.

Python程序设计与实践:用计算思维解决问题图书的目录

第1章良好的编程习惯1

1.1Python简介2

1.2Python安装4

1.3漂亮的程序8

1.3.1语法规则10

1.3.2注释规范14

1.3.3程序调试15

1.4Python学习资料17

习题18


第2章计算机描述现实事物20

2.1变量21

2.1.1变量的含义21

2.1.2变量的命名25

2.1.3变量的创建27

2.2数据类型29

2.2.1数值类型30

2.2.2非数值类型34

习题40


第3章计算机处理现实事物43

3.1数值类型操作43

3.1.1数字操作43

3.1.2布尔操作48

3.2非数值类型操作51

3.2.1字符串处理51

3.2.2多媒体处理62

习题64

〖1〗Python程序设计与实践——用计算思维解决问题〖1〗目录

第4章计算机的流程控制66

4.1计算机的逻辑66

4.1.1逻辑表达式67

4.1.2运算符优先级68

4.2程序的有序执行69

4.2.1if条件语句71

4.2.2while循环语句79

4.2.3for循环语句83

4.2.4循环跳转语句88

习题88


第5章计算机表示现实事物间关系90

5.1集合关系99

5.2线性关系101

5.3树形关系114

5.4网状关系122

习题130

第6章程序编写方法132

6.1逐条编程133

6.2面向过程编程134

6.2.1函数134

6.2.2参数139

6.2.3作用域141

6.3面向对象编程142

6.3.1类143

6.3.2对象148

6.3.3继承150

6.3.4多态154

6.4模块化编程思想156

6.4.1模块156

6.4.2文件163

习题167


部分内容试读

前言

本教材主要讲授Python程序设计知识,包括良好的编程习惯、计算机描述现实事物、计算机处理现实事物、计算机的流程控制、计算机表示现实事物间关系以及程序编写方法共6章内容,涵盖了变量、数据类型、控制语句、数据结构、面向过程程序设计、面向对象程序设计、GUI设计、网络编程和调试方法等重要知识点。本教材旨在让读者理解计算机解决问题的方法和思路,掌握程序设计的核心概念,构建基本的程序设计思想,学会编写中等难度的程序代码,为进一步学习和掌握计算机程序设计奠定良好的基础。

本教材采用“案例教学”和“问题驱动”的撰写方法,注重实践思维、计算思维和创新思维等教育理念与教材内容的结合。在编写时,按照问题求解的方式表述教学内容,不仅使学生掌握基本的程序设计知识,更重要的是教会学生解决问题的思维方法,即按照“提出问题、分析问题、讲解知识点、解决问题、总结思维方法”的思路组织教材内容。具体来讲,首先通过一个实例提出问题,然后分析解决问题的思路,引出解决该实例必须了解的核心概念和相关知识,并给出具体的解决方法,在完成具体的程序设计后,进一步展开阐述实用的编程技巧和工程实践经验,最后总结解决此类问题的思维方法,让学生不仅能够知其然,更能够知其所以然。撰写本教材的主要目标是学以致用,让学生掌握程序设计的基本技能,提高学生使用计算机解决实际问题的能力,同时更加注重学生计算思维和信息素养的培养,使他们具备用计算机抽象、分解、模拟和求解问题的能力,以及具备通过网络获取、分析和利用信息的自学能力。本教材的内容涵盖范围较广,案例贴近实际,既可作为以Python为基础的程序设计类课程的配套教材,又可作为学习Python的很好的自学参考书,也适合各层次Python开发人员阅读参考。

本教材的编写本着“案例引导知识、实践引导理论”的原则,将枯燥晦涩的理论性、原理性的知识讲解转化成以问题驱动的案例教学。本教材设计和开发了一系列具有工程性、实践性、综合性等特点的教学案例。这些案例既联系所讲授的知识点,又注重学习者的学习兴趣,极大地激发了读者探究问题的求知欲。

本教材的主要特色和创新点如下:

(1) 案例丰富、贴近实际: 将知识点和实际应用相结合,以教学案例引出理论讲解。案例源于现实生活,旨在让读者理解实际问题被抽象化、模型化和程序化的全过程。

(2) 内容全面、讲解独特: 涵盖Python应用的各方面,以对比方式阐述人和计算机在解决问题时的异同,让读者理解计算思维的本质。

(3) 结构合理、设计新颖: 教材以“用计算机解决现实问题”为主旨,在设计上由易到难,分别阐述计算机如何描述和处理现实世界中的各类事物,如何表示各类事物之间的关系、如何组织和优化程序结构等,使读者能够将程序设计和现实问题相关联。

(4) 难易适度、层层递进: 教材采用横向和纵向两种方法撰写内容,在讲解某一知识点时,横向延伸与之相关的各类知识点;在讲解某一个案例时,纵向扩展该案例所能实现的各种功能模块,使读者能够比较全面、深入地理解问题和掌握知识。

(5) 代码注释、相关说明: 为了便于读者的阅读和实现,教材穿插了一些技巧性、实用性的说明,并且对重要代码添加了注释。

〖1〗Python程序设计与实践——用计算思维解决问题〖1〗前言(6) 配套课件、案例源码: 教材提供与内容相配套的教学课件和各个案例的程序源代码。

参与本教材编写的都是北京航空航天大学计算机学院从事计算机基础教学多年、有着丰富教学经验的老师。其中,第1章和第4章由焦福菊、李莹编写,第2章、第3章和第5章由李莹、孙青编写,第6章由孙青、李莹编写。全书由李莹统稿并定稿。此外,在本书的编写过程中得到了李宇川的极大帮助,并且参考了国内外许多同类的优秀教材,在此表示深深的谢意。

由于时间仓促,加之编者水平有限,所以尽管经过了多次反复修正,但书中仍难免会有疏漏和不足之处,恳请同行专家、一线教师及广大读者批评指正。

李莹

2017年12月于北京

关于此书评价

暂无.

书摘内容

第5章计算机表示现实事物间关系

在第2章中提到过采用降维思维不仅可以表示现实世界中的一切事物,还能描述事物之间的各种关系。根据事物间相互作用和相互影响的状态,可将它们分为集合、线性、树形(层次)和网状4种关系类型。由于人脑具有多维多元的存储特点,它能实现各种关系的直接映射和整体表示,不需要经过转换或切分,并且能一次性地获取事物间的各种关系。但是,计算机存储系统仅是一个一维一元的线性空间,它只适合直接表示集合和线性关系。对于树形和网状等复杂数据关系,必须利用计算思维中的降维思维,对其进行转换和划分,将整体的一对多或多对多的非线性关系降维成局部的、一对一的线性关系。数据间的复杂关系只能由与其相邻的前驱对象和后继对象间接地、局部地表示。要想得到完整的数据关系,只能通过分步解析实现。

现实世界中存在着形形色色的事物,这些事物之间并不是孤立无依的,它们有着千丝万缕的联系。我们用计算机解决实际问题,不仅要能表示问题中包含的各类事物,还要能描述这些事物之间的复杂关系,从而完成将现实世界的实际问题映射到计算机世界的抽象模型的计算思维过程。

现实世界中各类事物间仅存在集合、线性、树形和网状4种关系,其拓扑结构图如图5��1所示。任何复杂关系都是这4种关系的组合。

图5��1现实世界中事物间的逻辑关系

1. 集合关系

具有某种共同特性的事物聚集在一起就构成一个集合。集合中的各个事物除属于同一个集合外无特别的关系,可将其视为是一个个独立个体。它们之间是平等、无序、不相关的,如学生集合、职员集合、用户集合等。

2. 线性关系

线性关系中各个事物之间是一对一的关系,它们构成一个有序集合,如超市中排队付款的顾客、连续剧中按序播放的剧集、书中顺序编码的书页等。

〖1〗Python程序设计与实践——用计算思维解决问题〖1〗第5章计算机表示现实事物间关系3. 树形关系

树形关系中各个事物之间是一对多的层次关系,它们之间存在“上下级”的不平等关系,如单位的组织机构关系、族谱中的家族关系、计算机中级联文件夹间的关系等。

4. 网状关系

网状关系中各个事物之间是多对多的复杂关系,即两两事物之间都有可能存在联系,如由站点构成的地铁交通图、学生与课程的关系等。

另外,对于相同的事物,由于解决的问题不同,它们之间的逻辑关系也不一定相同。例如,在课程管理系统中,学生之间是集合关系,他们在使用上没有差异,都是执行选课、查分等操作;而在班级管理系统中,学生之间是树形关系,他们由于级别不同而具有不同的权限,班长权限最高——他可以查看和修改学生信息,普通学生具有一般权限——他仅能查看本人信息。由此可见,在分析事物间逻辑关系时,一定要联系实际问题,切忌循规蹈矩。

那么,这些现实世界中事物之间的关系如何用计算机表示呢?物理上,计算机的内存是一个一维空间,因此存储时,我们只能将集合关系、线性关系、树形关系和网状关系转换为计算机能理解的一维结构。

进一步,如何在Python中定义一维结构呢?在第2章中,我们学习了几种基本的数据类型,但是这些数据类型都只能用来表示单个数据,无法表达数据之间的复杂关系。这里,Python提供了列表、元组和字典等能够同时表达多个数据且各数据可以具有不同数据类型的复合数据类型,如表5��1所示。其中,列表是使用中括号“\[\]”定义的一组有序数据集合,不同元素间用逗号“,”隔开,例如a=\['a','b','c'\]。列表定义完后可以被修改。元组是使用小括号“()”定义的一组固定数据集合,例如a=('a','b','c')。元组的特性和列表的特性基本一致,但它定义后就不能被修改,因此所有具有改变性的操作都不能应用到元组中,例如append()、extend()、insert()、remove()、pop()、sort()、reverse()等。字典是使用大括号“{}”定义的一组无序键�仓刀约�合。字典和列表、元组的最大区别是,它的每个元素都是由键和值两部分组成,且键不能重复。和现实生活中的字典功能类似,字典表示的是键和值之间的映射关系,我们可以通过键来读取它所对应的值,例如a={"Lily": 23,"Kate",32,"John": 18},可以用来表示人名及其年龄,其中,人名是键,年龄是值。字典定义后也可以被修改。字典中的键是任意不可变的数据类型,常用字符串或元组表示。表5��1Python中列表、元组和字典操作

(其中,a=\[1,2,3,4\],t=(3,4,5,6),d={'a': 1, 'b': 2, 'c': 3})数据

类型操作定义说明实例列表定义列表List=\[e1,e2,…\]用中括号\[\]定义列表a=\[1,2,3,4\],结果\[1,2,3,4\]读取元素List\[index\]通过元素在列表List中的下标(index)读取该元素a\[0\],输出1续表数据

类型操作定义说明实例列表添加元素List.append(e)将元素e添加到列表List的尾部a.append(5),结果\[1,2,3,4,5\]插入元素List.insert(index, data)将元素data插入到列表List下标index位置a.insert(3,6),结果\[1, 2, 3, 6, 4\]插入列表List.extend(List1)将列表List1中各元素依次插入到原列表List的尾部b=\[5,6,7\]

a.extend(b),结果\[1,2,3,4,5,6,7\]删除末尾元素List.pop()删除列表List尾部的元素,返回被删除的元素a.pop(),输出4删除指定元素List.remove(e)删除列表List中第一个值为e的元素,如果没有该元素则报错a.remove(3),结果\[1,2,4\]修改元素List\[index\]=data将列表List下标index所在元素重新赋值为dataa\[2\]=6,结果\[1,2,6,4\]查找元素e in List判断元素e是否在列表List中。如果e存在,则返回True;否则,则返回False1 in a,输出True查找元素下标List.index(e)查找元素e在列表List中的下标位置,如果没有找到则报错a.index(3),输出2计算元素次数List.count(e)计算元素e在列表List中出现的次数,如果没有出现则返回0a.count(1),输出1分片NewList=List

\[index1: index2\]从列表List中同时读取从下标index1到下标index2-1的多个元素,返回一个新的列表a\[1: 3\],输出\[2,3\]连接两个列表List1+List2将列表List2中各元素依次插入到列表List1尾部,并返回一个新的列表b=\[5,6,7\]

a+b,输出\[1,2,3,4,5,6,7\]列表长度len(List)获取列表List的长度,即列表中元素个数len(a),输出4排序List.sort()根据元素的数据类型,对列表中各元素进行比较和排序。一般是对具有同类元素的列表进行排序。该函数改变原列表,且无返回值c=\[1,2,1,4\]

c.sort(),输出\[1,1,2,4\]

c=\[1,'a',2,1\]

c.sort(),输出报错列表反转List.reverse()按列表中元素的下标位置逆序输出各元素,对元素数据类型没有要求c=\[1,2,1,4\]

c.reverse(),输出\[4,1,2,1\]

a=\[1,'a',2,1\]

a.reverse(),输出\[1,2,'a',1\]元组定义元组Tuple=(t1,t2,…)用小括号“()”定义元组t=(3,4,5,6),结果(3,4,5,6)读取元素Tuple\[index\]通过元素在元组Tuple中的下标(index)读取该元素t\[0\],输出3查找元素t in Tuple判断元素e是否在元组Tuple中。如果e存在,则返回True;否则,返回False1 in t,输出False查找元素下标Tuple.index(e)查找元素e在元组Tuple中的下标位置,如果没有找到则报错t.index(4),输出1计算元素次数Tuple.count(e)计算元素e在元组Tuple中出现的次数,如果没有出现则返回0a.count(1),输出0分片NewTuple=Tuple

\[index1: index2\]从元组Tuple中同时读取从下标index1到下标index2-1的多个元素,返回一个新的元组t\[1: 3\],输出(4,5)连接两个元组Tuple1+Tuple2将元组Tuple2中各元素依次插入到元组Tuple1尾部,并返回一个新的元组f=(7,8)

t+f,输出(3,4,5,6,7,8)元组长度len(Tuple)获取元组Tuple的长度,即元组中元素个数len(t),输出4元组转换为列表list(Tuple)将元组转化为列表list(t),输出\[3,4,5,6\]列表转换为元组tuple(List)将列表转化为元组tuple(a),输出(1,2,3,4)字典定义字典Dic={key1: value1, key2: value2,…}用大括号“{}”定义字典,其中key: value是一对键�仓刀裕琸ey是键,value是值。字典在存储时会根据元素的hashcode进行排序,可能会导致实际存储顺序和书写顺序不同d={'a': 1, 'b': 2, 'c': 3},结果{'c': 3, 'b': 2, 'a': 1}。字典读取元素Dic.get(key)通过键读取该键在字典Dic中对应的值。如果key存在,则返回key对应的值;否则,返回暂无.d.get('c'),输出3读取元素Dic\[key\]通过键读取该键在字典Dic中对应的值。如果key存在,则返回key对应的值;否则报错d\['c'\],输出3添加(修改)元素Dic\[key\]=value将键�仓刀�(key, value)添加到字典Dic中。如果key存在,则将该键对应的原值修改为新值value,并返回该新值;否则,向Dic中添加一个新的键�仓刀裕�并返回值valued\['d'\]=4,输出4删除指定元素Dic.pop(key)删除字典Dic中key所在的键�仓刀裕�并返回被删除值对中的值d.pop('b'),输出2查找元素key in Dic判断键key是否在字典Dic中。如果在Dic中,则返回True;否则,返回False'b' in d,输出True清除字典Dic.clear()清除字典Dic中的所有元素d.clear(),结果{}复制字典NewDic=Dic.copy()将字典Dic中的各元素复制给一个新的字典NewDick=d.copy(),结果{'a': 1, 'b': 2, 'c': 3}更新字典Dic.update(Dic1)用字典Dic1中的各键�仓刀愿�新Dic中的各键�仓刀浴H绻鸇ic1中的键在Dic中存在,则用该键在Dic1中对应的值更新Dic中对应的值;否则,将该键�仓刀蕴砑拥紻ic中m={'c': 9, 'f',7}

d.updata(m),结果{'c': 9, 'b': 2, 'a': 1, 'f': 7}读取所有的键值Dic.keys()以列表返回字典所有的键d.keys(),输出dict_keys(\['b', 'c', 'a'\])读取所有的值Dic.values()以列表返回字典所有的值d.values(),输出dict_values(\[2, 3, 1\])【例5��1】判断下面列表操作是否正确,并解释错误原因。设列表a=\[1,2,3\]。

(1) 在列表尾部增加一个新元素5,执行a\[4\]=5。

(2) 同时获取列表中2和3这两个元素,执行a\[1: 2\]。

(3) 将一个列表b=\[4,5,6\]中的各元素插入到原列表尾部,执行a.append(\[4,5,6\])。

(4) 在列表末尾同时添加“4,5,6”等多个元素,执行a.append(4,5,6)。

解答: (1)错误。列表虽然是可以被修改的,但是下标4在列表中并不存在,即它在内存中没有被分配空间。我们不能给一个不存在的内存空间赋值。因此,只能通过a.append(5)方法开辟一个新的内存空间,并对该空间赋值。

(2) 错误。对列表执行分片操作时(List\[index1: index2\]),第二个下标位置上的元素是取不到的,仅能取到该下标-1位置上的元素。要想同时读取2和3,只能执行a\[2: 4\]操作。

(3) 错误。执行List.append(e)操作时,e可以是任意类型,但仅能被视为是一个元素添加到列表尾部。因此,a.append(\[4,5,6\])的执行结果是\[1,2,3,\[4,5,6\]\],而非\[1,2,3,4,5,6\]。

(4) 错误。List.append(e)一次仅能添加一个元素。这里可以通过a.extend(\[4,5,6\])实现所需操作。

【例5��2】判断下列元组操作是否正确,并解释错误原因。设元组t=(3,4,5,6)。

(1) 向元组末尾添加一个新元素7,执行t.append(7)。

(2) 删除元组中一个元素4,执行t.remove(4)。

(3) 在元组中下标3的位置插入一个元素8,执行t.insert(3,8)。

(4) 将元组中元素5的值修改为1,执行t\[2\]=8。

解答: 元组是一种固定的数据类型,它一旦定义是不能再被修改的。因此,一般不对元组执行添加、删除、插入或修改等具有改变性的操作。在设计系统前,对于变量数据类型的确定,一定要三思而后行,以免在后续开发中出现预先定义的变量不能满足实际需求等问题。

针对(1)~(4)的错误,有两种解决方案: 一是将元组数据类型转换为灵活性较高的列表数据类型,在列表中执行完添加、删除、插入或修改等操作后,再将列表数据类型转换回元组数据类型。二是对元组执行查找、分片、重组等操作,并以元组嵌套的方式定义新元组。虽然得到的结果是一个二层嵌套元组,但它并不影响实际应用。

题目(1)的改正如下。

方法一: 元组�擦斜愍苍�组。t= (3,4,5,6)

ListTemp= list(t)

ListTemp.append(7)

t= tuple(ListTemp)结果: (3,4,5,6,7)。

方法二: 元组嵌套。t= (3,4,5,6)

(t,7)结果: ((3,4,5,6),7)。

题目(2)的改正如下。

方法一: 元组�擦斜愍苍�组。t= (3,4,5,6)

ListTemp= list(t)

ListTemp.remove(4)

t= tuple(ListTemp)结果: (3,5,6,7)。

方法二: 元组嵌套。t= (3,4,5,6)

(t\[0:t.index(4)\], t\[t.index(4)+1:len(t)\])结果: ((3,), (5, 6))。

注意: (3,)是一个仅有一个元素的元组,而(3)则是一个表达式。题目(3)的改正如下。

方法一: 元组�擦斜愍苍�组。t= (3,4,5,6)

ListTemp= list(t)

ListTemp\[ListTemp.index(5)\]= 8

t= tuple(ListTemp)结果: (3,4,8,6)。

方法二: 元组嵌套t= (3,4,5,6)

(t\[0:3\], 8, t\[3:len(t)\])结果: ((3, 4, 5), 8, (6,))。

题目(4)的改正如下。

方法一: 元组�擦斜愍苍�组。t= (3,4,5,6)

ListTemp= list(t)

ListTemp\[ListTemp.index(5)\]= 1

t= tuple(ListTemp)结果: (3,4,1,6)。

方法二: 元组嵌套。t= (3,4,5,6)

(t\[0:t.index(5)\], 1, t\[t.index(5)+1:len(t)\])结果: ((3, 4), 1, (6,))。

【例5��3】判断下列字典操作是否正确,并解释错误原因。设字典d={'a': 1, 'b': 2, 'c': 3}。

(1) 读取字典中第一个位置的元素,执行d\[0\]。

(2) 删除字典中最后一个位置的元素,执行d.pop()。

(3) 将d\['d'\]=4插入到字典中键值为'b'的位置后,执行d.insert\[3,'d'\]=4。

(4) 将字典中键为'a'的值修改为1,执行d\['a'\]=5。

解答: (1) 错误。字典是用键key读取其映射的值的,在字典中没有下标的概念。所以,在字典中执行d\[0\]操作,字典无法识别0的含义。读取字典中第一个位置的元素,应该执行d\['a'\]。

(2) 错误。原因和(1)相同,字典中涉及添加、读取或删除值等操作,都必须通过键key来完成。因此,删除最后一个位置的元素,应该执行d.pop('c')。

(3) 错误。字典是一个无序数据类型,它输出的顺序是按照字典中各值的id进行排序的。因此,字典无法执行在某个指定位置插入一个键�仓刀缘牟僮鳌V荒芡ü�执行d.\['d'\]=4向字典中随机地插入一个键�仓刀裕�无法控制该键�仓刀缘牟迦胛恢谩�

(4) 正确。字典是一个可修改的数据类型,可以通过指定键来修改它所映射的值。

5.1集合关系

集合关系体现了事物间的聚集。在Python中,可以用列表或元组来直接创建数据间的集合关系。集合除了将各数据元素聚集在一起外,别无他用。集合常用来表示或处理一组数据,例如由学号组成的学生集合、由账号组成的用户集合等。我们经常会对集合中的元素执行查找、添加、删除、修改和排序等操作。

【例5��4】设计学生信息管理系统。

解答: 这是一种开放式命题,题目完成的质量主要取决于设计者对需求的把握程度。任何实际问题都要经过适度地抽象和化简,才能转换为计算机所能求解的数学模型。在简化过程中,“恰当”十分重要,简化后的模型既不能过易,也不能太难,抓住本质最佳。同时,在合理和简化之间要做出折中。

针对本题,经过调研和已有经验,可以确定学生信息管理系统主要包括对学生学号的查找、添加、删除、修改和排序等操作。这里采用列表创建用于存储学生学号的集合。为了增强程序的健壮性,在对列表中的元素执行添加、删除或修改等操作前,需要判断该

……

Python程序设计与实践:用计算思维解决问题最新最全的试读、书评、目录、简介信息由Python中文网整理提供。