鱼C论坛

 找回密码
 立即注册
查看: 110|回复: 1

[已解决]python timer程序分析

[复制链接]
发表于 2024-10-16 21:30:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Hi,有如下一段timer代码:

import time as t

class MyTimer():
    def __str__(self):
        return self.prompt

    __repr__ = __str__
   
    #开始计时
    def start(self):
        self.start = t.localtime()
        print('开始计时.....')
    #计时结束
    def stop(self):
        self.stop = t.localtime()
        self._calc()
        print('计时结束!')


    #内部方法,计算运行时间
    def _calc(self):
        self.lasted = []
        self.prompt = '总共运行了'
        for i in range(6):
            self.lasted.append(self.stop[i]-self.start[i])
            self.prompt +=str(self.lasted[i])
        #print(self.prompt)

当执行如下:
>>t1 = MyTimer()
>>t1.start()
>>开始计时.....
>>t1.stop()
>>计时结束!
>>t1
>>总共运行了00001-44

问题: 这里有从调用t1.start()到t1.stop()  间隔等的时间有点长, 大概一分钟不到吧, 然后调用t1,为何结果输出是这样的”总共运行了00001-44“  ?这里的怎么会显示 ”00001-44“ 这样无法看懂的数字?
最佳答案
2024-10-16 21:31:08
这段代码的问题主要出在 `_calc` 方法中。让我们分析一下:

1. **`self.lasted` 未初始化**:在 `_calc` 方法中,`self.lasted` 应该是一个列表,但在使用 `append` 方法之前并没有初始化。

2. **时间差计算错误**:`self.stop - self.start` 直接相减是不对的,因为 `t.localtime()` 返回的是一个 `struct_time` 对象,不能直接相减。

3. **字符串拼接问题**:`self.prompt += str(self.lasted)` 这样拼接会导致输出不符合预期。

要修复这些问题,可以这样修改 `_calc` 方法:
def _calc(self):
    self.lasted = []
    self.prompt = '总共运行了'
    for i in range(6):
        self.lasted.append(self.stop[i] - self.start[i])
        self.prompt += str(self.lasted[i]) + ' '

此外,建议在 `start` 和 `stop` 方法中使用 `time.time()` 来获取时间戳,然后计算时间差,这样更简单和准确。以下是一个改进的版本:
import time as t

class MyTimer():
    def __init__(self):
        self.prompt = "未开始计时"
        self.lasted = []
        self.start_time = 0
        self.stop_time = 0

    def __str__(self):
        return self.prompt

    __repr__ = __str__

    def start(self):
        self.start_time = t.time()
        print('开始计时.....')

    def stop(self):
        self.stop_time = t.time()
        self._calc()
        print('计时结束!')

    def _calc(self):
        self.lasted = self.stop_time - self.start_time
        self.prompt = f'总共运行了 {self.lasted:.2f} 秒'

这样修改后,`t1.start()` 和 `t1.stop()` 之间的时间差会以秒为单位显示,并且输出会更符合预期。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-10-16 21:31:08 | 显示全部楼层    本楼为最佳答案   
这段代码的问题主要出在 `_calc` 方法中。让我们分析一下:

1. **`self.lasted` 未初始化**:在 `_calc` 方法中,`self.lasted` 应该是一个列表,但在使用 `append` 方法之前并没有初始化。

2. **时间差计算错误**:`self.stop - self.start` 直接相减是不对的,因为 `t.localtime()` 返回的是一个 `struct_time` 对象,不能直接相减。

3. **字符串拼接问题**:`self.prompt += str(self.lasted)` 这样拼接会导致输出不符合预期。

要修复这些问题,可以这样修改 `_calc` 方法:
def _calc(self):
    self.lasted = []
    self.prompt = '总共运行了'
    for i in range(6):
        self.lasted.append(self.stop[i] - self.start[i])
        self.prompt += str(self.lasted[i]) + ' '

此外,建议在 `start` 和 `stop` 方法中使用 `time.time()` 来获取时间戳,然后计算时间差,这样更简单和准确。以下是一个改进的版本:
import time as t

class MyTimer():
    def __init__(self):
        self.prompt = "未开始计时"
        self.lasted = []
        self.start_time = 0
        self.stop_time = 0

    def __str__(self):
        return self.prompt

    __repr__ = __str__

    def start(self):
        self.start_time = t.time()
        print('开始计时.....')

    def stop(self):
        self.stop_time = t.time()
        self._calc()
        print('计时结束!')

    def _calc(self):
        self.lasted = self.stop_time - self.start_time
        self.prompt = f'总共运行了 {self.lasted:.2f} 秒'

这样修改后,`t1.start()` 和 `t1.stop()` 之间的时间差会以秒为单位显示,并且输出会更符合预期。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 17:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表