青少年 Python 入门 | 每天打开看一看——「暑假倒计时日历」+ 每日一句
青少年 Python 入门 | 每天打开看一看——「暑假倒计时日历」+ 每日一句
适合人群:Python 入门(建议 4~8 年级),掌握
datetime/list/for后
项目定位:单课时(60 分钟),成品是一个每天都能用的倒计时工具
核心大概念:时间是一种数据类型——日期可以加减、可以比较、可以格式化,和数字一样是"一等公民"
目录
- 为什么做倒计时
- 版本一:算天数——3 行代码出结果
- 版本二:进度条——把"还剩多少天"画出来
- 版本三:文字日历——这个月还剩几天
- 版本四:每日一句 + 完整工具
- 完整代码
- 教学指南
1. 为什么做倒计时
暑假有一个残酷的事实:
放假第一天觉得两个月很长。刷了半个月手机后突然发现——只剩 30 天了。
倒计时的作用不是制造焦虑,而是让时间变得可见。当学生每天打开程序看到"还剩 45 天"和一条励志语,它是一种温柔的提醒。
编程层面,这个项目引入了一个重要的认知升级:
时间不是只能看的——代码可以算它、比它、格式化它。
datetime模块让日期变得和数字一样可操作。
2. 版本一:算天数——3 行代码出结果
fromdatetimeimportdate summer_end=date(2026,8,31)# 暑假结束日期(假设 9 月 1 日开学)today=date.today()# 今天left=(summer_end-today).days# 两个日期相减,得到的是 timedelta 对象print("今天:"+str(today))print("暑假结束:"+str(summer_end))print("还剩 "+str(left)+" 天")今天:2026-06-20 暑假结束:2026-08-31 还剩 72 天三行核心代码,已经能跑了。但学生看到的是裸数字——"72 天"没什么感觉。接下来我们把它变成直观的视觉。
关键概念:
date.today()返回今天的日期。两个日期相减得到一个timedelta对象,.days取出天数。日期和数字一样可以做运算——这就是"时间是数据类型"的含义。
3. 版本二:进度条——把"还剩多少天"画出来
fromdatetimeimportdate summer_start=date(2026,6,20)# 暑假开始summer_end=date(2026,8,31)# 暑假结束today=date.today()total_days=(summer_end-summer_start).days# 暑假总天数passed_days=(today-summer_start).days# 已经过去的天数left_days=(summer_end-today).days# 剩余天数# 计算百分比percent_passed=passed_days/total_days*100percent_left=left_days/total_days*100# 画进度条(总长 30 格)bar_width=30passed_bar=int(bar_width*passed_days/total_days)left_bar=bar_width-passed_bar bar="["+"="*passed_bar+">"+"."*left_bar+"]"print()print(" +----------------------------------------+")print(" | 暑 假 倒 计 时 |")print(" +----------------------------------------+")print()print(" 开始:"+str(summer_start)+" 结束:"+str(summer_end))print()print(" "+bar)print()print(" 已过去:"+str(passed_days)+" 天 ("+str(round(percent_passed,1))+"%)")print(" 剩余:"+str(left_days)+" 天 ("+str(round(percent_left,1))+"%)")print()效果:
+----------------------------------------+ | 暑 假 倒 计 时 | +----------------------------------------+ 开始:2026-06-20 结束:2026-08-31 [>.............................] 已过去:0 天 (0.0%) 剩余:72 天 (100.0%)教学点:
"=" * passed_bar是字符串乘法——一个等号重复 N 次。这是 Python 里最简单也最常用的"可视化"手段。没有图形界面,也能画图。
4. 版本三:文字日历——这个月还剩几天
倒计时告诉你"还有多少天",日历告诉你"每一天的位置"。
importcalendarfromdatetimeimportdatedefprint_month_calendar(year,month,today):"""打印这个月的文字日历,标注今天和暑假结束日"""print()print(" "+str(year)+" 年 "+str(month)+" 月")print(" 一 二 三 四 五 六 日")# 获取这个月的日历矩阵cal=calendar.monthcalendar(year,month)forweekincal:line=" "fordayinweek:ifday==0:line=line+" "# 这个月没有这天elifday==today.dayandmonth==today.month:line=line+" ["+str(day).zfill(2)+"]"# 今天是 [20]else:line=line+" "+str(day).zfill(2)+" "print(line)print()# 使用print_month_calendar(2026,6,date.today())print_month_calendar(2026,7,date.today())print_month_calendar(2026,8,date.today())效果:
2026 年 6 月 一 二 三 四 五 六 日 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 [20] 21 22 23 24 25 26 27 28 29 30
calendar.monthcalendar()返回一个嵌套列表——每一行是一个星期,每个元素是一天的日期(0 表示不属于这个月)。这是 Python 标准库自带的,不需要安装任何东西。
学生看到[20]被方括号括起来,会有一种"我的位置被标记了"的感觉。这就是数据可视化最基础的形态——在正确的位置放正确的符号。
5. 版本四:每日一句 + 完整工具
现在把所有功能整合起来:倒计时进度条 + 日历 + 随机励志语,再加上每日心情记录:
importrandomfromdatetimeimportdate# 励志语库quotes=["今天翻的书,就是明天数的钱。——不是,是知识的重量。","暑假不学习,开学徒伤悲。","每天进步一点点,暑假结束你就是不一样的自己。","别人在刷手机,你在刷题——差距就是这么拉开的。","每一个你羡慕的学霸,暑假都在偷偷努力。","玩可以,但别忘了今天的任务。","自律给我自由。——这句话是真的。","暑假不是用来荒废的,是用来弯道超车的。",]defdaily_checkin():"""每日签到 + 心情记录"""print()print(" ----- 今日打卡 -----")moods={"1":"[开心]","2":"[一般]","3":"[疲惫]","4":"[充实]"}print(" 今天的心情?1.开心 2.一般 3.疲惫 4.充实")mood_choice=input(" > ")mood=moods.get(mood_choice,"[未记录]")note=input(" 今天做了什么?(一句话):")# 追加到心情日记文件today_str=str(date.today())withopen("暑假心情日记.txt","a",encoding="utf-8")asf:f.write(today_str+" "+mood+" "+note+"\n")print(" 已记录!")defshow_mood_history():"""显示历史心情"""print()print(" ----- 心情日记 -----")try:withopen("暑假心情日记.txt","r",encoding="utf-8")asf:lines=f.readlines()iflen(lines)==0:print(" 还没有记录。")else:forlineinlines[-10:]:# 最近 10 条print(" "+line.rstrip())print()print(" (显示最近 "+str(min(10,len(lines)))+" 条)")exceptFileNotFoundError:print(" 还没有记录。")6. 完整代码
点击展开完整代码(可直接运行)""" 暑假倒计时日历 + 每日一句 每天打开看看,暑假还剩多少天 """importcalendarimportrandomfromdatetimeimportdate# ==================== 配置 ====================SUMMER_START=date(2026,6,20)# 你的暑假开始日SUMMER_END=date(2026,8,31)# 你的暑假结束日quotes=["今天翻的书,就是明天知识的重量。","暑假不学习,开学徒伤悲。","每天进步一点点,暑假结束你会感谢自己。","别人刷手机,你刷题——差距这么来的。","每一个学霸的暑假,都藏着悄悄的努力。","玩可以,别忘了今天的任务。","自律给我自由。","暑假不是用来荒废的,是用来弯道超车的。","种一棵树最好的时间是十年前,其次是今天。","你今天的努力,是明天选择的权利。",]# ==================== 倒计时视图 ====================defshow_countdown():today=date.today()total=(SUMMER_END-SUMMER_START).days passed=(today-SUMMER_START).days left=(SUMMER_END-today).daysifleft<0:print()print(" 暑假已经结束!新学期加油!")returnbar_width=30filled=int(bar_width*passed/total)iftotal>0else0empty=bar_width-fillediffilled>0:bar="["+"="*(filled-1)+">"+"."*empty+"]"else:bar="[>"+"."*(bar_width-1)+"]"print()print(" +----------------------------------------+")print(" | 暑 假 倒 计 时 |")print(" +----------------------------------------+")print()print(" "+bar)print()print(" 暑假:"+str(SUMMER_START)+" ~ "+str(SUMMER_END))print(" 已过:"+str(passed)+" 天 | 剩余:"+str(left)+" 天")print(" 进度:"+str(round(passed/total*100,1))+"% 已完成")print()# 一句励志语print(" [每日一句]")print(" "+random.choice(quotes))print()# ==================== 日历视图 ====================defshow_calendars():today=date.today()# 显示 6/7/8 三个月的日历formin[6,7,8]:print()print(" "+str(2026)+" 年 "+str(m)+" 月")print(" 一 二 三 四 五 六 日")cal=calendar.monthcalendar(2026,m)forweekincal:line=" "fordayinweek:ifday==0:line=line+" "elifday==today.dayandm==today.month:# 今天用方括号标记line=line+" ["+str(day).zfill(2)+"]"elif(m==6andday<SUMMER_START.day)or\(m==8andday>SUMMER_END.day):# 不在暑假范围内的日期用 · 标记line=line+" · "else:line=line+" "+str(day).zfill(2)+" "print(line)print()# ==================== 心情打卡 ====================defdaily_checkin():print()print(" ----- 今日打卡 -----")print(" 心情:1.开心 2.一般 3.疲惫 4.充实")mood_map={"1":"[开心]","2":"[一般]","3":"[疲惫]","4":"[充实]"}mood=mood_map.get(input(" > "),"[未记录]")note=input(" 今天做了什么?(一句话):")today_str=str(date.today())withopen("暑假心情日记.txt","a",encoding="utf-8")asf:f.write(today_str+" "+mood+" "+note+"\n")print(" 已记录!")defshow_mood_history():print()print(" ----- 心情日记 -----")try:withopen("暑假心情日记.txt","r",encoding="utf-8")asf:lines=f.readlines()iflen(lines)==0:print(" 还没有记录。")returnstart=max(0,len(lines)-10)foriinrange(start,len(lines)):print(" "+lines[i].rstrip())print()print(" (显示最近 "+str(len(lines)-start)+" 条)")exceptFileNotFoundError:print(" 还没有记录。从今天开始打卡吧!")# ==================== 主菜单 ====================defmain():print()print(" +----------------------------------------+")print(" | 暑 假 倒 计 时 日 历 |")print(" | Summer Countdown |")print(" +----------------------------------------+")whileTrue:print()print(" 1. 查看倒计时")print(" 2. 查看暑假日历")print(" 3. 每日心情打卡")print(" 4. 查看心情日记")print(" 0. 退出")print()choice=input(" 请选择:")ifchoice=="0":print()print(" 明天再来!暑假不等人,珍惜每一天。")breakelifchoice=="1":show_countdown()elifchoice=="2":show_calendars()elifchoice=="3":daily_checkin()elifchoice=="4":show_mood_history()else:print(" 输入有误~")main()7. 教学指南
分层教学路径
[全部学生] 版本一:3 行 date 运算 (8 min) ↓ [大部分学生] 版本二:进度条 = 字符串乘法 + 百分比 (15 min) ↓ [进阶学生] 版本三:日历 calendar.monthcalendar (15 min) ↓ [挑战学生] 版本四:心情打卡 + 文件读写整合 (20 min)课堂节奏(60 分钟)
| 时间 | 内容 | 形式 |
|---|---|---|
| 0~3 min | 运行完整版,展示倒计时 + 日历 | 演示 |
| 3~10 min | 版本一:date.today()+ 日期减法 | 学生跟打 |
| 10~25 min | 版本二:进度条——字符串乘法"="*n | 讲解 + 跟打 |
| 25~40 min | 版本三:日历——monthcalendar+ 方括号标记今天 | 讲解 + 学生独立 |
| 40~55 min | 版本四:每日一句 + 心情记录 | 学生独立 |
| 55~60 min | 互相展示 + “明天开始真的打卡” | 分享 |
核心概念强化
| 概念 | 在项目中的体现 | 一句话 |
|---|---|---|
| 日期是数据类型 | date.today() | “日期和数字一样——能存进变量、能做减法、能比较” |
| timedelta | .days | “两个日期相减,得到的是一个’时间差’对象” |
| 字符串乘法 | "=" * 30 | “一个字符乘以 N 次 = 重复 N 次,最简单的画图方式” |
| 嵌套列表 | monthcalendar | “日历 = 列表的列表。外层是周,内层是天” |
| 文件追加 | open("...", "a") | "a"模式不清空文件,每次追加一行 |
常见错误与引导
| 学生常犯的错 | 引导方式 |
|---|---|
日期减法忘记.days | summer_end - today返回的是timedelta(72),不是72。加.days才能拿到数字 |
进度条全是.或全是= | “查一下passed和total的值——可能是日期设定的问题,或者整数除法5/10 = 0。用5.0/10或先乘后除” |
monthcalendar返回的0导致打印出错 | “0表示’这天不属于这个月’,用if day == 0跳过即可” |
zfill(2)写在不对的地方 | “zfill是字符串的方法,str(5).zfill(2)正确,5.zfill(2)错误” |
文件模式"w"和"a"搞混 | “w= 每次覆盖重写,a= 追加在末尾。心情日记用a,否则每天覆盖前一天的” |
课外延伸
让学生把程序设置成开机自启动(Windows 的"启动"文件夹放一个快捷方式)。每天打开电脑第一眼就看到倒计时。这在技术上是简单的(创建一个
.bat文件),但带来的"仪式感"是巨大的。
Python 3.6+ 直接运行 | 无需第三方库 |datetime和calendar都是标准库
标签:#青少年编程#Python入门#倒计时#日历#datetime#少儿编程#教培#暑假
