如何使用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
相关产品推荐
相关产品推荐

