Python中如何正确地偏移连续数字的行

在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 |     |     |
+-----+-----+-----+-----+-----+-----+-----+
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值