4.3.4 第四层设计

先考虑 days 函数的实现。我们将每个月的天数放在列表中,然后通过月份进行索引即 可得到该月天数。要注意有个特殊情形,即闰年 2 月份。这时应当为天数多加 1 天。代码如 下:

def days(y,m):
    month_days = [31,28,31,30,31,30,31,31,30,31,30,31]
    d = month_days[m]
    if (m == 1) and (y%4 == 0 and (y%100 != 0 or y%400 == 0)): 
        d = d + 1
    return d

接着考虑函数 layout 的实现。本函数根据 first 和 d,将每一个日期填入日历框架(图 4.9)。

def layout(first,d): 
    frame = 42 * [""] 
    if first == 0:
        first = 7 
    j = first - 1
    for i in range(1,d+1): 
        frame[j] = i
        j = j + 1 
    return frame

最后实现 printMonth 函数。日历布局已经保存在列表 frame 之中,函数要做的事情就是将列表成员打印出来。其中的关键是掌握好换行的时机,采用了日历框架后这一点变得很简单,只需每输出 frame 的七个成员就换行一次。代码如下:

def printMonth(frame): 
    for i in range(42):
        print "%3s" % (frame[i]), 
        if (i+1)%7 == 0:
            print

至此,我们为 calendar 程序设计的所有模块都已实现。