PYTHON程序设计与实践:用计算思维解决问题/李莹
PYTHON程序设计与实践:用计算思维解决问题/李莹作者:编者:李莹 开 本:16开 书号ISBN:9787302473893 定价: 出版时间:2018-06-01 出版社:清华大学出版社 |
PYTHON程序设计与实践:用计算思维解决问题/李莹 内容简介
本教材主要讲授Python程序设计知识,采用案例教学和问题驱动的撰写方法,注重实践思维、计算思维和创新思维等教育理念与教材内容的结合。本教材将知识点和实际应用相结合,以教学案例引出理论讲解。案例源于现实生活,旨在让读者理解实际问题被抽象化、模型化和程序化的全过程。内容涵盖Python应用的各个方面,以对比方式阐述人和计算机在解决问题时的异同,让读者理解计算思维的本质。教材在设计上由易到难,分别阐述计算机如何描述和处理现实世界中的各类事物,如何表示各类事物之间的关系,如何组织和优化程序结构等,使读者能够将程序设计和现实问题相关联。在讲解某一知识点时,横向延伸与之相关的各类知识点;在讲解某一个案例时,纵向扩展该案例所能实现的各种功能模块,使读者能够比较全面、深入地理解问题和掌握知识。教材穿插了一些技巧性、实用性的说明,并且对重要代码添加了注释。本教材免费提供与内容相配套的教学课件和各个案例的程序源代码。本教材的内容涵盖范围较广,案例贴近实际,既可作为以Python为基础的程序设计类课程的配套教材,又可作为学习Python的很好的自学参考书,也适合各层次Python开发人员阅读参考。
PYTHON程序设计与实践:用计算思维解决问题/李莹 目录
第1章良好的编程习惯11.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程序设计与实践:用计算思维解决问题/李莹 节选
第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是一对键?值对,key是键,value是值。字典在存储时会根据元素的hashcode进行排序,可能会导致实际存储顺序和书写顺序不同d={'a': 1, 'b': 2, 'c': 3},结果{'c': 3, 'b': 2, 'a': 1}。字典读取元素Dic.get(key)通过键读取该键在字典Dic中对应的值。如果key存在,则返回key对应的值;否则,返回Noned.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中的各键?值对。如果Dic1中的键在Dic中存在,则用该键在Dic1中对应的值更新Dic中对应的值;否则,将该键?值对添加到Dic中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进行排序的。因此,字典无法执行在某个指定位置插入一个键?值对的操作。只能通过执行d.\['d'\]=4向字典中随机地插入一个键?值对,无法控制该键?值对的插入位置。 (4) 正确。字典是一个可修改的数据类型,可以通过指定键来修改它所映射的值。 5.1集合关系 集合关系体现了事物间的聚集。在Python中,可以用列表或元组来直接创建数据间的集合关系。集合除了将各数据元素聚集在一起外,别无他用。集合常用来表示或处理一组数据,例如由学号组成的学生集合、由账号组成的用户集合等。我们经常会对集合中的元素执行查找、添加、删除、修改和排序等操作。 【例5?4】设计学生信息管理系统。 解答: 这是一种开放式命题,题目完成的质量主要取决于设计者对需求的把握程度。任何实际问题都要经过适度地抽象和化简,才能转换为计算机所能求解的数学模型。在简化过程中,“恰当”十分重要,简化后的模型既不能过易,也不能太难,抓住本质*佳。同时,在合理和简化之间要做出折中。 针对本题,经过调研和已有经验,可以确定学生信息管理系统主要包括对学生学号的查找、添加、删除、修改和排序等操作。这里采用列表创建用于存储学生学号的集合。为了增强程序的健壮性,在对列表中的元素执行添加、删除或修改等操作前,需要判断该 ……
教材 研究生/本科/专科教材 工学
在线阅读
- 最新内容
- 相关内容
- 网友推荐
- 图文推荐
[高考] 2022 西安电子科技大学《软件工程》大作业答案 (2022-04-25) |
[家长教育] 孩子为什么会和父母感情疏离? (2019-07-14) |
[教师分享] 给远方姐姐的一封信 (2018-11-07) |
[教师分享] 伸缩门 (2018-11-07) |
[教师分享] 回家乡 (2018-11-07) |
[教师分享] 是风味也是人间 (2018-11-07) |
[教师分享] 一句格言的启示 (2018-11-07) |
[教师分享] 无规矩不成方圆 (2018-11-07) |
[教师分享] 第十届全国教育名家论坛有感(二) (2018-11-07) |
[教师分享] 贪玩的小狗 (2018-11-07) |