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
相关产品推荐
相关产品推荐

