《Python核心编程》第二版第六章练习题答案-第五部分
6–15.转换
(a)给出两个可识别格式的日期,比如 MM/DD/YY 或者 DD/MM/YY 格式,计算出两个日期间的天
数.
(b)给出一个人的生日,计算从此人出生到现在的天数,包括所有的闰月.
(c)还是上面的例子,计算出到此人下次过生日还有多少天.
解答:
# -*- coding:utf-8 -*- #!/usr/bin/python #Filename:6-15.py ''' Created on 2012-7-27 @author: wanglei ''' def isleapyear(year): if (year %4==0 and year%100!=0) or year%400==0: return True else: return False def analysisdate(date): #该函数将字符串日期按年月日三部分存在一个整数列表中 datestrlist=date.split("/") dateintlist=[] for i in datestrlist: dateintlist.append(int(i)) return dateintlist def datafrom1970(datelist): daylist=[31,28,31,30,31,30,31,31,30,31,30,31] year=datelist[0] month=datelist[1] day=datelist[2] leapday=0 yeardis=year-1-1970 #要计算的年份跟1970年相差的整年份 daysofyeardis=yeardis*365 #没有将闰年多的一天计算在内 for i in range(1970,year+1): if isleapyear(i): leapday +=1 daysofyeardis +=leapday #要计算的年份到1970年所相差的整年对应的天数差 daysoflastyear=0 for i in range(1,month): daysoflastyear +=daylist[i-1] #计算最后一年有多少天 daysoflastyear +=day if isleapyear(year): #如果最后一年是闰年,还要多加一天 daysoflastyear +=1 totaldays= daysofyeardis+daysoflastyear #总天数差 return totaldays def twodatediff(date1,date2): datelist1=analysisdate(date1) datelist2=analysisdate(date2) diff1=datafrom1970(datelist1) diff2=datafrom1970(datelist2) difference=diff2-diff1 return difference d1=raw_input("input date1: ") d2=raw_input("input date2: ") print "difference is :%d"%twodatediff(d1,d2)
测试数据:
input date1: 1988/10/15
input date2: 2012/7/27
相差:8686天
思路:通过分别计算两个日期与1970/1/1的日期差来计算这两个日期相差多少天
6–16.矩阵.处理矩阵M 和N 的加和乘操作.
解答:
# -*- coding:utf-8 -*- #!/usr/bin/python #Filename:6-15.py ''' Created on 2012-7-27 @author: wanglei ''' def matrixmul(matri1,matri2): m1=len(matri1) #矩阵1的行数 #print m1 n1=len(matri1[0]) #矩阵1的列数 #print n1 m2=len(matri2) #矩阵2的行数 #print m2 n2=len(matri2[0]) #矩阵2的列数 #print n2 if n1!=m2: print "这两个矩阵无法相乘..." return mullist=[[0]*m1 for row in range(n2)] #定义两个矩阵相乘的结果矩阵 #print mullist for i in range(0,m1): for j in range(0,n2): for k in range(0,n1): #print matri1[i][k] #print matri2[k][j] mullist[i][j] +=matri1[i][k]*matri2[k][j] #print mullist[i][j] #print mullist return mullist ma1=[[1,2,3],[4,5,6]] ma2=[[7,8],[9,10],[11,12]] print matrixmul(ma1,ma2)
测试数据:
[[58, 64], [139, 154]]
思路:矩阵相乘没有什么难理解的,主要是通过一个三重循环来计算结果。
本题的重点要放在Python如何使用多维数组上,代码中我们可以看到,我通过:
mullist=[[0]*m1 for row in range(n2)]
这条语句初始化了一个m1*n2的矩阵,这是正确的初始化多维数组的方式。
开始时,采用了这种定义方式:
mullist=[[0]*m1]*n2
程序可以正确给结果矩阵赋值,但是计算几个值后就会报错,上网查了一下,主要还是这种初始化定义
多维数组,加上下面这条赋值语句:
mullist[i][j] +=matri1[i][k]*matri2[k][j]
会产生让人难理解的结果。
现将结果总结如下:
需要在程序中使用二维数组,网上找到一种这样的用法:
#创建一个宽度为3,高度为4的数组 #[[0,0,0], # [0,0,0], # [0,0,0], # [0,0,0]] myList = [[0] * 3] * 4
对其赋值:
myList[0][1] = 1
结果为:
[[0,1,0], [0,1,0], [0,1,0], [0,1,0]]
每一列的值均改变了,这与我们预期的结果不符。
查资料后,发现:
list * n—>n #shallow copies of list concatenated,
也就是返回n个list的浅拷贝的连接
比如:
>>> lists = [[]] * 3 >>> lists [[], [], []] >>> lists[0].append(3) >>> lists [[3], [3], [3]]
[[]]是一个含有一个空列表元素的列表,所以[[]]*3表示3个指向这个空列表元素的引用,修改任何
一个元素都会改变整个列表:
所以需要用另外一种方式进行创建多维数组,以免浅拷贝:
>>> lists = [[] for i in range(3)] >>> lists[0].append(3) >>> lists[1].append(5) >>> lists[2].append(7) >>> lists [[3], [5], [7]]
程序里将mullist初始化改好后,程序得到正确的结果