《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/15input 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初始化改好后,程序得到正确的结果
以上是 《Python核心编程》第二版第六章练习题答案-第五部分 的全部内容, 来源链接: utcz.com/z/386653.html