4.3.4 第四层设计

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

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

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

  1. def layout(first,d):
  2. frame = 42 * [""]
  3. if first == 0:
  4. first = 7
  5. j = first - 1
  6. for i in range(1,d+1):
  7. frame[j] = i
  8. j = j + 1
  9. return frame

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

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

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