屁哥 发表于 2018-7-11 22:46:35

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 ?
太笨了,注释代码 自己把自己整蒙了,求指点指点,我知道我不是这块料,但是我就是想学. 先谢谢了

cupbbboom 发表于 2018-7-12 13:09:57

楼主,话不多说,直接上图给你把,应该是很详细了 。
然后 再上一段注释的代码(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

cupbbboom 发表于 2018-7-12 13:10:54

如果解决了,给个最佳答案把{:5_109:}{:5_95:}

屁哥 发表于 2018-7-12 13:44:23

cupbbboom 发表于 2018-7-12 13:10
如果解决了,给个最佳答案把

妥妥的我看看
我这人比较笨 哎....谢谢哦

屁哥 发表于 2018-7-12 13:46:42

本帖最后由 屁哥 于 2018-7-12 13:59 编辑

cupbbboom 发表于 2018-7-12 13:09
楼主,话不多说,直接上图给你把,应该是很详细了 。
然后 再上一段注释的代码(for语句部分)



是年减去年 不小于0temp >0直接执行 elseself.lasted.append 加进去了年

cupbbboom 发表于 2018-7-12 14:04:40

屁哥 发表于 2018-7-12 13:46
是年减去年 不小于0temp >0直接执行 elseself.lasted.append 加进去了年

temp < 0,那么不光是>0, =0时,也会直接执行self.lasted.append的,当然还其他的地方,你再想想?

shokunin 发表于 2019-6-9 15:47:37

回答的答案看不懂耶

阳顺 发表于 2019-6-16 11:13:49

cupbbboom 发表于 2018-7-12 13:09
楼主,话不多说,直接上图给你把,应该是很详细了 。
然后 再上一段注释的代码(for语句部分)



cupbbboom 的答案非常好啊,写的很详细了,支持下,谢谢你,我看懂了,9个币到现在都没有拿到,哈哈有点坑

屁哥 发表于 2019-6-25 17:43:13

shokunin 发表于 2019-6-9 15:47
回答的答案看不懂耶

jiajiaself 发表于 2020-2-19 17:08:31

cupbbboom 发表于 2018-7-12 13:10
如果解决了,给个最佳答案把

您写出来的解释我理解,并同意。但是有一个问题:如果需要借位时,i-1这一位是0,那就需要再向i-2先借位。假如i - 2这一位借位前是1,借位后变成了0。那么根据while循环,就需要再次进入(因为条件是<1),但事实上这一位由1变成0的话是不需要再次进入while循环的。也就是说这个代码存在错误。我表达的问题清楚吗?

boy007 发表于 2020-3-9 21:30:16

答案代码确实有误,修改如下:


   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:13:47

本帖最后由 Tigeroad 于 2020-5-25 11:46 编辑

boy007 发表于 2020-3-9 21:30
答案代码确实有误,修改如下:




是的!
不过你注释的“因为上位的借位留给下一次循环解决”,改成“下一步的lasted -= 1 解决”更好,因为跳出while循环之前,i += 1, 所以下一步lasted -= 1 是减去的更高一位的。
页: [1]
查看完整版本: python 第44课 动动手0 求助