本文概要:解决了超级秒表这个题目并对自己在题目中遇到的难点作出了适当分析。主要解决的问题点在于时间相减以及判断输入为回车
题目是:
项目:超级秒表
假设要记录在没有自动化的枯燥任务上花了多少时间。你没有物理秒表,要为
笔记本或智能手机找到一个免费的秒表应用,没有广告,且不会将你的浏览历史发
送给市场营销人员,又出乎意料地困难(在你同意的许可协议中,它说它可以这样做。
你确实阅读了许可协议,不是吗?)。你可以自己用 Python 写一个简单的秒表程序。
总的来说,你的程序需要完成:
记录从按下回车键开始,每次按键的时间,每次按键都是一个新的“单圈”。
打印圈数、总时间和单圈时间。
这意味着代码将需要完成以下任务:
在程序开始时,通过调用 time.time()得到当前时间,将它保存为一个时间戳。
在每个单圈开始时也一样。
记录圈数,每次用户按下回车键时加 1。
用时间戳相减,得到计算流逝的时间。
处理 KeyboardInterrupt 异常,这样用户可以按 Ctrl-C 退出。
打开一个新的文件编辑器窗口,并保存为 stopwatch.py。
运行结果如下:
解决代码:
# 超级秒表
import time
import sys
import logging
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s-%(levelname)s-%(message)s") # 这个是对logging日志模块的设置,如果你不设,你打印不出来东西
def super_clock():
time_interval = [] # 这个作为最终结果列表,比如第一次他保存了几点几秒
time_list = [] # 这个是普通列表,来保存time.time()的值
while True:
try:
key_value = input(">>") # 这个>>就很细节,让你输入觉得很舒服
if key_value != "": # 这个啊,让我想了好久。我一直在查到底什么字符算是回车,结果百度没有一个让我觉得还过得去的答案。最后我想通了,既然程序将你的回车判断为一次输出的结束,那么很显然你下次字符判断为空字符串就行了,这就意味着你输入的是回车
logging.debug(key_value)
logging.debug("you got continue")
continue
except KeyboardInterrupt: # 这个去捕获下ctrl+c异常
print("ctrl + c happend")
logging.debug(time_list)
logging.debug(len(time_list) - 1)
# 这个是把普通列表中的值一一相减,然后得到最终结果列表的值,直接告诉用户,第一次几秒,第二次几秒
for i in range(len(time_list) - 1):
logging.debug("i = " + str(i))
value = (float(time_list[i + 1]) - float(time_list[i])) # 这个我也想了挺久了。。。可能是我菜吧。你只需要知道time_list[i]是string类型的,那么你就用float转换为浮点型的就好了
logging.debug("time - == " + str(value))
time_interval.append(value) # 这里直接就是将结果保存到结果列表
logging.debug("time_interval = " + str(time_interval))
for i in range(len(time_interval)): # 最后打印
print("第", str(i + 1), "次计时为", time_interval[i])
sys.exit()
else: # 在try catch语句块中,这个else代表的是try成功执行就执行这个else的内容。这里的话,就是利用time.time()来捕捉到你摁回车的时间,并存储到普通列表去
logging.debug(29)
logging.debug(str(time.time()))
time_list.append(str(time.time()))
logging.debug(32)
super_clock()
补充:后来我还查了下关于时间控制的其他方法:
比如
# 测试时间模块
import time
import datetime
# 这个是用到了datetime模块,用的函数比较多,其实也差不多
a = datetime.datetime.now()
print(a)
time.sleep(1)
b = datetime.datetime.now()
c = int(b.timestamp() - a.timestamp())
print(c)
# 这个的话依然是用time.time(),其实两个time是可以相减的,拿到差值,最后强转就好了。我之前是一直拿字符串去转,所以没成功
value1 = time.time()
time.sleep(1)
value2 = time.time()
value3 = value2 - value1
print("value3 = " + str(int(value3)))
本文总结:时间相减其实很简单,目的就是拿到差值,你可以让相同类型的相减(比如time类型的)然后用str()或者float()函数去强转;你也可以使用datetime模块的那两个方法去转;最后本文对“如何判断输入为空格”这个问题提出了脸滚键盘式的解决方案
最后让我啰嗦一句,别动不动就转发别人的博客,转发了也不是你的东西。我以前看见值得学的东西就收藏想着以后看,搞到最后就是啥都没看,最后全部推翻删掉。
还有就是,我下午查资料的时候,问一个问题,回答前三的明明都是同样的答案,这也能占前三???配吗?自己不去证实,把别人答案抄过来在另外一个平台上发布就把自己访问量刷上去了,真的很恶心。