青少年 Python 入门 | 每天打开看一看——「暑假倒计时日历」 每日一句适合人群Python 入门建议 4~8 年级掌握datetime/list/for后项目定位单课时60 分钟成品是一个每天都能用的倒计时工具核心大概念时间是一种数据类型——日期可以加减、可以比较、可以格式化和数字一样是一等公民目录为什么做倒计时版本一算天数——3 行代码出结果版本二进度条——把还剩多少天画出来版本三文字日历——这个月还剩几天版本四每日一句 完整工具完整代码教学指南1. 为什么做倒计时暑假有一个残酷的事实放假第一天觉得两个月很长。刷了半个月手机后突然发现——只剩 30 天了。倒计时的作用不是制造焦虑而是让时间变得可见。当学生每天打开程序看到还剩 45 天和一条励志语它是一种温柔的提醒。编程层面这个项目引入了一个重要的认知升级时间不是只能看的——代码可以算它、比它、格式化它。datetime模块让日期变得和数字一样可操作。2. 版本一算天数——3 行代码出结果fromdatetimeimportdate summer_enddate(2026,8,31)# 暑假结束日期假设 9 月 1 日开学todaydate.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_startdate(2026,6,20)# 暑假开始summer_enddate(2026,8,31)# 暑假结束todaydate.today()total_days(summer_end-summer_start).days# 暑假总天数passed_days(today-summer_start).days# 已经过去的天数left_days(summer_end-today).days# 剩余天数# 计算百分比percent_passedpassed_days/total_days*100percent_leftleft_days/total_days*100# 画进度条总长 30 格bar_width30passed_barint(bar_width*passed_days/total_days)left_barbar_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( 一 二 三 四 五 六 日)# 获取这个月的日历矩阵calcalendar.monthcalendar(year,month)forweekincal:line fordayinweek:ifday0:lineline # 这个月没有这天elifdaytoday.dayandmonthtoday.month:lineline [str(day).zfill(2)]# 今天是 [20]else:lineline 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 30calendar.monthcalendar()返回一个嵌套列表——每一行是一个星期每个元素是一天的日期0 表示不属于这个月。这是 Python 标准库自带的不需要安装任何东西。学生看到[20]被方括号括起来会有一种我的位置被标记了的感觉。这就是数据可视化最基础的形态——在正确的位置放正确的符号。5. 版本四每日一句 完整工具现在把所有功能整合起来倒计时进度条 日历 随机励志语再加上每日心情记录importrandomfromdatetimeimportdate# 励志语库quotes[今天翻的书就是明天数的钱。——不是是知识的重量。,暑假不学习开学徒伤悲。,每天进步一点点暑假结束你就是不一样的自己。,别人在刷手机你在刷题——差距就是这么拉开的。,每一个你羡慕的学霸暑假都在偷偷努力。,玩可以但别忘了今天的任务。,自律给我自由。——这句话是真的。,暑假不是用来荒废的是用来弯道超车的。,]defdaily_checkin():每日签到 心情记录print()print( ----- 今日打卡 -----)moods{1:[开心],2:[一般],3:[疲惫],4:[充实]}print( 今天的心情1.开心 2.一般 3.疲惫 4.充实)mood_choiceinput( )moodmoods.get(mood_choice,[未记录])noteinput( 今天做了什么一句话)# 追加到心情日记文件today_strstr(date.today())withopen(暑假心情日记.txt,a,encodingutf-8)asf:f.write(today_str mood note\n)print( 已记录)defshow_mood_history():显示历史心情print()print( ----- 心情日记 -----)try:withopen(暑假心情日记.txt,r,encodingutf-8)asf:linesf.readlines()iflen(lines)0:print( 还没有记录。)else:forlineinlines[-10:]:# 最近 10 条print( line.rstrip())print()print( 显示最近 str(min(10,len(lines))) 条)exceptFileNotFoundError:print( 还没有记录。)6. 完整代码点击展开完整代码可直接运行 暑假倒计时日历 每日一句 每天打开看看暑假还剩多少天 importcalendarimportrandomfromdatetimeimportdate# 配置 SUMMER_STARTdate(2026,6,20)# 你的暑假开始日SUMMER_ENDdate(2026,8,31)# 你的暑假结束日quotes[今天翻的书就是明天知识的重量。,暑假不学习开学徒伤悲。,每天进步一点点暑假结束你会感谢自己。,别人刷手机你刷题——差距这么来的。,每一个学霸的暑假都藏着悄悄的努力。,玩可以别忘了今天的任务。,自律给我自由。,暑假不是用来荒废的是用来弯道超车的。,种一棵树最好的时间是十年前其次是今天。,你今天的努力是明天选择的权利。,]# 倒计时视图 defshow_countdown():todaydate.today()total(SUMMER_END-SUMMER_START).days passed(today-SUMMER_START).days left(SUMMER_END-today).daysifleft0:print()print( 暑假已经结束新学期加油)returnbar_width30filledint(bar_width*passed/total)iftotal0else0emptybar_width-fillediffilled0: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():todaydate.today()# 显示 6/7/8 三个月的日历formin[6,7,8]:print()print( str(2026) 年 str(m) 月)print( 一 二 三 四 五 六 日)calcalendar.monthcalendar(2026,m)forweekincal:line fordayinweek:ifday0:lineline elifdaytoday.dayandmtoday.month:# 今天用方括号标记lineline [str(day).zfill(2)]elif(m6anddaySUMMER_START.day)or\(m8anddaySUMMER_END.day):# 不在暑假范围内的日期用 · 标记lineline · else:lineline str(day).zfill(2) print(line)print()# 心情打卡 defdaily_checkin():print()print( ----- 今日打卡 -----)print( 心情1.开心 2.一般 3.疲惫 4.充实)mood_map{1:[开心],2:[一般],3:[疲惫],4:[充实]}moodmood_map.get(input( ),[未记录])noteinput( 今天做了什么一句话)today_strstr(date.today())withopen(暑假心情日记.txt,a,encodingutf-8)asf:f.write(today_str mood note\n)print( 已记录)defshow_mood_history():print()print( ----- 心情日记 -----)try:withopen(暑假心情日记.txt,r,encodingutf-8)asf:linesf.readlines()iflen(lines)0:print( 还没有记录。)returnstartmax(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()choiceinput( 请选择)ifchoice0:print()print( 明天再来暑假不等人珍惜每一天。)breakelifchoice1:show_countdown()elifchoice2:show_calendars()elifchoice3:daily_checkin()elifchoice4: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模式不清空文件每次追加一行常见错误与引导学生常犯的错引导方式日期减法忘记.dayssummer_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#少儿编程#教培#暑假