python核心编程课后题第二版97页第五章
5-2 操作符。(a)写一个函数,计算并返回两个数的乘机。(b)写一段代码调用这个函数,并显示它的结果。
def multi(a, b): c = a * b return c num1 = 12 num2 = 9 print '%d chengyi %d = %d' % (num1, num2, multi(num1, num2))
5-3 标准类型操作符。写一段脚本,输入一个测试成绩,根据下面的标准,输出他的评分成绩(A-F):
A: 90~100
B: 80~89
C: 70~79
D: 60~69
F: <60
def judge_level(n): n = int(n) if 90 <= n <= 100: return 'A' elif 80 <= n < 90: return 'B' elif 70 <= n < 80: return 'C' elif 60 <= n < 70: return 'D' elif 0 <= n < 60: return 'F' else: return 'Please check your score again.' while 1: score = raw_input('Please enter your score>>') try: int(score) except: print 'Enter error.' else: break print judge_level(score)
注:加入2个判断,一个是输入时判断是否数字,二是判断输入数据是否在0~100之内。
5-4 取余。 判断给定年份是否是闰年。使用下面的公式:
一个闰年就是指它可以被4整除,但不能被100整除,或者它既可以被4整除又可以被100整除。比如1992,19996和2000是闰年,但1967,1900不是闰年,下一个是闰年的整世纪是2400.
注:书上这样表述明显是矛盾的,我也看了半天生出了类似“是打他还是打他妈”(详见周星驰《功夫》)的苦恼,最后求证下应该是这样的:
闰年是可以被4整除但不能被100整除,或者它可以被400整除。
y = raw_input('Enter the year>>') y = int(y) y4 = y % 4 y100 = y % 100 y400 = y % 400 if (y4 == 0 and y100 != 0) or (y400 == 0): print '%d is runnian.' % y else: print '%d is not runnian.' % y
5-5 取余。取一个任意小于1美元的金额。然后计算可以换成多少枚硬币。硬币有1美分,5美分,10美分和25美分四种。1美元等于100美分。举例来说,0.76美元换算结果应该是3枚25美分,1枚1美分。类似76个1美分,2枚25美分+2枚10美分+1枚5美分+1枚1美分这样的结果都是不符合要求的。
money = raw_input('Enter the money>>') money = int(money) a1, a2 = divmod(money, 25) if a2 != 0: b1, b2 = divmod(a2, 10) if b2 != 0: c1, c2 = divmod(b2, 5) print '%d = %d * 25 + %d * 10 + %d * 5 + %d * 1' % (money, a1, b1, c1, c2)
另外一种方法:
def verify(a): b = '1234567890' if len(a) == 2 and a[0] in b and a[1] in b: return True else: return False def change(a): n25 = int(a) / 25 n10 = (int(a) - n25 * 25) / 10 n5 = (int(a) - n25 * 25 - n10 * 10) / 5 n1 = int(a) - n25 * 25 - n10 * 10 - n5 * 5 return n25, n10, n5, n1 money = raw_input('Enter the money>>') if verify(money): r = change(money) print '%r can change to %r 25Cents, %r 10Cents, %r 5Cents and %r 1Cents.' % (money, r[0], r[1], r[2], r[3]) else: print 'Enter errors.'
5-6 算术。写一个计算机程式。你的代码可以接受这样的表达式,两个操作数加一个操作符:N1操作符N2,其中N1和N2为整型或浮点型,操作符可以是+ - * / % **,分别为加法,减法,乘法,除法,取余和求幂。计算这个表达式的结果,然后显示出来。提示:使用字符串方法split(),但不可以使用内建函数eval()。
def jisuanqi(n): if len(n.split('+')) == 2: return int(n.split('+')[0]) + int(n.split('+')[1]) elif len(n.split('-')) == 2: return int(n.split('-')[0]) - int(n.split('-')[1]) elif len(n.split('*')) == 2: return int(n.split('*')[0]) * int(n.split('*')[1]) elif len(n.split('/')) == 2: return int(n.split('/')[0]) / int(n.split('/')[1]) elif len(n.split('%')) == 2: return int(n.split('%')[0]) % int(n.split('%')[1]) elif len(n.split('**')) == 2: return int(n.split('**')[0]) ** int(n.split('**')[1]) else: return 'Enter errors.' exp = raw_input('Please enter the expression, such as 2-1.\n>>') print jisuanqi(exp)
注:并未完成,诸如“1- -4”这样的算式还不能计算。而且计算结果只考虑了整形,浮点型都过滤掉了。
最后推荐下vim编辑器,用好了很方便的。另外本文参考了Balian同学的笔记http://www.cnblogs.com/balian/archive/2011/01/27/1946088.html。
另外,答案是自己搞的,难免有错误,请注意。
5-8 几何。计算面积和体积。
(a)正方形和立方体
(b)圆和球
#coding=utf-8 import math def area(leng): leng = int(leng) return leng ** 2 def vol(leng): leng = int(leng) return leng ** 3 def round_area(r): r = float(r) return r ** 2 * math.pi def ball_vol(r): r = float(r) return r ** 3 * math.pi * 4 / 3 leng = raw_input('Enter the length.\n>>') print 'The area of the square is %r.' % area(leng) print 'The volume of the cube is %r.' % vol(leng) r = raw_input('Enter the radius.\n>>') print 'The area of the round is %r.' % round_area(r) print 'The volume of the ball is %r.' % ball_vol(r)
5-9.
数值形式回答下面关于数值格式的问题:
(a)为什么下面的例子里17+32等于49,而017+32等于47,017+032等于41?
>>> 17 + 32
49
>>> 017 + 32
47
>>> 017 + 032
41
(b)为什么下面这个表达式我们得到的结果是134L而不是1342?
>>> 56l + 78l
(a)因为Python中0开头的数字表示八进制数。八进制数017表示15,而八进制数032表示26,所以得到如题所示答案。
(b)561加上781才是1342,而56l加上78l是134L。(这个题不是扯淡吗?!)
5-10 转换。写一对函数来进行华氏度到摄氏度的转换。转换公式为C=(F-32)*(5/9)应该在这个练习中使用真正的除法,否则你会得不到正确的结果。
from __future__ import division def ftoc(f): c = (f - 32) * (5 / 9) return c def ctof(c): f = 9 / 5 * c + 32 return f c = 25 print ctof(c) f = 89 print ftoc(f)
注:这个懒了点,没有设置输入。
5-11 取余。
(a)使用循环和算术运算,求出0-20之间的所有偶数
(b)同上,不过这次输出所有奇数
(c)综合(a)和(b),请问辨别奇数和偶数的最简单方法是什么?
(d)使用(c)的成果,写一个函数,检测一个整型能否被另一个整型整除。先要求用户输入两个数,然后你的函数判断两者是否有整除关系,根据判断结果分别返回True和False。
(a)
for n in range(1, 21): if n % 2 == 0: print n
(b)
for n in range(1, 21): if n % 2 != 0: print n
(c)判断奇数和偶数最简单的方法就是求余,判断余数是否为0.
(d)
#coding=utf-8 chushu = input('输入除数:') beichushu = input('输入被除数:') if beichushu % chushu == 0: print True else: print False
注:除数和被除数不知道有没有搞混。
5-12 系统限制。写一段脚本确认一下你的Python所能处理的整型,长整型,浮点型和复数的范围。
注:这个暂时没做。
5-13 转换。写一个函数把由小时和分钟表示的时间转换为只用分钟表示的时间。
#coding=utf-8 def h_m(h, m): return int(h) * 60 + int(m) tm = raw_input('Please enter time: HH:MM, such as "5:21"\n>>') t = tm.split(':') print h_m(t[0], t[1])
5-14 银行利息。写一个函数,以定期存款利息为参数,假定该账户每日计算复利,请计算并返回年回报率。
#coding=utf-8 def fuli(m, d): return int(m) * 1.0015 ** int(d) print '日利率为0.15%' m = raw_input('Enter your money. >>') d = raw_input('Enter days. >>') print fuli(m, d) print (fuli(m, 365) - int(m)) / int(m)
注:最后一行计算年回报率时有点麻烦了。
5-15 最大公约数和最小公倍数。请计算两个整型的最大公约数和最小公倍数。
注:这个题还不知道怎么解,容我思考两天。
5-16.
家庭财务。给定一个初始金额和月开销数,使用循环,确定剩下的金额和当月的支出数,包括最后的支出数。Payment()函数会用到初始金额和月额度,输出结果应该类似下面的格式(例子中的数字仅用于演示)。
Enter opening balance: 100.00
Enter monthly payment: 16.13
Amount Remaining
Pymt# Paid Balance
----- ---- -------
0 $ 0.00 $100.00
1 $16.13 $ 83.87
2 $16.13 $ 67.74
3 $16.13 $ 51.61
4 $16.13 $ 35.48
5 $16.13 $ 19.35
6 $16.13 $ 3.22
7 $ 3.22 $ 0.00
#coding=utf-8 balance = raw_input('Enter opening balance: ') payment = raw_input('Enter monthly payment: ') balance = float(balance) payment = float(payment) print ' Amount Remaining' print 'Pymt# Paid Balance' print '----- ------ ---------' print '0 $ 0.00 $100.00' n = 1 while (balance - n * payment) > payment: print '%d $%.2f $ %.2f' % (n, payment, (balance - n * payment)) n += 1 print '%d $%.2f $ 0.00' % (n, (balance - n * payment))
注:唉,我承认写到最后有点沉不住气了,想早点搞定看下一章。
5-17 随机数。熟读随机数模块然后解下面的题。
生成一个有N个元素的由随机数n组成的列表,其中N和n的取值范围分别为(1<N<=100)和(0<=n<=2**31-1)。然后再随机从这个列表中取x(1<=x<=100)个随机数出来,对他们排序,然后显示这个子集。
import random N = random.randint(2, 100) num = 1 n = [] while num <= N: n.append(random.randint(0, 2 ** 31 - 1)) num += 1 print sorted(n)