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 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
答:
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,每次取一个元素就自动减一来保证不会出现麻烦