Python 核心编程 课后习题 第五章
2. 操作符.
(a) 写一个函数, 计算并返回两个数的乘积.
(b) 写一段代码调用这个函数, 并显示它的结果.
def multi(a,b): return a * b result = multi(10,2) print result
3. 标注类型操作符, 写一段脚本, 输入一个测验成绩, 根据下面的标准输出他的评分成绩
A: 90~100
B: 80~80
C: 70 ~ 79
D: 60 ~69
F: < 60
def scoreCalculate(score): if score < 60: rank = 'F' elif score < 70: rank = 'D' elif score < 80: rank = 'C' elif score < 90: rank = 'B' else: rank = 'A' return rank yourScore = int(raw_input("Enter your score -->")) yourRank = scoreCalculate(yourScore) print yourRank
4. 取余. 判断给定的年份是否为闰年. 使用下面的公式.
一个闰年就是指它可以被4整除,但不能被100整除. 或者它既可以被4整除又可以被100整除.
1 def leapYear(year): 2 if (year % 4 == 0 and year % 100 != 0) or (year % 100 == 0 and year % 400 == 0): 3 return True 4 else: 5 return False 6 7 aYear = int(raw_input("Ener a year -->")) 8 isLeap = leapYear(aYear) 9 print isLeap 10 if isLeap: 11 print '%d is a leap year.' % aYear 12 else: 13 print '%d is not a leap year.' %aYear 14
5 取余, 取任意小于1美元的金额, 然后计算可以换成最少多少枚硬币. 硬币有1美分, 5美分, 10美分, 25美分四种.
1 def coinNum(totalMoney): 2 totalCoin = 0 3 denomination = [25,10,5,1] 4 for currency in denomination: 5 coin,left = divmod(totalMoney,currency) 6 totalCoin += coin 7 totalMoney = left 8 return totalCoin 9 10 yourMoney = float(raw_input('Enter your money -->')) * 100 11 coinNumbers = coinNum(yourMoney) 12 print "You got %d coins" %int(coinNumbers)
6.算术, 写一个计算起程序, 你的代码可以接受这样的表达式, 两个操作数加一个操作符: N1 操作符 N2. 其中N1 和N2为整形或浮点型, 操作符可以是+, -, *, /, %, ** 分别表示 加法, 减法, 乘法, 整除法, 取余, 和幂运算. 计算这个表达式的结果, 然后显示出来. 提示: 可以使用字符串方法split(), 单不可以使用內建函数eval()
1 def calculator(str1): 2 lt = str1.strip().split(' ') 3 if (lt[0].count('.') == 1 or lt[2].count('.')==1): 4 lt[0], lt[2] = float(lt[0]),float(lt[2]) 5 else: 6 lt[0], lt[2] = int(lt[0]),int(lt[2]) 7 if lt[1] == '+': 8 return lt[0] + lt[2] 9 elif lt[1] == '-': 10 return lt[0] - lt[2] 11 elif lt[1] == '*': 12 return lt[0] * lt[2] 13 elif lt[1] == '/': 14 if lt[2] == 0: 15 print "divide by zero error." 16 17 else: 18 return lt[0] / lt[2] 19 elif lt[1] == '%': 20 if lt[2] == 0: 21 print "Divide by zero error" 22 else: 23 return lt[0] % lt[2] 24 elif lt[1] == '**': 25 return lt[0] ** lt[2] 26 else: 27 print "not such calculation method" 28 str1 = raw_input("Enter two numbers and a operator(eg: 1.0 + 2.0 ) -->") 29 cal = calculator(str1) 30 print cal
7. 营业税, 随意取一个商品金额, 然后根据当地营业税额度计算应该交纳的营业税.
1 tax = {'trans':0.03,'assets':0.05} 2 trade_mode = raw_input("Enter your trade-mode(trans: transport, assets: real eatate) -->") 3 sales = float(raw_input("Enter your sales -->")) 4 5 tax = tax[trade_mode] * sales 6 print 'You must pay %.1f taxes' % tax
8. 几何, 计算面积和体积
(a) 正方形和立方体
(b) 圆和球.
1 from math import pi 2 def calArea(shape, length): 3 if shape == 'rectangle': 4 return length **2 5 elif shape == 'circle': 6 return pi * (length **2) 7 else: 8 print "WTF" 9 10 11 def calVolume(shape,length): 12 if shape == 'rectangle': 13 return length ** 3 14 elif shape == 'circle': 15 return 4.0 / 3 * pi * (length ** 3) 16 else: 17 print 'WTF' 18 19 20 21 aShape = raw_input("which shape do you wanna to calculate? -->") 22 aLength = float(raw_input("enter the length -->")) 23 area = calArea(aShape,aLength) 24 volume = calVolume(aShape,aLength) 25 print "%s has a area of %.2f, volume of %.2f" %(aShape,area,volume)
9. 数值形式, 回答下面关于数值格式的问题:
(a) 为什么下面的例子里 17 + 32 等于 49, 而017 + 32 等于47, 017 +032 等于41?
1 >>>17 + 32 2 49 3 >>>017 + 32 4 47 5 >>>017 + 032 6 41
# 第一个里面 数字17 和 32 都是十进制整形数字, 所以相加自然是49. 第二个例子中017表示的是八进制数字,
换算成十进制就是15 + 32 自然是17, 同理 017 和032 两个八进制数字相加为41.
(b) 为什么下面这个表达是我们得到的结果是134L而不是1342.
1 >>>65l + 78l 2 134L
#上面例子中, 错误的将1写成了小写的L, 即表示两个长整形数字 65 和 78的和自然是134L.
所以在表示长整形是强烈建议是用L. 而不是小写l 以区分'l' 数字1
10. 转换, 写一对函数来进行华氏度到摄氏度的转换. 转化公式为 C = (F-32) * (5 / 9)应该在这个联系中使用真正的除法
1 def c2f(celsius): 2 return (9.0 / 5) * celsius + 32 3 4 def f2c(fahrenheit): 5 return (fahrenheit - 32) * (5.0 / 9) 6 7 celsius = float(raw_input("Enter a celsius you wanna to trans to F -->")) 8 fah = c2f(celsius) 9 print fah 10 fahrenheit = float(raw_input("Enter a fahrenheit you wanna to trans to C -->")) 11 cel = f2c(fahrenheit) 12 print cel
11. 取余.
(a) 使用循环和算术运算 求出0~20 之间的所有偶数.
(b) 同上, 不过这次输出所有的奇数.
(c) 综合(a) 和 (b), 请问辨别奇数和偶数的最简单的方法是什么?
(d) 使用(c)的成功, 写一个函数, 检测一个整形能否被另一个整形是否整除. 先要求用户输入两个数, 然后你的函数判断两者是否有整除关系, 根据判断结果返回True 和 False
# _*_ coding:utf-8_*_ # answer for (a) & (b) for i in xrange(1,21): if i % 2 == 0: print i, print for i in xrange(0,21): if i % 2 != 0: print i, print # answer for (c): 从(a) 和 (b) 来看, 辨别奇数和偶数醉简单的方法"貌似" 是用该数对2 求余, 若等于0则是偶数, 若不为0则是奇数. #不过在xrange中直接定义步长就可以求出奇数和偶数. def divisionJudge(num1,num2): if num1 % num2 == 0: return True else: return False num1 = int(raw_input('Enter the num1 -->')) num2 = int(raw_input('Enter the num2 -->')) divisonresult = divisionJudge(num1,num2) if divisonresult: print u"%d 能整除 %d" %(num1, num2) else: print u"%d 不能整除%d" %(num1,num2)
12. 系统限制, 写一段脚本确认一下你的python所能处理的整形, 长整形,浮点和复数的范围.
1 # _*_ coding:utf-8_*_ 2 import sys 3 4 #int 5 sys.maxint 6 7 #float 8 sys.float_info 9 10 #long 11 sys.long_info
13. 转换, 写一个函数把由小时和分钟表示的时间转换为只用分钟表示的时间.
1 def timetrans(time): 2 hour,mins = time.split(':') 3 return int(hour) * 60 + int(mins) 4 5 aTime = raw_input('Enter your time(format: HH:MM) -->') 6 minutes = timetrans(aTime) 7 print minutes
14. 银行利息, 写一个函数, 以定期存款利率为参数, 鉴定改账户每日计算复利, 请计算并返回年回报率.
1 def rate(yearRate): 2 return (1 + yearRate/360) ** 360 3 nowRate = float(raw_input("Enter the bank rate -->")) 4 yearRate = rate(nowRate) 5 print yearRate
#银行利息计算公式不知道对不对..
15. 最大公约数和最小公倍数, 请计算两个整型的最大公约数和最小公倍数.
最大公约数计算: 有两整数 a 和 b, a % b =c
① 若c = 0 则b 为最大公约数.
②若c != 0 则a=b,b=c在执行求余.
最小公倍数为两数的乘积/最大公约数
1 def get_GCD(a,b): 2 while True: 3 c = divmod(a,b)[1] 4 if c == 0: 5 return b 6 else: 7 a,b = b,c 8 9 def get_LCM(a,b): 10 return (a * b) // get_GCD(a,b) 11 12 num1 = int(raw_input('Enter the num1 -->')) 13 num2 = int(raw_input('Enter the num2 -->')) 14 gcd = get_GCD(num1,num2) 15 lcm = get_LCM(num1,num2) 16 print gcd,lcm
16. 家庭财务, 给的一个初始金额和月开销数, 使用循环, 确定剩下的金额和党员的支出数,包括最后的支出数, Payment()函数会用到初始金额和月额度, 输出结果应该类似下面的格式(例子中的数字仅用于演示.)
1 def payment(balence,paid): 2 #print the title. 3 print "Pymt#",' '*2,'Paid',' '*4,"Balance" 4 print '-----',' '*2,'------',' '*2,'---------' 5 times,left = divmod(int(balence), int(paid)) 6 if left == 0: 7 times += 1 8 else: 9 times += 2 10 for i in xrange(1,times): 11 if balence > paid: 12 balence -= paid 13 paid_i = '$' + str(paid) 14 balence_i = '$' + str(balence) 15 print "%5d%8s%10s" %(i,paid_i,balence_i) 16 else: 17 paid = balence 18 paid_i = '$' + str(balence) 19 balence_i = '$' + str(balence-paid) 20 print "%5d%8s%10s" %(i,paid_i,balence_i) 21 22 payment(100.00,16.13)
17. *随机数. 生成一个又N个元素的由随机数n组成的列表, 其中N和n的取值范围分别为(1 < N <=100) 和 (0 <=n <=2**31-1), 然后再随机从这个列表中取N(1 <=N <=100)个随机数出来, 对他们排序,然后显示这个子集.
1 import random 2 lt = [] 3 numbers = random.randint(1,100) 4 for i in xrange(numbers): 5 numrange = random.randint(1,2**31-1) 6 lt.append(numrange) 7 8 lt2 = [] 9 numberstoget = random.randint(1,len(lt)) 10 for i in xrange(1,numberstoget): 11 lt2.append(lt[i]) 12 lt2.sort() 13 print lt2