在Python 3.3.2中,我正在编写一个日历程序。目前,我的代码如下:
def month_28():
if day == 1:
columns = 7
for i in range(1, 29):
if i % columns != 0:
print(i, end= " ")
if i <= 9:
print(end=" ")
else:
print(end=" ")
else:
print(i)
这段代码可以打印出如下日历:
February 2013
Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
但是,如果1月以星期三结束,我需要2月以星期四开始。我希望这种偏移能够贯穿整年。有没有一种方法可以将2月1日偏移5位,并从星期四开始计数?或者,是否有更好的方法来打印一整年每个月的连续递增数字?
解决方案
方法一:使用日历模块
您可以直接使用Python的日历模块来生成日历。日历模块提供了很多有用的函数,可以帮助您轻松地格式化和打印日历。
import calendar
print(calendar.TextCalendar().formatmonth(2013, 2, 4))
这段代码将打印出如下日历:
February 2013
Mon Tue Wed Thu Fri Sat Sun
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28
如果您想将星期日作为一周的第一天,可以使用如下代码:
print(calendar.TextCalendar(calendar.SUNDAY).formatmonth(2013, 2, 4))
这段代码将打印出如下日历:
February 2013
Sun Mon Tue Wed Thu Fri Sat
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28
方法二:使用列表和字符串格式化
如果您想自己编写日历打印程序,可以使用列表和字符串格式化来实现。首先,您需要创建一个列表来存储日历数据。例如:
table = [['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
['', '', '', '', '', '1', '2'],
['3', '4', '5', '6', '7', '8', '9'],
['10', '11', '12', '13', '14', '15', '16'],
['17', '18', '19', '20', '21', '22', '23'],
['24', '25', '26', '27', '28', '', '']]
然后,您可以使用字符串格式化来打印日历。例如:
def printTable(tbl, borderHorizontal='-', borderVertical='|', borderCross='+'):
cols = [list(x) for x in zip(*tbl)]
lengths = [max(map(len, map(str, col))) for col in cols]
f = borderVertical + borderVertical.join(' {:>%d} ' % l for l in lengths) + borderVertical
s = borderCross + borderCross.join(borderHorizontal * (l + 2) for l in lengths) + borderCross
rtr = [s]
for row in tbl:
rtr.append(f.format(*row))
rtr.append(s)
return '\n'.join(rtr)
print(printTable(table))
这段代码将打印出如下日历:
+-----+-----+-----+-----+-----+-----+-----+
| Sun | Mon | Tue | Wed | Thu | Fri | Sat |
+-----+-----+-----+-----+-----+-----+-----+
| | | | | | 1 | 2 |
+-----+-----+-----+-----+-----+-----+-----+
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
+-----+-----+-----+-----+-----+-----+-----+
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
+-----+-----+-----+-----+-----+-----+-----+
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
+-----+-----+-----+-----+-----+-----+-----+
| 24 | 25 | 26 | 27 | 28 | | |
+-----+-----+-----+-----+-----+-----+-----+