《Python核心编程》第二版第六章练习题答案-第五部分

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

以上是 《Python核心编程》第二版第六章练习题答案-第五部分 的全部内容, 来源链接: utcz.com/z/386653.html

回到顶部