当前位置: 首页 > news >正文

青少年 Python 入门 | 每天打开看一看——「暑假倒计时日历」+ 每日一句

青少年 Python 入门 | 每天打开看一看——「暑假倒计时日历」+ 每日一句

适合人群:Python 入门(建议 4~8 年级),掌握datetime/list/for
项目定位:单课时(60 分钟),成品是一个每天都能用的倒计时工具
核心大概念时间是一种数据类型——日期可以加减、可以比较、可以格式化,和数字一样是"一等公民"


目录

  1. 为什么做倒计时
  2. 版本一:算天数——3 行代码出结果
  3. 版本二:进度条——把"还剩多少天"画出来
  4. 版本三:文字日历——这个月还剩几天
  5. 版本四:每日一句 + 完整工具
  6. 完整代码
  7. 教学指南

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"模式不清空文件,每次追加一行

常见错误与引导

学生常犯的错引导方式
日期减法忘记.dayssummer_end - today返回的是timedelta(72),不是72。加.days才能拿到数字
进度条全是.或全是=“查一下passedtotal的值——可能是日期设定的问题,或者整数除法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+ 直接运行 | 无需第三方库 |datetimecalendar都是标准库

标签#青少年编程#Python入门#倒计时#日历#datetime#少儿编程#教培#暑假

http://www.jsqmd.com/news/1132488/

相关文章:

  • 如何在浏览器中实现实时人体姿态搜索:完整指南与实战应用
  • Floyd算法的一点讨论
  • 基于multisim的音响放大系统设计20Hz-20KHz
  • 上千本绝版中医医学类书籍大合集高清pdf
  • 【Bug已解决】Codex Desktop 报错 Computer Use 插件不可用的解决方案
  • Android存储清理终极指南:如何用SD Maid 2/SE让手机重获新生
  • 如何快速搭建免费高品质音乐库:洛雪音乐音源完全配置指南
  • 【git教程】科研技能必备——git的使用
  • 2026实战|RPA工程师真相 + 0基础入行 + 攻略(含超级自动化 + AI+RPA),看完直接落地
  • NHibernate实现延迟加载的主要结构:
  • 湿地生态好不好,不能只看绿不绿
  • 依赖注入与对象间关系
  • MLS点云道路标线自动化提取:基于PCL与OpenCV实现95%+准确率(附代码)
  • 【学习记录】Week14(二):沙箱机制深度剖析与进阶 ORW 绕过体系
  • 从零学习Kafka:调优
  • # TDengine TMQ 最佳实践 — 可靠消费、容错与监控
  • Node.js-Phase 1 学习总结:CLI 文件管理系统
  • 3分钟极速指南:用Python工具一键获取国家中小学智慧教育平台电子课本
  • 一个独立开发者的审计日志平台
  • Linux 系统中定位与设置 JAVA_HOME 目录
  • MNIST 数据集 3 种主流框架加载对比:PyTorch vs TensorFlow vs Hugging Face Datasets
  • Educator头歌答案分享:数据预处理与特征工程在线实验闯关
  • Pot Desktop:5大核心功能解密,3分钟掌握跨平台翻译神器
  • Java面试突击指南!1个月拿下Java高级开发岗!AI大模型简历必备/面试必备!
  • Agentic RAG 方案深度解析:从概念到落地
  • 如何在Linux上流畅运行Windows游戏:DXVK终极配置指南
  • Fastboot Enhance:Windows平台一站式Android刷机工具箱,告别命令行复杂操作
  • Markdown锚点跳转失败的解决办法
  • Jetson Nano Super + Ubuntu 22.04 + ROS2 Humble:MID-360、FAST-LIO 与 EGO-Planner 实时建图部署记录
  • pytest-xdist分布式测试:加速APP自动化测试的架构与实战