《Python程序设计案例教程》-单元习题答案张瑞玲.docx
Python程序设计案例教程单元习题参考答案单元11.Printe这是我的第一个PythOn程序!,)2.略单元21 .参考代码如下:a=10b=20temp=aa=bb=tempprint(a,b)2 .参考代码如下:r=float(inp11C请输入圆的半径:,)PI=3.1415926perimeter=2*PI*rarea=PI*r*2Print(,圆的周长:",perimeter)Printc圆的面积'area)3 .参考代码如下:namel=input(”请输入学生姓名:")sexi=input(”请输入学生性别:”)agel=input(”请输入学生年龄:”)numl=input("请输入学生学号:")print(,n,)name2=input(”请输入学生姓名:")sex2=input(”请输入学生性别:”)age2=input(”请输入学生年龄:”)num2=input("请输入学生学号:")print("学生基本信息:姓名:%s,性别:%s,年龄:s,学号:%s"%(name1,sex1,age1,num1)Print(“学生基本信息:姓名:s,性别:s,年龄:S浮号:%s"%(name2,sex2,age2,num2)4.参考代码如下:a=25.6b=3e=28c=8d=13.4f=65x=(e*d-b*f)(a*d-b*c)#+算Xy=(a*f-e*c)(a*d-b*c)卷t算yPrintC该二元一次方程组中的X=',x)print,该二元一次方程组中的y=y)单元31 .参考代码如下:odd_sum=On=99print('循环开始')whilen>0:odd_sum=odd_sum+nn=n-2print('循环结束,)print('l-100之间所有奇数的和为:odd_sum)2 .参考代码如下:foriinrange(l,10):fbrjinrange(h10):ifj<=i:print(,%d*%d=%-2d'%(j,i,i*j),end='')print()3 .参考代码如下:#year表示输入的年份#flag=O,不是闰年;flag=1,是闰年year=int(input(,请输入年份:,)ifyear%4=0:ifyear%100=O:ifyear%400=0:flag=1else:flag=Oelse:flag=Ielse:flag=Oifflag=1:print(year,'isleapyear')else:Print(year,'isnotleapyear')4 .参考代码如下:#count表示水仙花数的个数count=0fornuminrange(100,1000):a=num%10b=num/10%IOc=num/100ifa*3+b*3+c*3=num:count+=1print(num,end='')P11nt()print('水仙花数的个数为:',count)单元41 .参考代码如下:#商品字典dict_commodityJnfos=101: "name":”香蕉","price":20),102: "name1':"苹果","price":25),103: "name":“牛奶","price”:60),104: "name":”面包","price":15,105: "name":“薯片","price":5,)# 订单列表list_orders=,cid,':102,"count":3),cid":103,"count'1:2),(,'cid":105,"count*:1),# (1)forcid,infbindict_commodity_infos.items():Print("商品单号d,商品名称s,商品价格d"%(cid,info'name',info'price,)P11nt("")# (2)fororderinlist_orders:Print("商品单号d,购买数量d"%(order,cid',order'count,)PrintC")# (3)fororderinlist_orders:cid=order'cid,commodity=dict_commodity_infoscidprint("商品名称s,商品价格d,购买数量%d"(commodity,name,J,commodity,price,J,order,count,)PrintC")# (4)max_value=IiSLOrderSforiinrange(l,len(list_orders):ifmax-value',count"J<list_ordersi"count":max_value=list_ordersiprint(max_value)P11nt(,")# (5)forrinrange(len(list-orders)-I):foreinrange(r+1,Ien(IiSLOrderS):iflist-ordersr',count,l<list_ordersc"count":list_ordersr,list_ordersc=list_orderslc,list_ordersrprint(list_orders)2.参考代码如下:Primeo到100以内的挛生数对有:)m=2fornuminrange(3,100,2):foriinrange(2,num2÷1):ifnum%i=0:breakelse:ifnum-m=2:print(f(m),(num)')m=num单元51 .参考代码如下:defevent_num_sum():result=Ocounter=1whilecounter<=100:counter+=1ifcounter%2=1:continueresult+=counterreturnresultprint(event_num_sum()2 .参考代码如下:deffunc(num):ifnum=2:return1else:returnnum*func(num-1)result=func(20)print(result)3 .参考代码如下:deftriangle():side_length_one=int(input("请输入第一个边长:n")side_length_two=int(input("请输入第二个边长:n")side_length_three=int(input("请输入第三个边长:n")if(side_length_one+side_length_two>side_length_threeandside_length_one+side_length_three>side_length_twoandside_length_two+side_length_three>side_length_one):return”能构成三角形”else:return”不能构成三角形”print(triangle()4 .参考代码如下:deflcm(x,y):#获取最大的数ifX>y:greater=Xelse:greater=ywhileTrue:ifgreater%x=0andgreater%y=0:Icm=greaterbreakgreater+=1returnIcm#获取用户输入numl=int(input("输入第一个数字:")num2=int(input("输入第二个数字:")print(numl,"",num2,"的最小公倍数为”,1Cm(numl,num2)5.参考代码如下:deffac(k):#定义fac函数,计算阶乘i=2t=Iwhilei<=k:t*=ii=i+1returnt#返回阶乘结果defsum(n):#定义sum函数,求累加S=Oi=1whilei<=n:s=s+fac(i)#调用fac函数i+=1returns#返回累加结果print('1!+2!+3!-10!-,sum(10)#调用sum函数6 .参考代码如下:",Python的String的方法有isalpha()sisalnum()xisdigit()sisspace()sislower()isupper()等,可以用来方便地判断字符串里面的所有字符是否符合某个规则,可以通过对字符串进行判断并对符合规则的结果进行计数,达到统计的目的,最终输出元组。I,defget_strong_password_state(pwd):count_all=len(pwd)count_upper=0CountJower=0count_digit=0forcharinpwd:ifchar.isupper():count_upper+=1elifchar.islower():count_lower+=1elifchar.isdigit():count_digit+=1return(CoUnLa11,count_upper,countjower,count_digit)(count_all,count_upper,countjower,count_digit)=get-strong-password-state(,ABCabcd12345,)PrintC密码长度为'.format(counJaH)Print(,密码内大写字母有个.fbrmat(coImjUPPer)print('密码内小写字母有)个.format(counUOWer)Print('密码内数字有个IfOrmat(COUnJdigit)7 .参考代码如下:”'可以使用for循环,对字符串进行比较,将第一个字符与最后一个字符比较,第二个字符与最后第二个字符比较,如果有任何一次比较的结果为不同,就直接返回为非回文串。比较次数只要为字符串长度的一半即可,如果全部比较都没出现不一致,则返回为回文串1,defis_palindromic_simple(s):returnS=defis_palindromic(s):length=len(s)foriinrange(O,length/2):ifsi!=slength-I-i:returnFalsereturnTrueprint(is_palindromic('abc')print(is_palindromic('abccba')print(is_palindromic('abcba')8参考代码如下:”'质数只能被1和它本身整除,所以我们可以从到n全部遍历一遍。对于每个数k,从1到k遍历一遍,如果所有比k小的数都无法整除k,那k就是质数。为了使程序更加易读,写2个函数,一个函数判断是否为质数,另一个函数通过调用该函数输出所有质数。I,importmathdefis_prime(k):foriinrange(2,math.ceil(math.sqrt(k)+1):ifk%i=0:returnFalsereturnTruedefget_primes_within_n(n):result=foriinrange(I,n):ifis_prime(i):result.append(i)returnresultprint(is-prime(l)print(get_primes_within_n(100)9参考代码如下:”'数组的最大值和最小值可以通过数组遍历获得,题目则转换为找到2个数字的最大公约数。根据最大公约数的定义,最大公约数一定不大于最小的那个数字,所以从最小的那个数字开始从大到小进行枚举,找到能被2个数整除的数字后将其返回即可tildeflist_gcd(a):max_val=a0min_val=a0foriinrange(len(a):ifai>max_val:max_val=aiifai<min_val:min_val=aival=min_valwhileval>0:ifmax_val%val=0andmin_val%val=0:returnvalval-=1returnvalPrint(HSegCd(2,4,6,9)10参考代码如下:importrandomprint("让我们来猜数吧,范围是零到一百的整数。")Print("请输入您猜的数字:”)Iisusmall=”再努力一下,你猜的数有点小”,”好像不对,再猜的大一点”,”啊哦,你的数有点小了”,”就快猜出来了,数再大点”IisUbig=再努力一下,你猜的数有点大”,”好像不对,再猜的小一点”,“啊哦,你的数有点大了”,”就快猜出来了.数再小点”x=3while(x>0):a=random.randint(0,100)while(True):enter1=input("u)if(int(enterl)<a):rint(random.choice(list-small)elif(int(enterl)>a):print(random.choice(list-big)else:Print("您猜对了!")单元61 .参考代码如下:classCircle:def_init_(self,tup,radius,color):self.center=tupself.radius=radiusself.color=colordefperimeter(self):return3.14*2*self.radiusdefarea(self):return3.14self.radius*self.radiusCirde=Cirde(0,0),5,“蓝色”)print(circle.perimeter()print(circle.area()2 .参考代码如下:classCourse:def_init_(self):self.number=1001self.name="语文"self.teacher="张老师”self._location="2号教学楼3层305室”defshow_info(self):return(""课程编号:%d课程名称:%s任课教师:%S上课地点:%S%(self.number,self.natne,self.teacher,self._location)course=Course()print(course.showjnfo()3 .参考代码如下:classPerson:def_init_(self,name,age,bld-type):self.name-nameself.age=ageself.bld.type=blood_typedefdetail(self):temp=',iam%s,age%s,bloodtype%s,'%(self.name,self.age,self.blood_type)print(temp)zhangsan=PerSOne张三',18,A,)Iisi=PerSOnc李四:73JAB)yangwu=PerSOne杨五84,'A')zhangsan.detail()lisi.detail()yangwu.detail()4 .参考代码如下:classFoo:def_init_(self,name,age,gender):self,name=nameself.age=ageself.gender=genderdefyuwen(self):print("%s,%s岁,s,喜欢上语文课"%(self.namc,self.age,self.gender)defdianying(self):print("%s,%s岁,s,喜欢看电影“%(self.name,self.age,self.gender)deflanqiu(self):print("%s,%s岁,s,喜欢打篮球"%(self.name,self.age,self.gender)xiaoming=Foo('丽丽',10,'女')xiaoming.yuwen()xiaoming.dianying()xiaoming.lanqiu()Iaoli=FOoC强强,12,男)laoli.yuwen()laoli.dianying()5 .参考代码如下:classHouseitem:def_init_(self,name,area):self,name=nameself.area=areadef_str_(self):return,%s占地%.2f%(self.name,self.area)classHouse:def_init_(self,house_type,area):self.house_type=house_type#房子类型self.area=area#房子面积self.free_area=area#房子剩余面积self.itemjist=#家具名称列表def_str_(self):return'户型:%sn总面积:%.2f剩余:%.2fn家具:%s'%(self.house_type,self.area,self.free_area,self.itemist)defadd_item(self,item):Print('要添加%s'%item)#判断家具的面积是否超过房子的面积,如果超了则给出提示,退出添加#否则将家具名称添加到列表中,并用房子的剩余面积-家具面积ifitem.area>self.free_area:print('%s的面积太大了,无法添力口'%item.name)returnself.itemjist.append(item.name)self.free_area-=item.area#创建家具bed=HoUSeltem('床',5)print(bed)chest=HOUSeltem('衣柜',2)print(chest)table=HOUSeItemc餐桌',1.5)print(table)chairl=HOUSeltem('椅子,0.5)print(chairl)chair2=HOUSeltemC椅子2',0.5)print(chair2)#创建房子my_home=HOUSe('两室一厅84)my_home.add_item(bed)my_home.add_item(chest)my_home.add_item(table)my_home.add_item(chairl)my_home.add_item(chair2)print(my_home)6 .参考代码如下:学生的学号是所有实例共用的属性,每个实例的学号都需要在之前实例学号的基础上增加1.所以,应该把学号设置为类属性。而姓名和年龄这两个属性,是一个实例所独有的,在不同实例之间是完全独立的,因此,需要设置为实例属性。Python提供了一个名称为_init_()的特殊方法进行对象的初始化,所以,在新生成一个学生对象时,可以在_init_0方法中设置姓名和年龄的值。classStudent:IHHlid=0#定义一个类属性,用于计数def_init_(self,name,age):self,name=nameself.age=ageStudentJd+=1#每次对类进行实例化时计数器增加1definfo(self):print("Mynameis%s,ageis%d,idis%d"%(self.name,self.age,StudentJd)stul=Student("ZhangSan",33)stul.info()stu2=Student(,LiSi',24)stu2.info()stu3=Student(',WangWIr,22)stu3.info()7 .参考代码如下:classCar:defmove(self):Print(“汽车正在行驶中”)car_BMW=Car()car_BMW.color="黑色”car_BMW.horsepower="200"car.BMW.model=',X3"car_BMW.move()print("这辆%s%s的马力是s匹”%(car_BMW.color,car_BMW.model,car_BMW.horsepower)car_BYD=Car()car_BYD.color="白色"car_BYD.horsepower=',300',car.BYD.model=,S7"car_BYD.move()print("这辆%s%s的马力是s匹”%(car_BYD.color,car_BYD.model,car_BYD.horsepower)8 .参考代码如下:"""在动物类Animal中,可以定义4个实例属性name.age.color,fd来表示名字、年龄、颜色和食物。方法的定义语法与函数的一样,也是使用def关键字,方法相当于定义在类里面的函数。但是,与类外的函数不同的是,类方法的第一个参数都是指向调用者实例的引用,在定义时一般习惯用Self作为参数名。IlVlUclassAnimal:def_init_(selfsame,age,color,food):self.name=name#定义实例属性nameself.age=age#定义实例属性ageself.color=color#定义实例属性colorself.food=fd#定义实例属性food# 定义run方法defrun(self):print("%s正在奔跑."self.name)# 定义eat方法defeat(self):print("%s正在吃s."%(self.name,self.food)# 定义get_age方法defget_age(self):print("%s今年d岁了(Self.name,self.age)panda=Anima1("盼盼,5,“黑白”,“竹子”)dog=Anima1(“旺旺”,4,“黄色”,“骨头")cat=AnimAC咪咪”,2,“白色鱼”)panda.run()panda.get_age()panda.eat()dog.run()dog.get.age()dog.eat()cat.run()cat.get_age()cat.eat()单元71、参考代码如下:deffilejread():data_li=withopen('file.txt','r',encoding='utf8')asfile:fordatainfile.readlines():ifnotdata.startswith('#'):data_li.append(data)returndata_liprint(file-read()2、参考代码如下:importjson#导入json模块#定义datadata='firstNmae,:'¾,lastNmae,:'姓','title':职位','mobilePhoneNumber':13322223333,'organization':,公司名丁WeChantNUmber':'微信号'#将data转化为JSON格式的字符串,并赋值给json_datajson_data=json.dumps(data,indent=2,ensure_ascii=False)#打开data.json文件withOpen('data.json','w',encoding='utf-8')asfile:file.write(json_data)#将json_data写入data.json文件3、参考代码如下:#创建字典的文本文件dict.txt1将现有词典内容保存在文本文件中fr=open("dict.txt",'r+")Dict=#空列表Is=Ui=0forrowinfr:#循环ls.append(row.split()#分割字符串并获取关键字i+=lwhile1:WOrd=input("请输入一个英文单词:“)flag=Oj=fbrjinrange(i):ifword=lsj0:flag=lbreakifflag:print(word,lsjl)else:Print(“没有该单词,请输入其中文:end="”)chinese=input()fr.write(word+n"+chinese+"n")Print(“该单词已添加至词典!")ch=input("继续查找(Y/N):")ifch=-Y,orch='y':continueelse:Print(“欢迎再次使用!")breakfr.close()4、参考代码如下:course_score_dict=)#创建字典num=int(inputC请输入课程数:)#设置课程数foriinrange(num):#循环data=inpu(请输入课程名称及对应的成绩(课程名称和对应成绩用空格隔开):')course,score=data.split(',)#课程名称和对应成绩用空格隔开course_score_dictcourse=eval(score)#将成绩转换成列表,并按升序排序ScoreJist=sorted(list(course_score_dict.values()#分别将最后一个成绩和第一个成绩定义为最高分和最低分max_score,min_score=scorejist-lJ,scorejist0average_score=sum(score_list)/len(score_list)#求平均成绩foriteminCOUrSe_score_dict.items():#获取最高分和最低分对应的课程ifitem1=max_score:max_course=item0ifitem1=min_score:min_course=itemOJ#输出分数最高和最低的课程名称和对应成绩,并输出平均分PrintC分数最高的课程是,分数最低的课程是,平均分是:.2f.fbrmat(max-course,max_score,min_course,min_score,average-score)#将分数最高和最低的课程名称和对应成绩及平均分写入到course文件中withopen(,course.txt','w')asfile:#以写方式打开文件f11ewrite(分数最高的课程是,分数最低的课程是,平均分是:.2f.format(max-course,max_score,min_course,min_score,average-score)5、参考代码如下:importtimedefwriteNote():#写便签方法date=time.localtime()#获取当地时间#将时间转换为指定格式字符串date=time.strftime(,%Y-%m-%d%H:%M:%S',date)word=input,请输入便签内容:,)withopen(,note.txt,a,)asfile:file.write(date+*'+word+'n')defqueryNote():#查询便签方法Str=input,请输入要查询的文字:withopen('note.txt')asfile:whileTrue::,)line=file.readline()#读取便签信息ifline=":#如果信息为空break#跳出循环ifstrinline:print(line,end=")defshowNote():withopen('note.txt')asfile:whileTrue:#如果查询问文字在便签中则输出line=file.readline()#读取便签信息ifline=":#如果信息为空break#跳出循环print(line,end=")#输出便签信息PnntC便签本whileTrue:-)choice=input(,l:写便签,2:查询便签,3:浏览全部便签,q:退出系统n)ifchoice='q':Printc退出电子便签,)breakifchoice=,:writeNote()elifchoice=,2,:queryNote()elifchoice=3:showNote()单元81、参考代码如下:#用户自定义异常classCustomError(Exception):def_init_(self,value):self.value=valueself._class_._name_="【用户自定义异常】"+self._class_._name_def_GetStr_(self):returnrepr(self)#在程序中触发用户自定义异常并处理try:raiseCustomError("hehe!")exceptCustomErrorase:print(e._class_._name_,'已触发,值为:',e.value)print(e._GetStr_()finally:Print("都要处理finally子句!")2、参考代码如下:classMessageError(Exception):def_init_(self):self.no_message='不能构成三角形'classTriangle:defcomposed_triangle(self):side_length_one=int(input("请输入第一个边长:n")side_length_two=int(input("请输入第二个边长:n")side_length_three=int(input("请输入第三个边长:n")try:ifnot(side_length_one+side_length_two>side_length_threeandside_length_one+side_length_three>side_length_twoandside_length_two+side_length_three>side_length_one):raiseMessageErrorOexceptMessageErrorase:rint(e.no-message)else:Printc可以构成)triangle=Triangle()posed_triangle()3、参考代码如下:”'分析:首先定义字典保存身份证号码前2位对应的省区编号,并输入身份证号码;然后使用if语句判断其长度是否等于18.如果是,在try子句中解析身份证号码,获取省区、生日和性别信息,并使用except子句捕获KeyError异常(身份证号码前两位有误,字典中不存在该键),否则输出长度有误提示。#定义字典,保存身份证号码前2位对应的省区编号province_dict='1:'北京市丁17:,天津市13,:,河北省','14':'山西省15':'内蒙古自治区','2:'辽宁省','22':,吉林省23,:黑龙江省'31:'上海市','32':'江苏省丁3兑'浙江省'34:安徽省;'35':福建省丁36:'江西省,山东省:,4:'河南省'47:湖北省丁4子:湖南省',144):广东省丁4*'广西壮族自治区46:海南省二'50':'重庆市'51:,四川省57:'贵州省','53':云南省丁54:'西藏自治区'6:,陕西省;'62':'甘肃省丁63,:倩海省丁64?'宁夏回族自治区','65':'新疆维吾尔自治区丁71:,台湾地区;'8:'香港特别行政区'87:'澳门特别行政区1instr=input,请输入你的身份证号:江)#输入身份证号码iflen(instr)=18:try:province=province_dictinstr0:2#获取省区编号birthday=instr6:10+'年'+instr10:12+'月'+instr12:14+'Bifint(instr16)%2=0:gender='女'#获取生日#获取性别else:gender='男'PrintC你来自province)Print(你的生日是birthday)Print(,你的性别是gender)#输出省区#输出生日#输出性别exceptKeyError:Printe你输入的身份证号码前2位有误,该省区编号不存在!')else:Printe你输入的身份证号码长度有误!')4、参考代码如下:”'分析:只要不符合题目要求,就抛出异常,所以我们可以使用assert子句对字符串进行判断。assert语句用来判断一个表达式,如果该表达式为False,触发AssertionError异常根据ISO8601,可以从以下几个方面来判断:(1)判断长度是否为19位;(2)判断-、T、:等是否在正确的位置;(3)如果(1)和(2)判断的结果均为真,则使用字符串切片获得表示年、月)日、时、分、秒等的数字,使用H)将数字转成整数,如果不是整数,会引发VahleElTOr异常;(4)对年、月、日继续做更加具体的判断,比如,年必须在1970-9999,月在112.日根据月和年判断是否正确;(5)对时、分、秒继续做判断。defcheck_dateti