- ISBN:9787302505976
- 装帧:一般胶版纸
- 册数:暂无
- 重量:暂无
- 开本:16开
- 页数:373
- 出版时间:2018-10-01
- 条形码:9787302505976 ; 978-7-302-50597-6
本书特色
全书包含370段程序实例和300道习题。作者为普林斯顿大学博士、千人计划专家、长江学者,曾担任美国UTD大学教师20余年,在讲授Python编程方面具有丰富经验。 《编程导论——以Python为舟》为双色印刷,重点突出,便于读者深入理解和查询知识点。
内容简介
本书以大量的编程实例与作者多年编程实践的体会来揭示编程的本质,系统性地指导读者如何编程。书中所有代码都用Python语言编写,通过编程实例讲解Python语言的所有知识点,使读者在掌握编程思维和技巧(逻辑思维能力、计划构建能力、循环计算能力、递归求解能力等)的同时,自然而然地熟练掌握Python语言。 本书既适合作为“程序设计基础”“编程导论”“Python语言程序设计”等课程的教材,也适合参加编程竞赛的、自学Python编程的中学生、大中专学生、程序员及普通读者参考。
目录
目录
第1章初探编程之境
1.1计算机编程的基本概念
1.1.1编程如何解决问题
1.1.2解决鸡兔同笼问题的编程思维
1.1.3解决排序与合并问题的编程思维
1.1.4解决过河问题的编程思维
1.1.5程序的基本要素
1.2乘Python之舟进入计算机语言的世界
1.2.1什么是Python
1.2.2如何在Windows中使用Python
1.3解释a=a+3
1.3.1介绍变量
1.3.2关于a=a+3
1.3.3常用算术运算符
1.4介绍数据类型
1.4.1布尔类型
1.4.2列表
1.4.3字符串
1.5学习Python的控制语句
1.5.1条件控制语句——if语句
1.5.2循环控制语句——for循环
1.5.3循环控制语句——while循环
习题
第2章巩固编程基础
2.1再谈Python的循环控制语句
2.1.1遍历加积累的循环结构
2.1.2以不同编程方式解决相同问题
2.1.3for与while循环的比较
2.1.4中国余数定理的循环实现
2.2函数的简介
2.2.1什么是函数
2.2.2函数的创建与调用
2.2.3几种常用的内置函数
2.3探讨编程思路
2.3.1以多项式运算为例
2.3.2编程思路的总结
2.4讨论循环中的一些技巧
2.4.1讨论“for i in range():”结构
2.4.2讨论“for e in L:”结构,L为一个列表
2.5活学活用——运行Python解决问题
2.5.1几种简单的排序算法及衍生问题
2.5.2二进制、十进制等进制之间的转换问题
2.5.3扑克牌游戏——21点
2.5.4老虎机游戏
习题
第3章深谈Python函数、变量与输入输出
3.1深入了解函数的各种性质
3.1.1编写完美函数
3.1.2参数与返回值
3.1.3局部变量与全局变量
3.1.4嵌套函数
3.1.5参数类型
3.2再谈序列与字典数据类型
3.2.1列表与元组
3.2.2字符串
3.2.3字典
3.3关于Python数据类型的注意事项
3.3.1可变与不可变类型的讨论
3.3.2参数的传递问题
3.3.3默认参数的传递问题(可选)
3.4深入探讨列表的常用操作与开销
3.4.1添加列表元素的讨论
3.4.2删除列表元素的讨论
3.4.3生成列表的一些技巧
3.5输入输出、文件操作与异常处理
3.5.1输入
3.5.2输出
3.5.3文件操作
3.5.4异常处理
习题
第4章探究递归求解的思维方式
4.1理解递归求解的思维方式
4.1.1递归的基本思路
4.1.2递归求解的例子
4.2用递归方式重温例题
4.2.1递归实现数列求和
4.2.2递归实现归并
4.2.3递归求解因数分解
4.3list、string内置函数的非递归与递归实现
4.3.1列表内置函数的实现
4.3.2字符串内置函数的实现
4.4四种不同的递归方式来解决排序问题
4.4.1选择排序
4.4.2插入排序
4.4.3快速排序
4.4.4归并排序
4.4.5四种排序方式的比较
习题
第5章熟练递归编程
5.1二分法求解问题
5.1.1什么是二分法
5.1.2在有序序列中使用二分法查找元素位置
5.1.3求解算术平方根
5.2求两个数的*大公因数
5.2.1因数分解法求*大公因数
5.2.2欧几里得算法求*大公因数
5.2.3讨论因数分解法与欧几里得算法的优劣
5.3中国余数定理问题
5.3.1介绍相关的基础知识
5.3.2中国余数定理问题的求解
5.4关于递归函数开销的讨论
5.4.1函数调用的开销
5.4.2参数传递过程中的开销
5.4.3重复计算的开销
5.5用递归思维解决线性方程组问题
5.6用各种编程方式解决排列问题
5.6.1全排列问题
5.6.2通用排列问题
5.7用各种编程方式解决组合问题
5.7.1在排列问题的解法上解决组合问题(解法一)
5.7.2非递归方式解决组合问题(解法二)
5.7.3特殊二分方式解决组合问题(解法三)
5.7.4循环递归方式解决组合问题(解法四)
习题
第6章智能是计算出来的
6.1老鼠走迷宫问题
6.2菜鸡狼过河问题
6.3AB猜数字游戏
6.424点游戏
6.5*后拿牌就输
习题
第7章面向对象编程与小乌龟画图
7.1初识面向对象编程
7.1.1什么是对象
7.1.2体会面向对象编程的优势
7.2面向对象中的概念
7.2.1类与对象
7.2.2Python中的__init__()方法
7.2.3self变量和pass关键字
7.2.4Python中“公有”和“私有”类型的定义方式
7.3了解面向对象的三大特性
7.3.1封装
7.3.2继承
7.3.3多态
7.4初识小乌龟
7.4.1小乌龟的属性
7.4.2基本图形的绘制
7.4.3递归图形的绘制
7.5多个小乌龟的动图绘制
7.5.1过河游戏
7.5.2小老鼠走迷宫
习题
第8章掌握编程的精华——算法
8.1深入浅出之算法
8.1.1算法时间复杂度分析
8.1.2图的基本介绍
8.2深度优先搜索
8.2.1何为深搜
8.2.2图的深搜
8.2.3拓扑排序问题
8.2.4一个有趣的迷宫例子
8.3*短路径问题
8.3.1有向无环图的*短路径问题
8.3.2权值非负的有环图的*短路径问题
8.4动态规划算法
8.4.1拦截导弹问题
8.4.2背包问题
8.4.3*短路径问题
习题
参考文献
节选
第5章熟练递归编程 第4章中讲解了递归函数以及递归思维,也带大家练习了很多递归的小程序,熟练递归编程是编程教育的重点!所以本章将讲解多个较为复杂和完整的例子,使得读者能进一步熟悉递归算法的思维。在本章的前面,首先讲解一个在解决问题中十分常用也非常重要的思想: 二分法思想。通过二分查找、求解算术平方根等小例子让大家熟悉二分法思想。然后再通过一些完整的实例来带大家熟练递归编程,如: 求两个数的*大公因数、中国余数定理、解线性方程组、排列组合问题等。其中排列问题和组合问题是本章的重点,我们希望通过讲解各种可用的求解方法来培养大家思考问题的方式并拓宽思路。相信从本章中读者也会渐渐体会到计算机思维和它的美丽。 5.1二分法求解问题 二分法思想在平时解决问题时十分重要,它可大大降低问题的复杂度,故本节首先讲解什么是二分法思想,然后通过几个小例子带领大家熟练掌握这一思想,并体会二分法思想的妙处。 5.1.1什么是二分法 何为“二分法”?首先来看一个小游戏: 以前电视台上有个很受大家欢迎的节目叫作“看商品,猜价格”,游戏规则是给出一件商品让你猜出它的准确价格,主持人给的提示只有“高了”或“低了”,如果在规定时间里猜中商品价格,这件商品就是你的了。例如主持人给出一个微波炉的价格介于200~1000元,它的实际价格是860元。 其中一种猜价格的方法为: 参赛者按照价格依次递增的顺序进行猜测,比如依次猜300、400、500、600、700、800,主持人都会给出“低了”的提示,接下来猜900,后主持人给出“高了”的提示,这时我们知道价格位于800~900,然后又从800开始递增地去猜,重复上述操作,直到猜中为止。 上述方法显然很慢,那么有没有一种快速而简单的方法呢?我们可以这样猜,**次猜200~1000中间的价格600元,这时主持人会给出“低了”的提示,我们立马知道价格在600~1000了,第二次猜600到1000的中间价格800元,这时主持人给出“低了”的提示,我们便知道价格在800~1000,第三次再取中间价格900元,主持人给出“高了”的提示,而此时我们只用了3次就把区间锁定在800~900了,利用这种方法再去猜800~900的数,直到猜中为止。 综上所述,第二种方法每次将猜测的区间缩小到原来的一半,明显好于**种方法。这种每次将解空间缩小为原来空间的一半,逐步逼近正确的解的方法 图51二分法思路图 就是二分法,如图51所示为二分法的思路图。有的同学可能会说本书前面的排序例子,比如归并排序、快速排序也是用了二分法,这样的看法不够全面,我们在排序中是先将问题分成两部分,然后分别对每部分进行处理,再将处理结果合并成*终的答案,是一种“先分后合,分而治之”的思想,严格说这是分治法,就如同在第4章中讲解用分治法的思想求数列的和、求数列的*小值和*大值一样; 而二分法主要强调的是“分”,其基本思想是,每次将搜索的区间减少一半,因此可以快速缩小搜索范围,区别是二分法“分而未合”。 5.1.2在有序序列中使用二分法查找元素位置 本节主要研究在给定的一个有序序列中如何快速找出某个给定的元素位置,简称为二分查找,5.1.1节的猜价格游戏其实就是二分查找的例子。那么如何进行二分查找?我们可以这样做: 每次取当前所剩序列的中间元素作为比较对象,若给定的值和中间元素相等,则查找成功; 若给定值小于中间元素,则在中间元素的左半区继续查找; 若给定值大于中间元素,则在中间元素的右半区继续查找。不断重复上述过程直到查找成功,或所查找的区域没有元素,查找失败。 上述二分查找方法的过程如图52所示,k为要查找的值,查找区间是r0到rn(有序区间),我们选择区间中间的值rmid作为比较对象,若k=rmid则查找成功,若k>rmid,则在右半区进行查找,若k 图52折半查找的基本思想图解 本节将通过讲解在有序序列中查找和插入元素这两个小例子来带领大家理解二分法思想。 1. 在有序序列中查找元素位置(二分查找) 【问题描述】对于给定的有序序列L,在该序列中用二分法的思想查找元素k是否存在于L中。若存在,则返回索引值,否则返回-1或者False。 【解题思路】假定一个有序序列为L=[7,14,18,21,23,29,31,35,38,42,46,49,52],利用二分查找的方法在该序列中查找值为14的元素。我们可以利用图53清晰地表示查找过程。*开始用变量low和high来标识当前查找的区间范围即为整个L,之后每次计算出该区间的中点mid=(low+high)//2,则将L[mid]的值与14做对比,若L[mid]>14,则将mid-1赋值给high; 若L[mid] 图53二分查找过程 问题: 请各位同学想一想。为什么是将mid-1而不是mid赋值给high?同样,为什么是将mid+1而不是mid赋值给low? 了解了二分法查找的过程,就可以方便地用程序实现了,如所示,BinSearch_ non_recursive函数有两个参数: L和k,该函数可实现在列表L中找元素k的位置的功能。在函数的开始,我们需要一些辅助变量: low表示待查找区间的起始位置,high表示结束位置。每次都取中间元素和k进行比较,若k比中间位置的元素小,则说明待查找的元素在左半区间,则令high=mid-1,继续执行循环; 若k比中间位置的元素大,则说明待查找的元素在右半区间,则令low=mid+1,继续执行循环; 若k和中间位置元素相等,则查找成功,可以直接返回中间位置mid,无须继续循环。当然,while循环要有终止条件: 当不满足low≤high时,即若出现low>high的情况,则表明没有找到k,查找失败,返回-1。 # def BinSearch_non_recursive(L,k): low=0;high=len(L)-1 while(low mid=(low+high)//2#注意整除符号 if k elif k>L[mid]: low=mid+1 else: return mid return -1 当然二分法查找的过程也可以用递归实现,递归的思路是要查找的元素k每次和列表中的中间元素比较,若不相等,则将查找区间分为左半区和右半区,若k小于中间元素,则在左半区继续查找; 若k大于中间元素,则在右半区继续查找。递归终止的条件是查找区间的中间元素为要查找元素k,即查找成功,或者查找区间为空,即查找失败。注意,在编写递归函数时需要返回两个值: **个返回值是布尔值,True表示找到,False表示没找到,第二个返回值表示所找到的元素在序列中的索引。分析到这里有的同学可能会问: 当前函数所返回的索引是折半后新序列的索引,并不是原序列的索引啊!没错,所以如果查找的是右半部分,还需要在返回索引时加上另一半序列的长度。程序实现如所示。 # def BinSearch(L,k): if L==[]:return False,-1 #没找到 if len(L)==1: if k==L[0]:return True,0 return False,-1 if k==L[len(L)//2]:return True,len(L)//2 if k else: flag,index=BinSearch(L[len(L)//2:],k)#可否len(L)//2+1? return flag,len(L)//2+index 函数BinSearch(L,k)表示在列表L中查找元素k,若L为空,则返回False、-1,表示查找失败,递归终止; 若L中只剩一个元素,则判断该元素是否和k相等,若相等则返回True以及k在当前L中的位置(即0),查找成功,递归终止; 若不相等则返回False、-1,递归终止; 若L中元素个数大于1,则k和L的中间元素比较,若k等于L[len(L)//2],则查找成功,返回True以及k在当前L中的位置len(L)//2,递归终止; 若k小于L[len(L)//2],则继续调用BinSearch(L[0:len(L)//2],k),在L的左半区域继续查找,若k大于L[len(L)//2],继续调用BinSearch(L[len(L)//2:],k),在L的右半区域继续查找,并将调用函数返回的元素位置加len(L)//2。 问题(见习题)要如何改写程序,使得若k大于L[len(L)//2],调用BinSearch(L[len(L)//2+1:],k)。注意,要改动return的索引len(L)//2+index。 兰兰: 为什么一定要用两个返回值呢?既然没有找到,则索引值可以返回-1,也就是说,可以用-1表示没有找到,那么**个布尔类型的返回值岂不是多余了? 沙老师: 两个返回值是必需的!请仔细想一想,虽然在没有找到时会返回-1,但是这个-1会返回给上一层函数,而在计算右半部分的索引值时需要加上序列长度值的一半,所以一旦-1加上这个数之后就是一个正数,如果没有False标志,就无法判别是否真的找到了k这个值。所以再次提醒大家,递归函数的终止条件,包括终止的时候需要返回什么,很重要! 练习题5.1.1如何改写程序使得上述递归函数的返回值只有一个。 【解题思路】上述递归函数之所以需要返回两个值,是因为在传递参数的过程中列表发生了改变,则其索引也相应地发生了变化,而我们要求的是原列表的索引,所以在对列表索引进行返回时会相应进行一定的加法运算而造成结果出错。所以,为了避免这种情况的发生,可以将新的参数列表在原列表中的起始位置作为参数进行传递。但是这就造成递归函数的参数与之前定义的不一致,所以可以通过嵌套函数的方式使得递归函数与外界的界面保持接口一致,且接口相对简洁。程序如所示。 # def binary_r0_search(L,a): def r0_search(L,index_min):
作者简介
沙行勉 (Edwin Sha),博士生导师,2000年起任美国终身制正教授 (Full Professor),中国国家千人计划(A类)特聘专家,长江学者讲座教授,海外杰出青年学者。于1986年获得台湾大学计算机科学系学士学位,在海军陆战队服役两年后赴美国普林斯顿大学(Princeton University)就读。于1991年和1992年分别获美国普林斯顿大学计算机科学系硕士学位和博士学位。1992年起任教于美国圣母大学(University of Notre Dame)计算机科学与工程系,并于1995年起担任该系副系主任和研究生部主任。2000年起作为终身制正教授任教于美国得克萨斯州大学达拉斯分校(UTD)计算机科学系,2001年曾担任计算机科学部主任。任上海交通大学、山东大学、北京航空航天大学、湖南大学等客座、兼任教授或博导。2008年被评为海外杰出青年学者。2010年起任教育部长江学者讲座教授。2011年起任国家千人计划特聘专家,2012—2017年任重庆大学国家特聘教授和计算机学院院长。现全职任上海华东师范大学终身特聘教授。 至2017年,已在相关国际学术会议及国际核心期刊上发表英文学术论文400余篇, 其中包括60余篇IEEE和ACM Transactions期刊论文。共获各类教学、科研奖项近40项,其中包括: 美国Oak Ridge 大学联盟颁发的杰出青年教授奖,美国国家科学基金颁发的杰出学术发展奖, 美国圣母大学颁发的杰出教学奖,世界期刊ACM Transactions(ACM TODAES)颁发的2011年度论文奖,以及IEEE Transactions on Computers颁发的2016年度代表论文等。多次以大会主席身份主持国际重要学术会议。沙教授在教学方面深受中美学生的喜爱,例如,在美国从教期间,他在每学期由学生给老师打分的教学评鉴中都得到高分。沙行勉教授喜爱中国传统文化及儒释道哲学,以人才培养、教学育人为其终身的兴趣及志向。
-
落洼物语
¥8.7¥28.0 -
当代中国政府与政治(新编21世纪公共管理系列教材)
¥33.6¥48.0 -
中国当代文学名篇选读
¥19.1¥53.0 -
中医基础理论
¥50.7¥59.0 -
北大人文课(平装)
¥13.9¥45.0 -
外国教育史-第2版
¥24.4¥40.0 -
宪法-第二版
¥12.2¥29.0 -
先进防伪技术
¥81.3¥98.0 -
当代中国政府与政治 第二版
¥57.8¥68.0 -
EPLAN电气设计
¥29.9¥39.8 -
闯进数学世界――探秘历史名题
¥21.3¥32.8 -
企业法务教程
¥34.8¥49.0 -
习近平新时代中国特色社会主义思想概论
¥18.2¥26.0 -
毛泽东思想和中国特色社会主义理论体系概论(2021年版)
¥6.8¥25.0 -
金融学
¥29.9¥49.0 -
计算机操作系统教程(第4版)(清华大学计算机系列教材)
¥31.9¥49.0 -
古代汉语(第四册)
¥16.1¥35.0 -
管理学:原理与方法(第7版)(博学.大学管理类)/周三多
¥30.9¥49.0 -
(平装)北大必修课:北大口才课
¥12.2¥45.0 -
海商法-第四版
¥30.2¥48.0