python 第44课 动动手0 求助
本帖最后由 屁哥 于 2018-7-13 11:21 编辑题目: 如果开始计时的时间是(2022年2月22日16:30:30),停止时间是(2025年1月23日15:30:30),那按照我们用停止时间减开始时间的计算方式就会出现负数,你应该对此做一些转换。
答案代码:
import time as t
class MyTimer:
def __init__(self):
self.unit = ['年', '月', '天', '小时', '分钟', '秒']
self.borrow =
self.prompt = '未开始计时!'
self.lasted = []
self.begin = 0
self.end = 0
def __str__(self):
return self.prompt
__repr__ = __str__
def __add__(self, other):
prompt = '总共运行了'
result = []
for index in range(6):
result.append(self.lasted + other.lasted)
if result:
prompt += (str(result) + self.unit)
return prompt
# 开始计时
def start(self):
self.begin = t.localtime()
self.prompt = '提示: 请先调用 stop() 停止计时'
return '计时开始'
# 停止计时
def stop(self):
if not self.begin:
print('提示: 请先调用 start() 进行计时!')
else:
self.end = t.localtime()
self._calc()
print('计时结束!')
# 内部方法 计算运行时间
def _calc(self):
self.lasted = []
self.prompt = '总共运行了'
for index in range(6):
temp = self.end - self.begin
# 位低不够减 需向高位借位
if temp < 0:
# 测试高位是否有得'借',没得借的话向再高位借.....
i = 1
while self.lasted < 1:
self.lasted += self.borrow - 1
self.lasted -= 1
i += 1
self.lasted.append(self.borrow + temp)
self.lasted -= 1
else:
self.lasted.append(temp)
# 由于高位随时会被借位,所以打印要放在最后
for index in range(6):
if self.lasted:
self.prompt += str(self.lasted) + self.unit
# 为下一轮计时初始化变量
self.begin = 0
self.end = 0
这里 循环部分 不太理解 求指教
def _calc(self):
self.lasted = []
self.prompt = '总共运行了'
for index in range(6):
temp = self.end - self.begin # 结束时间减去开始时间 赋值给 temp
# 位低不够减 需向高位借位
if temp < 0: # 如果结果小于0 就是出现了负数的时间,数学减法中的向前借位
# 测试高位是否有得'借',没得借的话向再高位借.....
i = 1 # 赋值1给变量 i
while self.lasted < 1: # 用循环 判断lasted 列表中的结果是否小于1 如果小于1 执行下面借位代码
# 上面这句有点不懂 self.lasted 这个列表中有值么? 什么时候添加进列表的? 现在这个列表时空的吧..
self.lasted += self.borrow - 1
# 这句 向上借位,比如天向月借位,月就加12-1(也不对啊,10月19日,减去9月20日,是前面的10月+(12-1)=21月)?
self.lasted -= 1 # 这里如果继续上面的逻辑下来,(21-2)月=19-10=9个月 ?
i += 1# 这里循环一圈 i + 1 是怎么回事?
self.lasted.append(self.borrow + temp) # 这就往列表里添加数值了,括号里有点懂又不懂...
self.lasted -= 1 # 对应索引值 减一 再减一 ? 没读下来 彻底懵了
else:
self.lasted.append(temp) # 这个好理解了,如果结果不小于1 直接添加列表里面了.
## 等等 小于1 ? 如果结果是 0 呢? 0也正常啊,10月-10月 正好是0 (31日 -31日 = 0日)上面循环为什么是小于1而不是小于0 ?
太笨了,注释代码 自己把自己整蒙了,求指点指点,我知道我不是这块料,但是我就是想学. 先谢谢了 楼主,话不多说,直接上图给你把,应该是很详细了 。
然后 再上一段注释的代码(for语句部分)
for index in range(6):# 注意看这里,是从年开始的哦,为什么? 请看下个注释
temp = self.end - self.begin # 当 index = 0 ,对应的是年哦
if temp < 0:
i = 1
while self.lasted < 1: # 测一下是不是能借给需要的低位
self.lasted += self.borrow - 1#他 -1
self.lasted -= 1 # 他的上一位 -1
i += 1 # 虽然他的上一位 -1了,但还是要测一下,他的上一位是不是真有数,如果有,那就跳过while了,进入下一环节咯
self.lasted.append(self.borrow + temp)
self.lasted -= 1
else:
self.lasted.append(temp)
r
如果解决了,给个最佳答案把{:5_109:}{:5_95:} cupbbboom 发表于 2018-7-12 13:10
如果解决了,给个最佳答案把
妥妥的我看看
我这人比较笨 哎....谢谢哦 本帖最后由 屁哥 于 2018-7-12 13:59 编辑
cupbbboom 发表于 2018-7-12 13:09
楼主,话不多说,直接上图给你把,应该是很详细了 。
然后 再上一段注释的代码(for语句部分)
是年减去年 不小于0temp >0直接执行 elseself.lasted.append 加进去了年 屁哥 发表于 2018-7-12 13:46
是年减去年 不小于0temp >0直接执行 elseself.lasted.append 加进去了年
temp < 0,那么不光是>0, =0时,也会直接执行self.lasted.append的,当然还其他的地方,你再想想? 回答的答案看不懂耶
cupbbboom 发表于 2018-7-12 13:09
楼主,话不多说,直接上图给你把,应该是很详细了 。
然后 再上一段注释的代码(for语句部分)
cupbbboom 的答案非常好啊,写的很详细了,支持下,谢谢你,我看懂了,9个币到现在都没有拿到,哈哈有点坑 shokunin 发表于 2019-6-9 15:47
回答的答案看不懂耶
额 cupbbboom 发表于 2018-7-12 13:10
如果解决了,给个最佳答案把
您写出来的解释我理解,并同意。但是有一个问题:如果需要借位时,i-1这一位是0,那就需要再向i-2先借位。假如i - 2这一位借位前是1,借位后变成了0。那么根据while循环,就需要再次进入(因为条件是<1),但事实上这一位由1变成0的话是不需要再次进入while循环的。也就是说这个代码存在错误。我表达的问题清楚吗? 答案代码确实有误,修改如下:
if temp < 0:
i = 1
while self.lasted < 1: # 测一下是不是能借给需要的低位
self.lasted += self.borrow - 1#他 -1
#### self.lasted -= 1 #这句不需要,因为上位的借位留给下一次循环解决
i += 1 # 虽然他的上一位 -1了,但还是要测一下,他的上一位是不是真有数,如果有,那就跳过while了,进入下一环节咯
self.lasted.append(self.borrow + temp)
self.lasted -= 1 #这句不对,应该是index-i,表示直到找到能借到的那一位,也就是循环跳出来的时候
else:
self.lasted.append(temp) 本帖最后由 Tigeroad 于 2020-5-25 11:46 编辑
boy007 发表于 2020-3-9 21:30
答案代码确实有误,修改如下:
是的!
不过你注释的“因为上位的借位留给下一次循环解决”,改成“下一步的lasted -= 1 解决”更好,因为跳出while循环之前,i += 1, 所以下一步lasted -= 1 是减去的更高一位的。
页:
[1]