You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python的list comprehension实现月历打印

用列表推导式实现月历打印

要实现这个功能,我们可以借助Python的datetime模块获取月份的关键信息(避免手动计算天数和星期几的麻烦),再用列表推导式来处理日期分组和格式化。以下是完整实现步骤:

1. 导入模块并获取月份核心数据

先定义目标年月,再用datetime拿到当月第一天、最后一天,进而算出总天数和日期起始偏移(即当月第一天是星期几,用来生成前面的占位符):

import datetime

# 定义要打印的年月,可自行修改
year, month = 2024, 5
first_day = datetime.date(year, month, 1)
last_day = datetime.date(year, month + 1, 1) - datetime.timedelta(days=1)
total_days = last_day.day
# 按周日为一周开头计算偏移:isoweekday()返回1-7(周一到周日),取模7后周日对应0
start_offset = first_day.isoweekday() % 7

2. 用列表推导式生成完整日期列表

先补上前头的空占位符,再用列表推导式生成1到当月天数的字符串列表:

# 占位符 + 日期字符串列表
calendar_items = [''] * start_offset + [str(day) for day in range(1, total_days + 1)]

3. 用列表推导式拆分每周行

按每7个元素一组,把整个列表拆分成每周的子列表——这就是实现月历分组的核心列表推导式:

# 步长为7切片,生成每周的行数据
weekly_rows = [calendar_items[i:i+7] for i in range(0, len(calendar_items), 7)]

4. 打印格式化后的月历

最后打印表头,再用生成器表达式(和列表推导式逻辑一致)格式化每行的输出:

# 打印星期表头
print("Sun Mon Tue Wed Thu Fri Sat")
# 逐行打印,每个元素占3位右对齐
for row in weekly_rows:
    print(' '.join(f'{item:>3}' for item in row))

关键列表推导式说明

  • [str(day) for day in range(1, total_days+1)]:快速将1到当月天数的整数转换为字符串列表,替代循环append的写法
  • [calendar_items[i:i+7] for i in range(0, len(calendar_items), 7)]:通过步长7的切片,一次性把整个日期列表拆分为每周的子列表,简洁高效
  • 打印时的f'{item:>3}' for item in row:属于生成器表达式,和列表推导式语法类似,用来快速格式化每个元素的显示格式

如果需要改为周一开头的月历,只需把start_offset改为first_day.weekday()(weekday()返回0-6,对应周一到周日),同时把表头改成"Mon Tue Wed Thu Fri Sat Sun"即可。

内容的提问来源于stack exchange,提问作者Jack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 15:31:41