《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初始化改好后,程序得到正确的结果

 

 

 

 

 

 

posted on 2012-07-27 17:28  温柔的暴力  阅读(1354)  评论(0编辑  收藏  举报

导航