python核心编程第二版第5章习题答案
5-1.整型。讲讲Python普通整型和长整型的区别。
答案:Python的标准整数类型是最通用的数字类型。在大多数32位机器上,标准整数类型的取值范围是-2**31到2**31-1.
Python的长整数类型能表达的数值仅仅与你的机器支持的(虚拟)内存大小有关,换句话说,Python能轻松表达很大的整数。
长整型类型是标准整数类型的超集,当程序需要使用比标准整型更大的整型时,可以使用长整型类型。在一个整型值后面加个L,表示这个整型是长整型。
这两种整数类型正在逐渐统一为一种。
剩下的一种整型类型是布尔类型。即布尔True和布尔False。
5-2.操作符。
(a)写一个函数,计算并返回两个数的乘积。
(b)写一段代码调用这个函数,并显示它的结果。
答案:
def multiply(x,y):
return x*y
a = raw_input('input number 1: ')
b = raw_input('input number 2: ')
print multiply(float(a),float(b))
5-3.标准类型操作符。写一段脚本,输入一个测验成绩,根据下面的标准,输出他的评分成绩(A-F)。
A:90~100 B:80~89 C:70~79 D:60~69 F:<60
答案:
score = int(raw_input('input your score: '))
if score > 100:
print \"your score is wrong!!\"
elif score >= 90:
print 'A'
elif score >= 80:
print 'B'
elif score >= 70:
print 'C'
elif score >= 60:
print 'D'
else:
print 'F'
5-4.取余。判断给定年份是否是闰年。使用下面的公式。
一个闰年就是指它可以被4整除,但不能被100整除,或者它既可以被4又可以被100整除。比如1992年、1996年和2000年是闰年,但1967年和1900年则不是闰年。下一个是闰年的整世纪是2400年。
year = int(raw_input('input a year: '))
if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
print '%s is a leap year.' % year
else:
print '%s is not a leap year.' % year
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美分这样的结果都是不符合要求的。
dollar = float(raw_input('input a dollar less than 1 dollar: '))
cent = int(dollar * 100)
N25 = cent / 25
N10 = (cent - 25 * N25) / 10
N5 = (cent - 25 * N25 - 10 * N10) / 5
N1 = cent - 25 * N25 - 10 * N10 - 5 * N5
print '''
25 cents : %d
10 cents : %d
5 cents : %d
1 cents : %d
''' % (N25,N10,N5,N1)
5-6.算术。写一个计算器程序。你的代码可以接受这样的表达式,两个操作数加一个操作符:N1操作符N2。其中N1和N2为整型或浮点型,操作符可以是+、-、*、/、%、**,分别表示加法、减法、乘法、整型除、取余和幂运算。计算这个表达式的结果,然后显示出来。提示:可以使用字符串方法split(),但不可以使用内建函数eval()。
答案:
#coding:utf-8
def calculator(expression):
operator = ['+','-','*','/','%','**']
sysmol = ''
for i in operator:
if i in expression:
sysmol = i
if sysmol == '':
print u'操作符错误'
return
num = expression.split(sysmol)
if '.' in num[0] or '.' in num[1]:
num1 = float(num[0])
num2 = float(num[1])
else:
num1 = int(num[0])
num2 = int(num[1])
if sysmol == operator[0]:
print expression,'=',num1+num2
elif sysmol == operator[1]:
print expression,'=',num1-num2
elif sysmol == operator[2]:
print expression,'=',num1*num2
elif sysmol == operator[3]:
print expression,'=',num1/num2
elif sysmol == operator[4]:
print expression,'=',num1%num2
elif sysmol == operator[5]:
print expression,'=',num1**num2
expression = raw_input('请输入一个表达式,(譬如:1+2): '.decode('utf-8').encode('gbk'))
calculator(expression)
5-7.营业税。随意取一个商品金额,然后根据当地营业税额度计算应该交纳的营业税。
答案:
#coding:utf-8
price = float(raw_input('请输入商品的金额:'.decode('utf-8').encode('gbk')))
tax = float(raw_input(\"请输入当地的营业税率:\".decode('utf-8').encode('gbk')))
print u\"应缴营业税:%.2f\" % (price * tax)
5-8.几何。计算面积和体积。
(a)正方形和立方体
(b)圆和球
答案:
#coding:utf-8
import math
side = float(raw_input('请输入边长/半径:'.decode('utf-8').encode('gbk')))
print '''
Area of a square is: %.2f
Volume of a cube is: %.2f
Area of a circle is: %.2f
Volume of ball is : %.2f
''' % (round(side * side,2),round(side ** 3,2),\\
round(math.pi * side ** 2,2),round(4/3.0 * math.pi * side ** 3,2))
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
134L
答案:
(a)因为Python中0开头的数字表示八进制数。八进制数017表示15,而八进制数032表示26,所以得到如题所示答案。
(b)因为l是L的小写,不是数字1。
5-10.转换。写一对函数来进行华氏度到摄氏度的转换。转换公式为C = (F - 32) * (5 / 9)应该在这个练习中使用真正的除法,否者你会得到不正确的结果。
答案:
#coding:utf-8
def fahrenheit_to_centigrade(fahrenheit):
return round((fahrenheit - 32) * (5.0 / 9.0),2)
fahrenheit = float(raw_input('请输入华氏度:'.decode('utf-8').encode('gbk')))
print fahrenheit_to_centigrade(fahrenheit)
5-11.取余。
(a)使用循环和算术运算,求出0~20之间的所有偶数。
(b)同上,不过这次输出所有的奇数。
(c)综合(a)和(b),请问辨别奇数和偶数的最简单的办法是什么?
(d)使用(c)的成果,写一个函数,检测一个整型能否被另一个整型整除。现要求用户输入两个数,然后你的函数判断两者是否有整除关系,根据判断结果分别返回True和False。
答案:
(a)
for i in range(0,21):
if i % 2 == 0:
print i,
(b)
for i in range(0,21):
if i % 2 != 0:
print i,
(c)看是否能被2整除。
(d)
#coding:utf-8
def divides(a,b):
diva = False
divb = False
if a % b == 0:
diva = True
if b % a == 0:
divb = True
print (diva or divb)
divides(2,6)
divides(6,2)
divides(2,9)
5-12.系统限制。写一段脚本确认一下你的Python所能处理的整型、长整型、浮点型和复数的范围。
答案:不知道,日后补上,暂时附上别人的答案
import sys
print (sys.maxint)
print(-sys.maxint-1)
print(sys.float_info)
print(sys.long_info)
5-13.转换。写一个函数把小时和分钟所表示的时间转换成为只用分钟表示的时间。
#coding:utf-8
def H_to_min(a,b):
if a > 24 or b > 60:
return u\"时间格式错误\"
return a * 60 + b
time = raw_input(\"请输入时间,exg:12:30 >>\".decode('utf-8').encode('gbk'))
time = time.split(':')
print H_to_min(int(time[0]),int(time[1]))
5-14.银行利息。写一个函数,以定期存款利率为参数,假定该账户每日计算复利,请计算并返回年回报率。
答案:
#coding:utf-8
dayInterestRate = float(raw_input('Please input the day rate: '))
yearInterestRate = (1 + dayInterestRate) ** 365 - 1
print u'年复利 = ',round(yearInterestRate * 100,2), '%'
5-15.最大公约数和最小公倍数。请计算两个整型的最大公约数和最小公倍数。
【背景知识】
本题答案采用的是更相减损术,又称“等值算法”求两个数的最大公约数,而两个数的最小公倍数是他们的乘积除以最大公约数。
最小公倍数(Least Common Multiple,缩写LCM)
最大公约数(Greatest Common Divisor,缩写GCD;或Highest Common Factor,简写为HCF)
答案:
def GCD(m,n):
if m > n:
while m - n != n:
i = m - n
if i > n:
m = i
else:
m = n
n = i
return n
else:
while n - m != m:
i = n - m
if i > m:
n = i
else:
n = m
m = i
return m
def LCM(a,b):
return a * b / GCD(a,b)
m = int(raw_input(\"m = : \"))
n = int(raw_input(\"n = : \"))
print GCD(m,n)
print LCM(m,n)
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
答案:这题看不懂,附上别人的。
balance = float(raw_input(\"Enter opening balance: ... \"))
payment = float(raw_input(\"Enter monthly payment: ... \"))
pymt = 1
print ' Amount Remaining'
print 'Pymt# Paid Balance'
print '----- ------ -----------'
print '%4d%15.2f%15.2f' % (0, 0.00, 100)
while (balance - payment*pymt ) >= 0:
pymt = pymt + 1
print '%4d%15.2f%15.2f' % (pymt - 1, payment, (balance - payment*(pymt - 1)))
print '%4d%15.2f%15.2f' % (pymt, (balance - payment*(pymt - 1)), 0)
5-17.*随机数。熟读随机数模块然后解下面的题。生成一个有N个元素的由随机数n组成的列表,其中N和n的取值范围分别为(1 < N <= 100)和(0 <= n <= 2**31 - 1)。然后再随机从这个列表中取N(1 <= N <= 100)个随机数出来,对他们排序,然后显示这个子集。
答案:
import random
num = random.randint(1,100)
List = []
for i in range(num):
List.append(random.randint(0,2**31-1))
print List
print num
List.sort()
print List
注:本文来自于网易博客http://fangweiren843.blog.163.com/,首次上传在百度文库。以便更好的学习交流。
因篇幅问题不能全部显示,请点此查看更多更全内容