Python核心编程(第二版) 第五章习题答案
w5-1.整型。讲讲Python普通整型和长整型的区别。
答:Python 的标准整数类型是最通用的数字类型。在大多数 32 位机器上,标准整数类型的取值范围是-2**31到 2**31-1,也就是-2,147,483,648 到 2,147,483,647。如果在 64 位机器上使用 64 位编译器编译 Python,那么在这个系统上的整数将是 64 位。
Python 的长整数类型能表达的数值仅仅与你的机器支持的(虚拟)内存大小有关。
5-2.操作符。
(a)写一个函数,计算并返回两个数的乘积。
(b)写一段代码调用这个函数,并显示它的结果。
1 #!/usr/bin/python 2 3 def p(a,b): 4 c=a*b 5 print c 6 7 8 p(2,3) 9 p(2,3.) 10 p(2,2.0+1J)
5-3.标准类型操作符。写一段脚本,输入一个测验成绩,根据下面的标准,输出他的评分成绩(A-F)。
A:90~100
B:80~89
C:70~79
D:60~69
F:<60
1 #!/usr/bin/python 2 3 def value(num): 4 if 90<=num<=100: 5 print 'A' 6 elif 80<=num<=89: 7 print 'B' 8 elif 70<=num<=79: 9 print 'C' 10 elif 60<=num<=69: 11 print 'D' 12 elif num>=0 and num<60: 13 print 'F' 14 else: 15 print "The num is invalid." 16 17 try: 18 num=int(raw_input("Enter a num:")) 19 value(num) 20 except ValueError,v: 21 print 'You must input digits.'
5-4.取余。判断给定年份是否是闰年。使用下面的公式。
一个闰年就是指它可以被4整除,但不能被100整除,或者它既可以被4又可以被100整除。比如1992年、1996年和2000年是闰年,但1967年和1900年则不是闰年。下一个是闰年的整世纪是2400年。
1 #!/usr/bin/python 2 3 try: 4 year=int(raw_input("Enter a year:")) 5 if year%4==0 and year%100<>0: 6 print "%d is a leap year."%year 7 elif year%400==0: 8 print "%d is a leap year."%year 9 else: 10 print "%d is not a leap year."%year 11 except ValueError,v: 12 print "You must Enter a integre digits."
5-5.取余。取一个任意小于1美元的金额,然后计算可以换成最少多少枚硬币。硬币有1美分、5美分、10美分、25美分4种。1美元等于100美分。举例来说,0.76美元计算结果应该是3枚25美分,1枚1美分。类似于76枚1美分,2枚25美分+2枚10美分+1枚5美分+1枚1美分这样的结果都是不符合要求的。
1 #!/usr/bin/python 2 try: 3 dollar=float(raw_input("Enter a money that is liter than 1 dollars:")) 4 if dollar>=1: 5 print "You input is too large." 6 elif dollar>0 and dollar<1: 7 dollarTocents=int(dollar*100) 8 (numTo25,dollarTocents)=divmod(dollarTocents,25) 9 print "%d 25 coins."%numTo25 10 (numTo10,dollarTocents)=divmod(dollarTocents,10) 11 print "%d 10 coins."%numTo10 12 (numTo5,dollarTocents)=divmod(dollarTocents,5) 13 print "%d 5 coins."%numTo5 14 numTo1=dollarTocents/1 15 print "%d 1 coins."%numTo1 16 else: 17 print "You input must large than 0." 18 except ValueError,v: 19 print "You must enter a digits."
5-6 算术。写一个计算器程序。你的代码可以接受这样的表达式,两个操作数加一个操作符:N1操作符N2。其中N1和N2为整型或浮点型,操作符可以是+、-、*、/、%、**,分别表示加法、减法、乘法、整型除、取余和幂运算。计算这个表达式的结果,然后显示出来。提示:可以使用字符串方法split(),但不可以使用内建函数eval()。
1 #!/usr/bin/python) 2 3 print "Enter a expression and I will tell you the answer." 4 exp=raw_input('>') 5 if len(exp.split('-'))==2 and len(exp.split('+'))==2: 6 try: 7 elist=exp.split('-') 8 a=float(elist[0]) 9 b=float(elist[1]) 10 print a-b 11 except ValueError,v: 12 try: 13 elist=exp.split('+') 14 a=float(elist[0]) 15 b=float(elist[1]) 16 print a+b 17 except ValueError,v: 18 print "Input invalid 1" 19 elif len(exp.split('-'))==2 and len(exp.split('+'))<>2: 20 elist=exp.split('-') 21 try: 22 a=float(elist[0]) 23 b=float(elist[1]) 24 print a-b 25 except ValueError,v: 26 print "Input invalid 2" 27 elif len(exp.split('-'))==3: 28 elist=exp.split('-') 29 try: 30 a=float(elist[1]) 31 b=float(elist[2]) 32 print -a-b 33 except ValueError,v: 34 print "Input invalid 3" 35 elif len(exp.split('+'))==2 and len(exp.split('-'))<>2: 36 elist=exp.split('+') 37 try: 38 a=float(elist[0]) 39 b=float(elist[1]) 40 print a+b 41 except ValueError,v: 42 print "Input invalid 4" 43 44 elif len(exp.split('+'))==3: 45 elist=exp.split('+') 46 try: 47 a=float(elist[1]) 48 b=float(elist[2]) 49 print a+b 50 except ValueError,v: 51 print "Input invalid 5" 52 elif len(exp.split('*'))==2: 53 elist=exp.split('*') 54 try: 55 a=float(elist[0]) 56 b=float(elist[1]) 57 print a*b 58 except ValueError,v: 59 print "Input invalid 6" 60 elif len(exp.split('/'))==2: 61 elist=exp.split('/') 62 try: 63 a=float(elist[0]) 64 b=float(elist[1]) 65 print a/b 66 except ValueError,v: 67 print "Input invalid 7" 68 elif len(exp.split('%'))==2: 69 elist=exp.split('%') 70 try: 71 a=float(elist[0]) 72 b=float(elist[1]) 73 print a%b 74 except ValueError,v: 75 print "Input invalid 8" 76 elif len(exp.split('**'))==2: 77 elist=exp.split('**') 78 try: 79 a=float(elist[0]) 80 b=float(elist[1]) 81 print a**b 82 except ValueError,v: 83 print "Input invalid 9" 84 else: 85 print "Input error"
5-7.营业税。随意取一个商品金额,然后根据当地营业税额度计算应该交纳的营业税。
1 #!/usr/bin/python 2 #encoding=utf8 3 4 """ 计算营业税 """ 5 6 index=0.05 7 print "Enter a price." 8 try: 9 p=float(raw_input('>')) 10 tax=p*index 11 print ">tax=%.2f"%tax 12 except ValueError,v: 13 print "Input Error."
5-8.几何。计算面积和体积。
(a)正方形和立方体
(b)圆和球
1 #!/usr/bin/python 2 3 4 def squre_area(length): 5 area=length**2 6 print "Area of squre is %0.2f" %area 7 8 def cube_volume(length): 9 volume=length**3 10 print "Volume of cube is %0.2f" %volume 11 12 def circle_area(radius): 13 area=3.14*radius**2 14 print "Area of circle is %0.2f" %area 15 16 def sphere_volume(radius): 17 volume=(4*3.14*radius**3)/3 18 print "Volume of sphere is %0.2f" %volume 19 20 if __name__=="__main__": 21 try: 22 d=float(raw_input("Enter a num:")) 23 squre_area(d) 24 cube_volume(d) 25 circle_area(d) 26 sphere_volume(d) 27 except ValueError,v: 28 print "Input a invalid value."
5-9.
数值形式回答下面关于数值格式的问题
答:略。
5-10.转换。写一对函数来进行华氏度到摄氏度的转换。转换公式为C = (F - 32) * (5 / 9)应该在这个练习中使用真正的除法,否者你会得到不正确的结果。
1 #!/usr/bin/python 2 3 def convert(f): 4 c=(f-32)*5/9 5 print "The Temperature of C is:%.2f"%c 6 7 if __name__=="__main__": 8 #Enter f temperature 9 try: 10 ft=float(raw_input("Enter a f temperature:")) 11 convert(ft) 12 except ValueError: 13 print "Input error."
5-11.取余。
(a)使用循环和算术运算,求出0~20之间的所有偶数。
(b)同上,不过这次输出所有的奇数。
(c)综合(a)和(b),请问辨别奇数和偶数的最简单的办法是什么?
(d)使用(c)的成果,写一个函数,检测一个整型能否被另一个整型整除。现要求用户输入两个数,然后你的函数判断两者是否有整除关系,根据判断结果分别返回True和False。
1 #!/usr/bin/python 2 3 even=[i for i in range(0,21) if i%2==0] 4 print even 5 odd=[j for j in range(0,21) if j%2<>0] 6 print odd 7 8 def div(a,b): 9 if a%b==0: 10 print "TRUE" 11 else: 12 print "FALSE" 13 14 num1=float(raw_input("Enter a num:")) 15 num2=float(raw_input("Enter an another num:")) 16 div(num1,num2)
5-12.系统限制。写一段脚本确认一下你的Python所能处理的整型、长整型、浮点型和复数的范围。
答:
>>> import sys
>>> sys.maxint
9223372036854775807
>>> sys.float_info.max
1.7976931348623157e+308
>>> sys.float_info.min
2.2250738585072014e-308
5-13 转换。写一个函数把由小时和分钟表示的时间转换为只用分钟表示的时间。
1 #!/usr/bin/python 2 3 def Convert(a,b): 4 min=60*a+b 5 print "min=%d"%min 6 7 if __name__=="__main__": 8 hour=raw_input("Enter a time:") 9 try: 10 (h,m)=hour.split(":") 11 Convert(int(h),int(m)) 12 except ValueError,v: 13 print "Input error."
5-14 银行利息。写一个函数,以定期存款利率为参数, 假定该账户每日计算复利,请计
算并返回年回报率。
答:略
5–15.
最大公约数和最小公倍数。请计算两个整数的最大公约数和最小公倍数。
1 def common_divisor(a,b): 2 3 for i in range(1,min(a,b)+1): 4 if a%i==0 and b%i==0: 5 m=i 6 print "The common divisor is %d"%m 7 8 def common_mutiple(i,j): 9 #method 1 10 maxnum=max(i,j) 11 while True: 12 if maxnum%i==0 and maxnum%j==0: 13 print "The common multiple is %d"%maxnum 14 break 15 else: 16 maxnum=maxnum+1 17 #method 2 18 for k in range(1,min(i,j)+1): 19 if i%k==0 and j%k==0: 20 n=k 21 print n 22 print i*j/n 23 if __name__=="__main__": 24 try: 25 num1=int(raw_input("Enter a num:")) 26 num2=int(raw_input("Enter a num again:")) 27 common_divisor(num1,num2) 28 common_mutiple(num1,num2) 29 except ValueError,v: 30 print "Value Invalid."
5-16 家庭财务。给定一个初始金额和月开销数, 使用循环,确定剩下的金额和当月的支
出数, 包括最后的支出数。
1 #!/usr/bin/python 2 3 def payment(balance=100,monthpayment=16.13): 4 print "Amount Remainint" 5 print "Pymt# Paid Balance" 6 print "_____ _______ _________" 7 print "0 $0.00 $%.2f"%balance 8 month=0 9 remain=balance 10 while remain>=monthpayment: 11 month=month+1 12 remain=remain-monthpayment 13 print "%d $%.2f $%.2f"%(month,monthpayment,remain) 14 else: 15 print "%d $%.2f $0.00"%(month,remain) 16 if __name__=="__main__": 17 try: 18 balance=float(raw_input("Enter opening balance:")) 19 monthpayment=float(raw_input("Enter monthly payment:")) 20 payment(balance,monthpayment) 21 except ValueError,v: 22 print "Input Error." 23 payment()
5-17 随机数。熟读随机数模块然后解下面的题:
生成一个有 N 个元素的由随机数 n 组成的列表, 其中 N 和 n 的取值范围分别为: (1 <
N <= 100), (0 <= n <= 231 -1)。然后再随机从这个列表中取 N (1 <= N <= 100)个随机数
出来, 对它们排序,然后显示这个子集。
1 #!/usr/bin/python 2 3 import random 4 5 #the len of list 6 N=random.randint(2,100) 7 randlist=random.sample(xrange(0,2**31-1),N) 8 print randlist 9 randlist.sort() 10 print randlist