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

Python日历格式输出异常:实际结果与样例不符,求修正方案

问题分析与修正方案

核心问题与对应修正

1. 标题格式不符

  • 问题:代码输出标题包含年份(如May 2020),但样例仅要求输出月份名称。
  • 修正:将main函数中的标题打印语句改为:
    print('{}'.format(month_name.title()))
    

2. 日期参数传递错误

  • 问题:main函数中num_days = num_days_in(month_name, year)传入了月份名称字符串,但num_days_in函数需要的是月份数字,会导致逻辑错误。
  • 修正:改为传入转换后的月份数字:
    num_days = num_days_in(month_num1, year)
    

3. 日期拼接无间隔导致对齐失效

  • 问题:week函数中直接拼接{:>2}格式化的日期,多位数日期会连在一起,且与表头的Mo Tu We(每个占3字符)不对齐。
  • 修正:每个日期格式化时添加尾部空格,保证每个日期占3字符,最后去掉末尾多余空格:
    week_str += '{:>2} '.format(day)
    # 空日期对应填充3个空格
    week_str += '   '
    # 最后去除末尾空格
    return week_str.rstrip()
    

4. 周起始日期计算错误

  • 问题:main函数中通过day_of_week(week_num * 7 - 6, month_num1, year)计算每周起始星期数,不符合week函数的逻辑(该函数需要的是当月1号的星期数来计算日期偏移)。
  • 修正:提前获取当月1号的星期数,传入week函数:
    first_day = day_of_week(1, month_num1, year)
    for week_num in range(1, num_weeks1+1):
        print(week(week_num, first_day, num_days))
    

5. 星期数对应关系错误

  • 问题:原day_of_week函数返回值与实际星期几的对应关系不符,导致日期起始位置错误。
  • 修正:调整返回值的计算,让0对应周一(Mo),6对应周日(Su):
    return (h + 5) % 7
    

修正后完整代码

import math

def day_of_week(day, month, year):
    if month < 3:
        month += 12
        year -= 1
    h = (day + math.floor(13*(month+1)/5) + year + math.floor(year/4) - math.floor(year/100) + math.floor(year/400)) % 7
    # 调整返回值对应关系:0=Mo,1=Tu...6=Su
    return (h + 5) % 7

def is_leap(year):
    return (year % 4 == 0 and year % 100 != 0) or year % 400 == 0

def month_num(month_name):
    months = {'january': 1, 'february': 2, 'march': 3, 'april': 4, 'may': 5, 'june': 6, 'july': 7, 'august': 8, 'september': 9, 'october': 10, 'november': 11, 'december': 12}
    return months[month_name.lower()]

def num_days_in(month_num, year):
    if month_num in [1, 3, 5, 7, 8, 10, 12]:
        return 31
    elif month_num == 2:
        return 29 if is_leap(year) else 28
    else:
        return 30

def num_weeks(month_num, year):
    first_day = day_of_week(1, month_num, year)
    num_days = num_days_in(month_num, year)
    return math.ceil((first_day + num_days) / 7)

def week(week_num, first_day_of_month, days_in_month):
    week_str = ''
    for i in range(7):
        day = (week_num - 1) * 7 + i + 1 - first_day_of_month
        if day > 0 and day <= days_in_month:
            week_str += '{:>2} '.format(day)
        else:
            week_str += '   '
    return week_str.rstrip()

def main():
    month_name = input('Enter month:\n')
    year = int(input('Enter year:\n'))
    month_num1 = month_num(month_name)
    num_days = num_days_in(month_num1, year)
    num_weeks1 = num_weeks(month_num1, year)
    print('{}'.format(month_name.title()))
    print('Mo Tu We Th Fr Sa Su')
    first_day = day_of_week(1, month_num1, year)
    for week_num in range(1, num_weeks1+1):
        print(week(week_num, first_day, num_days))
                   

if __name__ == '__main__':
    main()

测试效果

输入May和2020后,输出将与样例完全一致:

May 
Mo Tu We Th Fr Sa Su
             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 29 30 31

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:24:54