从Scratch到Python 17 时间处理

我们用Scratch编程的时候经常会处理与时间有关的逻辑,比如控制游戏倒计时,计算程序运行时间,让克隆体间隔一定的时间再出现等,一般用到的指令包括下面这些:

 

 

除了【等待…秒】和【计时器归零】外,其它几个都是系统定义好的变量,用来直接获取时间数据的,使用非常方便。那么在Python中如何实现这些功能呢?我们需要用到标准库的time模块,它提供了一些与时间相关的函数,帮助我们进行以下操作:

  • 获取时间
  • 格式化时间
  • 暂停程序

一、获取时间

看下面的示例代码:

import time
wday_list = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期天']
# 获取时间戳
t1 = time.time()
# 将时间戳转换为格式化的时间
t2 = time.localtime(t1)
# 输出时间戳
print(t1)
# 从t2的属性中获取年、月、日、星期、时、分、秒等数据
print('今天是%i年%i月%i日星期%s'%(t2.tm_year,t2.tm_mon,t2.tm_mday,wday_list[t2.tm_wday]))
print('现在时间:%i时%i分%i秒'%(t2.tm_hour, t2.tm_min,t2.tm_sec))

这段代码中,我们先把time()函数的返回值保存到变量t1中,这个返回值是一个时间戳,时间戳是指从1970年1月1日0时0分0秒到你当前运行程序的时间经过的秒数。是不是有点像Scratch中的“计时器”这个变量?但不同的是,Scratch的计时器是从你打开Scratch开始的(除非你使用【重置计时器】,否则它会一直增加)。

由于time()返回的时间戳也是秒数,不容易阅读,所以我们又调用time模块的localtime()函数把t1中保存的时间戳转换成了一个格式化的时间t2,t2具有以下属性:

  • tm_year:年
  • tm_month:月
  • tm_mday:日
  • tm_wday:星期,0代表周一,向后依次递增
  • tm_hour:时
  • tm_min:分
  • tm_sec:秒

是不是基本上把Scratch中的那几个跟时间有关的变量都包含了?有了这几个属性,我们再用格式化输出了当前的日期和时间,需要注意的是,由于tm_wday中保存的是0-6的数字,不是星期几这样的字符串,输出时我们用了一个小转换,把它作为列表索引来找到我们定义好的列表中对应的星期几,这样更容易阅读。

程序运行效果如下:

 

 

注意,time.localtime()这个函数接收的是一个时间戳类型的参数,你也可以不传递任何参数,它会自动获取当前时间的时间戳并转换,相当于替你调用了time()函数。

二、格式化时间

上面的例子中我们获得了时间,自己调用格式化输出让时间更易阅读,其实time模块提供了现成的函数strftime(),它可以帮助我们很方便地把localtime()函数返回的时间按照指定格式转化为字符串,看这个例子:

import time

now = time.localtime()
t1 = time.strftime('现在时间是:%Y年%m月%d日 %H时%M分%S秒',now)
t2 = time.strftime('%Y-%m-%d %H:%M:%S')
print(t1)
print(t2)

程序运行效果:

 

这个例子中我们调用了两次time.strftime()函数,第一次传递了两个参数,分别是格式字符串和localtime()函数返回的结构化时间,第二个直接传递了一个格式字符串。你会发现它们输出的时间相同,只是格式不一样。也就是说,第二个参数是可以省略的,默认为当前的时间戳转换的结构化时间。

至于第一个参数,完全是根据我们的需要,像格式化输出一样,把各种变量组合成我们想要的格式,就像我们在t1和t2中组合的那样。到底支持哪些变量呢?参见下表:

格式字符 含义
%d 表示日期数,取值范围1-31
%H 表示24小时制的小时数,取值范围0-23
%I 表示12小时制的小时数,取值范围1-12
%j 表示一年中的第几天,取值范围1-366
%m 表示月份,取值范围1-12
%M 表示分钟,取值范围0-59
%p AM或PM,即上午或下午
%S 表示秒数,取值范围0-59
%w 表示星期数,取值范围0-6,注意!0为星期日
%W 表示一年中的第几周,取值范围0-53,周一作为一周第一天,在第一周周一之间的时间被认为在第0周
%y 两位年份数,取值范围00-99
%Y 四位年份数
%x 本地化的日期
%X 本地化的时间

这个表中有些项很常用,需要记忆,还要注意别写错大小写。

三、“暂停”程序

我们在Scratch中可以使用【等待x秒】暂停程序,time模块提供了sleep()函数可以起到类似的效果。它接收一个数字类型的参数,表示暂停的秒数。看下面这个例子就明白了:

import time

while True:
    print(time.strftime('%X'))
    time.sleep(1)

这段程序的作用是让程序每隔一秒输出一下当前时间(注意到我使用的“%X”参数了吗?),运行效果如下:

 

 

四、课后作业

本节我们主要学习了Python标准库中time模块的用法,包括获取时间戳、获取结构化时间、转换时间为格式化的字符串、暂停程序等。请你使用今天所学知识,完成一个番茄钟:

  • 程序运行时输入番茄名称
  • 程序倒计时25分钟后,打印出当前的日期、时间及提示信息,例如:现在是2022年9月5日9点10分,你的番茄钟【写英语作业】已经完成,恭喜你!

给TA赞助
共{{data.count}}人
人已赞助
综合资讯

从Scratch到Python 16 小游戏:逃离僵尸岛

2023-6-5 10:52:26

综合资讯

从Scratch到Python 18 数学计算

2023-6-6 11:26:57

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索