Python核心编程-第五章课后习题

5-1 整形 讲讲 Python 普通整型和长整型的区别

答:在2.7版本基本淡化了区别。真要区分的话,普通整型是32位或者64位,而长整型只与PC内存有关,很大就是了

5-2 运算符
(a) 写一个函数,计算并返回两个数的乘积
(b) 写一段代码调用这个函数,并显示它的结果。

答:

a)

def mul(a,b):
    return a * b
if __name__ == "__main__":
	a = float(raw_input("Please enter first num:"))
	b = float(raw_input("Please enter another num:"))
	print 'The result is %s' % mul(a,b)

编写的过程中发现自己经常忘记   raw_input()   函数的内部的引号,这个要注意,结果如下

Please enter first num:4
Please enter another num:5
The result is 20.0

其中很多问ti:输入的是字符串怎么办;输入复数怎么办都需要考虑的

b)

答:注,a)文件我的命名是C5_2_a.py,先前直接命名的是5_2_a.py,一直行不通后来想起来了,Python的命名方法不允许开头是数字

前期准备工作是在powershell中一直cd到C5_2_a这个文件的根目录,然后再输入Python进入到交互模式

PS C:\Users\Administrator> cd mystuff
PS C:\Users\Administrator\mystuff> cd exercise
PS C:\Users\Administrator\mystuff\exercise> cd chapter5
PS C:\Users\Administrator\mystuff\exercise\chapter5> python
>>> from C5_2_a import mul
>>> mul(3,4)
12
5-3 标准类型运算符. 写一段脚本,输入一个测验成绩,根据下面的标准,输出他的评分成绩(A-F)。
A: 90–100
B: 80–89
C: 70–79
D: 60–69
F: <60

答:

def score_div(num):
    if 90<=num<=100:
	return 'A'
    elif 80<=num<=89:
	return 'B'
    elif 70<=num<=79:
	return 'C'
    elif 60<=num<=69:
	return 'D'
    else:
	return 'F'

在交互模式中执行(其文件名是C5_3.py)

>>> from C5_3.py import *
>>> score_div(79)
'C'

看到大神用一个叫    表格驱动法 的方法处理连环if elif的问ti,以后留意一下

5-4 取余。判断给定年份是否是闰年。使用下面的公式:一个闰年就是指它可以被 4 整除,但不能被 100 整除, 或者它既可以被 4 又可以被 100 整除。比如 1992,1996 和 2000 年是闰年,但 1967 和 1900 则不是闰年。下一个是闰年的整世纪是 2400 年。

答:

首先小小吐槽一下ti目,闰年不是整百的能被4整除,整百的必须要被400整除才行。ti目说:

既可以被 4 又可以被 100 整除

请问,1900能否满足上述条件?它是闰年吗?显然不是闰年

def leap_year(a):
    if ((a%4 == 0) and (a%100 != 0)) or (a%400 == 0):
	return '%s is a leap year.' % a
    else:
	return '%s is not a leap year.' % a


以上在检测的时候,发现from C5_4 import *这个语法,如果脚本做了修改,需要重新关闭shell,在打开操作,否则一直import的以前的函数

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 美分这样的结果都是不符合要求的。

答:

def changes(num):
    n_25,n_10,n_5,n_1 = 0,0,0,0
    n_25 = (num - num % 25)/25
    n_10 = (num - n_25 * 25)/10
    n_5 = (num - n_25 * 25 - n_10 * 10)/5
    n_1 = num - n_25 * 25 - n_10 * 10 - n_5 * 5
    return n_25 + n_10 + n_5 + n_1

以上这种方法比较水,看了大神的可以用divmod()函数

def changes(money):
    list = [25,10,5,1]
    count = 0
    for i in list:    
        result = divmod(money,i)
        count += result[0]
        money = result[1]

涨姿势了!!!

5-6 算术。写一个计算器程序 你的代码可以接受这样的表达式,两个操作数加一个运算符:N1 运算符 N2. 其中 N1 和 N2 为整数或浮点数,运算符可以是+, -, *, /, %, ** 分别表示加法,减法, 乘法, 整数除,取余和幂运算。计算这个表达式的结果,然后显示出来。提示:可以使用字符串方法 split(),但不可以使用内建函数 eval().

答:

不知道这个ti目的具体意义是干嘛的~

def calc(newstr):
    num = newstr.split(" ")
    if num[1] == '+':
	return float(num[0]) + float(num[2])
    elif num[1] == '-':
	return float(num[0]) - float(num[2])
    elif num[1] == '*':
	return float(num[0]) * float(num[2])
    elif num[1] == '/':
	return float(num[0]) / float(num[2])
    elif num[1] == '%':
	return float(num[0]) % float(num[2])
    elif num[1] == '**':
	return float(num[0]) ** float(num[2])
    else:
	return 'error'

这个程序很简单,但是用了我一个半番茄!!!

为什么呢?因为从这里复制到note++缩进有问ti,很大的问ti,所以以后写的话一定要在note++写完复制到这里

怎么发现的呢?可以用note++里面那个+,看是不是应该是在一个代码块里面

运行无误~

5-7 直接跳过,这个也不难
5-8 几何。计算面积和体积:
(a) 正方形和立方体
(b) 圆和球

答:

from math import *
def square(a):
    return 'The aera of square is %s' % (a**2)
def cubic(a):
    return 'The volume of cube is %s' % (a**3)
def circular(a):
    return 'The aera of circular is %s' % (pi*a**2)
def spere(a):
    return 'The volume of spere is %s' % (4/3*pi*a**3)

比较常规,唯一需要注意的是需要导入圆周率pi,原来在C5_8.py中导入了pi,在交互模式直接“from C5_8 import *”就不必在调用“from math imort *”了

5–9. 数值形式 回答下面关于数值格式的问ti:
(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)17+32 本来就等于49.这个没啥好解释的。而017+32=47,和017+032=41因为前面加了个0就代表他是八进制的,我们看到的显示是十进制

b)这个是小学脑筋急转弯吗?后边不是数字1,而是小写的字母l,觉得这个有点侮辱智商

5-10 转换。写一对函数来进行华氏度到摄氏度的转换。转换公式为 C = (F - 32) * (5 / 9)应该在这个练习中使用真正的除法, 否则你会得到不正确的结果。

答:

def ftoc(f):
	return (float(f)-32) * (5.0/9)

亲测无误

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)

def divb(a,b):
    if a % b == 0 or b % a == 0:
        return True
    else:
        return False
5-12 系统限制。写一段脚本确认一下你的 Python 所能处理的整数,长整数,浮点数和复数的范围。

答:

这个暂且不会,有个思路就是用try 和except,将某个数一直往上加,然后直到报错

5-13 转换。写一个函数把由小时和分钟表示的时间转换为只用分钟表示的时间。

答:

def timetrans(time):
    a = time.split(':')
    return int(a[0])*60 + int(a[1])

这个输入的时候一定要       timetrans('3:45')      这样的格式才行

5-14 银行利息。写一个函数,以定期存款利率为参数, 假定该账户每日计算复利,请计算并返回年回报率。

答:

用到的公式

本息和 = 本金 * (1+a)^365

我觉得这个ti出的很没水平啊,定期存款利率哪里有an天来算的,后面还每日计算复利,那能这么搞啊

5–15. 最大公约数和最小公倍数。请计算两个整数的最大公约数和最小公倍数。

答:

数学上求最大公约数可以用辗转相除法,也叫欧几里得法

求(319,377):

∵ 319÷377=0(余319)

∴(319,377)=(377,319);

∵ 377÷319=1(余58)

∴(377,319)=(319,58);

∵ 319÷58=5(余29),

∴ (319,58)=(58,29);

∵ 58÷29=2(余0),

∴ (58,29)= 29;

∴ (319,377)=29.                摘自百度百科---最大公约数

'''最大公约数和最小公倍数都放在同一个文件里面了'''
def comdiv(a,b):                    #最大公约数,采用欧几里得法
    r = a % b 
    while r!= 0:
	a = b
	b = r
	r = a % b
    return b

def commul(a,b):
    return a*b/comdiv(a,b)          #最小公倍数,采用公式法:最小公倍数 = 两数乘积/最大公约数
>>> from C5_15 import *
>>> comdiv(4,6)
2
>>> commul(3,6)
6

亲测有效

5-16 家庭财务。给定一个初始金额和月开销数, 使用循环,确定剩下的金额和当月的支出数, bao括最后的支出数。 Payment() 函数会用到初始金额和月额度, 输出结果应该类似下面的格式(例子中的数字仅用于演示):
Enter opening balance:100.00

答:

没搞明白题目是什么意思,每个月开销是一样的吗?直接显示出来,还是当做账本,记一笔显示一笔。

不过想来也不难做,先搁置吧

5-17 随机数。熟读随机数模块然后解下面的题:生成一个有 N 个元素的由随机数 n 组成的列表, 其中 N 和 n 的取值范围分别为: (1 <N <= 100), (0 <= n <= 231 -1)。然后再随机从这个列表中取 N (1 <= N <= 100)个随机数出来, 对它们排序,然后显示这个子集。

答:

from random import *
N = randint(1,101)
a = 2**31 - 1
list1 = []
for i in range(0,N):
    list1.append(randint(0,a))
print list1                                            #list1就是生成的列表

list2 = []
N2 = randint(1,N)
count = N - 1
for i in range(0,N2):
    s = list1.pop(randint(0,count))
    count-=1
    list2.append(s)
list2.sort()
print list2                                           #list2就是排序后的列表

题目没有说清楚,生成N个元素的列表,然后再随机从这个列表中取N个随机数,这两个N应该是不一样的N吧?要不然直接用个sort()方法不就完成第二个要求了吗

其中有个难点,在第二个代码块:当pop一个list1的元素出来以后,这个list中就没有了这个元素,其索引值会减一,所以才加了个count,每次取一个元素就自动减一来保证不会出现麻烦


你可能感兴趣的:(python核心编程,课后习题答案)