程序设计基础习题答案与.doc
Python程序设计基础习题答案与分析程昱第1章 基础知识1.1 简单说明如何选择正确的Python版本。答在选择Python的时候,一定要先考虑清楚自己学习Python的目的是什么,打算做哪方面的开发,有哪些扩展库可用,这些扩展库最高支持哪个版本的Python,是Python 2.x还是Python 3.x,最高支持到Python 2.7.6还是Python 2.7.9。这些问题都确定以后,再做出自己的选择,这样才能事半功倍,而不至于把大量时间浪费在Python的反复安装和卸载上。同时还应该注意,当更新的Python版本推出之后,不要急于更新,而是应该等确定自己所必须使用的扩展库也推出了较新版本之后再进行更新。尽管如此,Python 3毕竟是大势所趋,如果您暂时还没想到要做什么行业领域的应用开发,或者仅仅是为了尝试一种新的、好玩的语言,那么请毫不犹豫地选择Python 3.x系列的最高版本(目前是Python 3.4.3)。1.2 为什么说Python采用的是基于值的内存管理模式Python采用的是基于值的内存管理方式,如果为不同变量赋值相同值,则在内存中只有一份该值,多个变量指向同一块内存地址,例如下面的代码。 x 3 idx10417624 y 3 idy10417624 y 5 idy10417600 idx10417624 x 1, 2, 3, 1, 1, 2 idx0idx3idx4True1.3 解释Python中的运算符“/”和“”的区别。答在Python 2.x中,“/”为普通除法,当两个数值对象进行除法运算时,最终结果的精度与操作数中精度最高的一致;在Python 3.x中,“/”为真除法,与除法的数学含义一致。在Python 2.x和Python 3.x中,“”表示整除,对整数或浮点数进行该运算时,结果为数学除法的整数部分。1.4 在Python中导入模块中的对象有哪几种方式答常用的有三种方式,分别为l import 模块名 as 别名l from 模块名 import 对象名 as 别名l from math import *1.5 pip 是目前比较常用的Python扩展库管理工具。1.6 解释Python脚本程序的“name”变量及其作用。答每个Python脚本在运行时都有一个“name”属性。如果脚本作为模块被导入,则其“name”属性的值被自动设置为模块名;如果脚本独立运行,则其“name”属性值被自动设置为“main”。利用“name”属性即可控制Python程序的运行方式。1.7 运算符“” 可以 (可以、不可以)对浮点数进行求余数操作。1.8 一个数字“5” 是 (是、不是)合法的Python表达式。1.9 在Python 2.x中,函数接收到的数据类型由 界定符 确定,而在Python 3.x中该函数则认为接收到的用户输入数据一律为 字符串 。1.10 编写程序,用户输入一个三位以上的整数,输出其百位以上的数字。例如用户输入1234,则程序输出12。(提示使用整除运算。)答1)Python 3.4.2代码x Please an integer of more than 3 digitstry x intx x x100 if x 0 printYou must an integer of more than 3 digits. else printxexcept BaseException printYou must an integer.2)Python 2.7.8代码import typesx Please an integer of more than 3 digitsif typex types.IntType print You must an integer.elif lenstrx 4 print You must an integer of more than 3 digits.else print x100第2章 Python序列2.1 为什么应尽量从列表的尾部进行元素的增加与删除操作答当列表增加或删除元素时,列表对象自动进行内存扩展或收缩,从而保证元素之间没有缝隙,但这涉及到列表元素的移动,效率较低,应尽量从列表尾部进行元素的增加与删除操作以提高处理速度。2.2 range函数在Python 2.x中返回一个 包含整数的列表 ,而Python 3.x的range函数返回一个 可迭代的range对象 。2.3 编写程序,生成包含1000个0到100之间的随机整数,并统计每个元素的出现次数。答可以使用集合来实现该功能。1)Python 3.4.2代码import randomx random.randint0,100 for i in range1000d setxfor v in d printv, , x.countv2)Python 2.7.8代码import randomx random.randint0,100 for i in range1000d setxfor v in dprint v, , x.countv也可以直接使用字典来实现该功能,并且获得更高的执行效率,例如下面的Python 3.4.2代码listRandom random.randint1,100 for i in range1000000d dictstart time.timefor i in listRandom 对随机数列表扫描一次,即可得到结果 di d.geti,01printtime.time-start2.4 表达式“3 in 1, 2, 3, 4”的值为 False 。2.5 编写程序,用户输入一个列表和2个整数作为下标,然后输出列表中介于2个下标之间的元素组成的子列表。例如用户输入1, 2, 3, 4, 5, 6和2,5,程序输出3, 4, 5, 6。答1)Python 3.4.2代码x Please a listx xstart, end Please the start position and the end positionprintxstartend2)Python 2.7.8代码x Please a liststart, end Please the start position and the end positionprint xstartend2.6 列表对象的sort方法用来对列表元素进行原地排序,该函数返回值为 None 。2.7 列表对象的 remove 方法删除首次出现的指定元素,如果列表中不存在要删除的元素,则抛出异常。2.8 假设列表对象aList的值为3, 4, 5, 6, 7, 9, 11, 13, 15, 17,那么切片aList37得到的值是 6, 7, 9, 11 。2.9 设计一个字典,并编写程序,用户输入内容作为“键”,然后输出字典中对应的“值”,如果用户输入的“键”不存在,则输出“您输入的键不存在”答1)Python 3.4.2代码d 1a, 2b, 3c, 4dv Please a keyv vprintd.getv,您输入的的键不存在2)Python 2.7.8代码d 1a, 2b, 3c, 4dv Please a keyprintd.getv,您输入的的键不存在2.10 编写程序,生成包含20个随机数的列表,然后将前10个元素升序排列,后10个元素降序排列,并输出结果。答1)Python 3.4.2代码import randomx random.randint0,100 for i in range20printxy x010y.sortx010 yy x1020y.sortreverseTruex1020 yprintx2)Python 2.7.8代码import randomx random.randint0,100 for i in range20print xy x010y.sortx010 yy x1020y.sortreverseTruex1020 yprint x2.11 在Python中,字典和集合都是用一对 大括号 作为界定符,字典的每个元素有两部分组成,即 “键” 和 “值” ,其中 “键” 不允许重复。2.12 使用字典对象的 items 方法可以返回字典的“键-值对”列表,使用字典对象的 keys 方法可以返回字典的“键”列表,使用字典对象的 values 方法可以返回字典的“值”列表。2.13 假设有列表a name, age, sex和b Dong, 38, Male,请使用一个语句将这两个列表的内容转换为字典,并且以列表a中的元素为“键”,以列表b中的元素为“值”,这个语句可以写为 c dictzipa,b 。2.14 假设有一个列表a,现要求从列表a中每3个元素取1个,并且将取到的元素组成新的列表b,可以使用语句 b a3 。2.15 使用列表推导式生成包含10个数字5的列表,语句可以写为 5 for i in range10 。2.16 不可以 (可以、不可以)使用del命令来删除元组中的部分元素。第3章 选择与循环3.1 分析逻辑运算符“or”的短路求值特性。答假设有表达式“表达式1 or 表达式2”,如果表达式1的值等价于True,那么无论表达式2的值是什么,整个表达式的值总是等价于True。因此,不需要再计算表达式2的值。3.2 编写程序,运行后用户输入4位整数作为年份,判断其是否为闰年。如果年份能被400整除,则为闰年;如果年份能被4整除但不能被100整除也为闰年。答1)Python 3.4.2代码x Please an integer of 4 digits meaning the yearx xif x4000 or x40 and not x1000 printYeselse printNo2)Python 2.7.8代码x Please an integer of 4 digits meaning the yearif x4000 or x40 and not x1000 print Yeselse print No3.3 Python提供了两种基本的循环结构 for循环 和 while循环 。3.4 编写程序,生成一个包含50个随机整数的列表,然后删除其中所有奇数。(提示从后向前删。)答Python 3.4.2代码如下,import randomx random.randint0,100 for i in range50printxi lenx-1while i0 if xi21 del xi i-1printx3.5 编写程序,生成一个包含20个随机整数的列表,然后对其中偶数下标的元素进行降序排列,奇数下标的元素不变。(提示使用切片。)答Python 3.4.2代码如下,import randomx random.randint0,100 for i in range20printxy x2y.sortreverseTruex2 yprintx3.6 编写程序,用户从键盘输入小于1000的整数,对其进行因式分解。例如,1025,602235。答1)Python 3.4.2代码x Please an integer less than 1000x xt xi 2result while True if t1 break if ti0 result.appendi t t/i else i1printx,,*.joinmapstr,result2)Python 2.7.8代码x Please an integer less than 1000t xi 2result while True if t1 break if ti0 result.appendi t t/i else i1print x,,*.joinmapstr,result3.7 编写程序,至少使用2种不同的方法计算100以内所有奇数的和。答Python 3.4.2代码如下,如果使用Python 2.7.8只需要把其中的print函数改为print语句即可。x i for i in range1,100 if i21printsumxprintsumrange1,10023.8 编写程序,输出所有由1、2、3、4这四个数字组成的素数,并且在每个素数中每个数字只使用一次。答Python 3.4.2代码如下,答Python 3.4.2代码如下,如果使用Python 2.7.8只需要把其中的print函数改为print语句即可。x Please xx xif x0 or x20 print0elif 0x5 printxelif 5x10 print3*x-5elif 10x20 print0.5*x-23.9 编写程序,实现分段函数计算,如下表所示。xyx000x5x5x103x-510x200.5x-220x0答Python 3.4.2代码如下,如果使用Python 2.7.8只需要把其中的print函数改为print语句即可。x Please xx xif x0 or x20 print0elif 0x5 printxelif 5x10 print3*x-5elif 10x20print0.5*x-2第4章 字符串与正则表达式4.1 假设有一段英文,其中有单独的字母“I”误写为“i”,请编写程序进行纠正。答这里给出Python 3.4.2代码,如果使用Python 2.7.8的话只需要修改其中的print函数为print语句即可。1)不使用正则表达式x i am a teacher,i am man, and i am 38 years old.I am not a businessman.x x.replacei ,I x x.replace i , I printx2)使用正则表达式x i am a teacher,i am man, and i am 38 years old.I am not a businessman.import repattern pilerw|biwwhile True result pattern.searchx if result if result.start0 0 x xresult.start01Ixresult.end0-1 else x xresult.start0Ixresult.end0-1 else breakprintx4.2 假设有一段英文,其中有单词中间的字母“i”误写为“I”,请编写程序进行纠正。答这里给出Python 3.4.2代码,如果使用Python 2.7.8的话只需要修改其中的print函数为print语句即可。import rex I am a teacher,I am man, and I am 38 years old.I am not a busInessman.printxpattern pilerwIwwhile True result pattern.searchx if result if result.start0 0 x xresult.start01ixresult.end0-1 else x xresult.start0ixresult.end0-1 else breakprintx4.3 有一段英文文本,其中有单词连续重复了2次,编写程序检查重复的单词并只保留一个。例如文本内容为“This is is a desk.”,程序输出为“This is a desk.”答这里给出Python 3.4.2代码,如果使用Python 2.7.8的话只需要修改其中的print函数为print语句即可。1)方法一import rex This is a a desk.pattern pilerbws11,bmatchResult pattern.searchxx pattern.submatchResult.group1,xprintx2)方法二x This is a a desk.pattern pilerPfbwbsPfmatchResult pattern.searchxx x.replacematchResult.group0,matchResult.group14.4 简单解释Python的字符串驻留机制。答Python支持字符串驻留机制,即对于短字符串,将其赋值给多个不同的对象时,内存中只有一个副本,多个对象共享该副本。这一点不适用于长字符串,即长字符串不遵守驻留机制,下面的代码演示了短字符串和长字符串在这方面的区别。 a 1234 b 1234 ida idbTrue a 1234*50 b 1234*50 ida idbFalse4.5 编写程序,用户输入一段英文,然后输出这段英文中所有长度为3个字母的单词。答这里给出Python 3.4.2代码,如果使用Python 2.7.8的话只需要修改其中的print函数为print语句即可。import rex Please a stringpattern pilerba-zA-Z3bprintpattern.findallx第5章 函数设计与使用5.1 运行5.3.1小节最后的示例代码,查看结果并分析原因。答原因是对于函数的默认值参数只会被处理一次,下次再调用函数并且不为默认值参数赋值时会继续使用上一次的结果,对于列表这样的结构,如果调用函数时为默认值参数的列表插入或删除了元素,将会得到保留,从而影响下一次调用。5.2 编写函数,判断一个整数是否为素数,并编写主程序调用该函数。答这里给出Python 3.4.2代码,如果使用Python 2.7.8的话只需要修改其中的print函数为print语句即可。import mathdef IsPrimev n intmath.sqrtv1 for i in range2,n if vi0 return No else return YesprintIsPrime37printIsPrime60printIsPrime1135.3 编写函数,接收一个字符串,分别统计大写字母、小写字母、数字、其他字符的个数,并以元组的形式返回结果。答这里给出Python 3.4.2代码,如果使用Python 2.7.8的话只需要修改其中的print函数为print语句即可。def demov capital little digit other 0 for i in v if AiZ capital1 elif aiz little1 elif 0i9 digit1 else other1 return capital,little,digit,otherx capital little digit other 0printdemox5.4 在函数内部可以通过关键字 global 来定义全局变量。5.5 如果函数中没有return语句或者return语句不带任何返回值,那么该函数的返回值为 None 。5.6 调用带有默认值参数的函数时,不能为默认值参数传递任何值,必须使用函数定义时设置的默认值。(对、错)5.7 在Python程序中,局部变量会隐藏同名的全局变量吗请编写代码进行验证。答案会。 def demoa3print a a5 demo3 a55.8 lambda表达式只能用来创建匿名函数,不能为这样的函数起名字。(对、错)5.9 编写函数,可以接收任意多个整数并输出其中的最大值和所有整数之和。答这里给出Python 3.4.2代码,如果使用Python 2.7.8的话只需要修改其中的print函数为print语句即可。def demo*v printv printmaxv printsumvdemo1,2,3demo1,2,3,4demo1,2,3,4,55.10 编写函数,模拟内置函数sum。答这里给出Python 3.4.2代码,如果使用Python 2.7.8的话只需要修改其中的print函数为print语句即可。def Sumv s 0 for i in v s i return sx 1,2,3,4,5printSumxx 1,2,3,4,5printSumx5.11 包含 yield 语句的函数可以用来创建生成器。5.12 编写函数,模拟内置函数sorted。答这里给出Python 3.4.2代码,如果使用Python 2.7.8的话只需要修改其中的print函数为print语句即可。def Sortedv t v r while t tt mint r.appendtt t.removett return rx 1,3,5,2,1,0,9,7printxprintSortedx第6章 面向对象程序设计6.1 继承6.5节例2中的Person类生成Student类,填写新的函数用来设置学生专业,然后生成该类对象并显示信息。答Python 3.4.2代码为import typesclass Personobject 基类必须继承于object,否则在派生类中将无法使用super函数 def initself, name , age 20, sex man self.setNamename self.setAgeage self.setSexsex def setNameself, name if not isinstancename,str printname must be string. return self.name name def setAgeself, age if not isinstanceage,int printage must be integer. return self.age age def setSexself, sex if sex man and sex woman printsex must be man or woman return self.sex sex def showself printself.name printself.age printself.sexclass StudentPerson def initself, name, age 30, sex man, major Computer 调用基类构造方法初始化基类的私有数据成员 superStudent, self.initname, age, sex self.setMajormajor 初始化派生类的数据成员 def setMajorself, major if not isinstancemajor, str printmajor must be a string. return self.major major def showself superStudent, self.show printself.majorif name main zhangsan PersonZhang San, 19, man zhangsan.show lisi StudentLi Si,32, man, Math lisi.show6.2 设计一个三维向量类,并实现向量的加法、减法以及向量与标量的乘法和除法运算。答Python 3.4.2代码如下class Vecter3 def initself, x0, y0, z0 self.X x self.Y y self.Z z def addself, n r Vecter3 r.X self.X n.X r.Y self.Y n.Y r.Z self.Z n.Z return r def subself, n r Vecter3 r.X self.X - n.X r.Y self.Y - n.Y r.Z self.Z - n.Z return r def mulself, n r Vecter3 r.X self.X * n r.Y self.Y * n r.Z self.Z * n return r def truedivself, n r Vecter3 r.X self.X / n r.Y self.Y / n r.Z self.Z / n return r def floordivself, n r Vecter3 r.X self.X n r.Y self.Y n r.Z self.Z n return r def showself printself.X,self.Y,self.Zv1 Vecter31,2,3v2 Vecter34,5,6v3 v1v2v3.showv4 v1-v2v4.showv5 v1*3v5.showv6 v1/2v6.show6.3 面向对象程序设计的三要素分别为 封装 、 继承 和 多态 。6.4 简单解释Python中以下划线开头的变量名特点。答在Python中,以下划线开头的变量名有特殊的含义,尤其是在类的定义中。用下划线作为变量前缀和后缀来表示类的特殊成员l _xxx这样的对象叫做保护变量,不能用from module import *导入,只有类对象和子类对象能访问这些变量;l xxx系统定义的特殊成员名字;l xxx类中的私有成员,只有类对象自己能访问,子类对象也不能访问到这个成员,但在对象外部可以通过“对象名._类名xxx”这样的特殊方式来访问。Python中没有纯粹的C意义上的私有成员。6.5 与运算符“”对应的特殊方法名为 pow ,与运算符“”对应的特殊方法名为 floordiv 。6.6 假设a为类A的对象且包含一个私有数据成员“value”,那么在类的外部通过对象a直接将其私有数据成员“value”的值设置为3的语句可以写作 a._Avalue 。第7章 文件操作7.1 假设有一个英文文本文件,编写程序读取其内容,并将其中的大写字母变为小写字母,小写字母变为大写字母。答f openrd1.txt,rs f.readlinesf.closer i.swapcase for i in sf openrd2.txt,wf.writelinesrf.close7.2 编写程序,将包含学生成绩的字典保存为二