鱼C论坛

 找回密码
 立即注册
查看: 1612|回复: 11

python 第44课 动动手0 求助

[复制链接]
发表于 2018-7-11 22:46:35 | 显示全部楼层 |阅读模式
9鱼币
本帖最后由 屁哥 于 2018-7-13 11:21 编辑

题目: 如果开始计时的时间是(2022年2月22日16:30:30),停止时间是(2025年1月23日15:30:30),那按照我们用停止时间减开始时间的计算方式就会出现负数,你应该对此做一些转换。
答案代码:
  1. import time as t

  2. class MyTimer:
  3.     def __init__(self):
  4.         self.unit = ['年', '月', '天', '小时', '分钟', '秒']
  5.         self.borrow = [0, 12, 31, 24, 60, 60]
  6.         self.prompt = '未开始计时!'
  7.         self.lasted = []
  8.         self.begin = 0
  9.         self.end = 0

  10.     def __str__(self):
  11.         return self.prompt

  12.     __repr__ = __str__

  13.     def __add__(self, other):
  14.         prompt = '总共运行了'
  15.         result = []
  16.         for index in range(6):
  17.             result.append(self.lasted[index] + other.lasted[index])
  18.             if result[index]:
  19.                 prompt += (str(result[index]) + self.unit[index])
  20.             return prompt
  21.     # 开始计时
  22.     def start(self):
  23.         self.begin = t.localtime()
  24.         self.prompt = '提示: 请先调用 stop() 停止计时'
  25.         return '计时开始'

  26.     # 停止计时
  27.     def stop(self):
  28.         if not self.begin:
  29.             print('提示: 请先调用 start() 进行计时!')
  30.         else:
  31.             self.end = t.localtime()
  32.             self._calc()
  33.             print('计时结束!')

  34.     # 内部方法 计算运行时间
  35.     def _calc(self):
  36.         self.lasted = []
  37.         self.prompt = '总共运行了'
  38.         for index in range(6):
  39.             temp = self.end[index] - self.begin[index]

  40.             # 位低不够减 需向高位借位
  41.             if temp < 0:
  42.                 # 测试高位是否有得'借',没得借的话向再高位借.....
  43.                 i = 1
  44.                 while self.lasted[index - i] < 1:
  45.                     self.lasted[index - i] += self.borrow[index - i] - 1
  46.                     self.lasted[index - i - 1] -= 1
  47.                     i += 1

  48.                 self.lasted.append(self.borrow[index] + temp)
  49.                 self.lasted[index-1] -= 1
  50.             else:
  51.                 self.lasted.append(temp)

  52.         # 由于高位随时会被借位,所以打印要放在最后
  53.         for index in range(6):
  54.             if self.lasted[index]:
  55.                 self.prompt += str(self.lasted[index]) + self.unit[index]

  56.         # 为下一轮计时初始化变量
  57.         self.begin = 0
  58.         self.end = 0
复制代码


这里 循环部分 不太理解 求指教
    def _calc(self):
        self.lasted = []
        self.prompt = '总共运行了'
        for index in range(6):
            temp = self.end[index] - self.begin[index] # 结束时间减去开始时间 赋值给 temp

            # 位低不够减 需向高位借位
            if temp < 0:        # 如果结果小于0 就是出现了负数的时间,数学减法中的向前借位
                # 测试高位是否有得'借',没得借的话向再高位借.....
                i = 1   # 赋值1给变量 i
                while self.lasted[index - i] < 1:   # 用循环 判断lasted 列表中的结果是否小于1 如果小于1 执行下面借位代码
                    # 上面这句有点不懂 self.lasted 这个列表中有值么? 什么时候添加进列表的? 现在这个列表时空的吧..
                    self.lasted[index - i] += self.borrow[index - i] - 1
                    # 这句[index- i] 向上借位,比如天向月借位,月就加12-1(也不对啊,10月19日,减去9月20日,是前面的10月+(12-1)=21月)?
                    self.lasted[index - i - 1] -= 1 # 这里如果继续上面的逻辑下来,(21-2)月=19-10=9个月 ?
                    i += 1  # 这里循环一圈 i + 1 是怎么回事?

                self.lasted.append(self.borrow[index] + temp)   # 这就往列表里添加数值了,括号里有点懂又不懂...
                self.lasted[index-1] -= 1   # 对应索引值 减一 再减一 ? 没读下来 彻底懵了
            else:
                self.lasted.append(temp)    # 这个好理解了,如果结果不小于1 直接添加列表里面了.
                ## 等等 小于1 ? 如果结果是 0 呢? 0也正常啊,10月-10月 正好是0 (31日 -31日 = 0日)  上面循环为什么是小于1而不是小于0 ?
太笨了,注释代码 自己把自己整蒙了,求指点指点,我知道我不是这块料,但是我就是想学. 先谢谢了

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-12 13:09:57 | 显示全部楼层
楼主,话不多说,直接上图给你把,应该是很详细了 。
然后 再上一段注释的代码  (for语句部分)
  1. for index in range(6):# 注意看这里,是从年开始的哦,为什么? 请看下个注释
  2.     temp = self.end[index] - self.begin[index] # 当 index = 0 ,对应的是年哦
  3.     if temp < 0:
  4.         i = 1
  5.         while self.lasted[index - i] < 1: # 测一下是不是能借给需要的低位
  6.             self.lasted[index - i] += self.borrow[index - i] - 1#他 -1
  7.             self.lasted[index - i - 1] -= 1 # 他的上一位 -1
  8.             i += 1 # 虽然他的上一位 -1了,但还是要测一下,他的上一位是不是真有数,如果有,那就跳过while了,进入下一环节咯
  9.         self.lasted.append(self.borrow[index] + temp)
  10.         self.lasted[index-1] -= 1
  11.     else:
  12.         self.lasted.append(temp)
复制代码


r
QQ图片20180712130713.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-12 13:10:54 | 显示全部楼层
如果解决了,给个最佳答案把
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-7-12 13:44:23 | 显示全部楼层
cupbbboom 发表于 2018-7-12 13:10
如果解决了,给个最佳答案把

妥妥的  我看看  
我这人比较笨 哎....  谢谢哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-7-12 13:46:42 | 显示全部楼层
本帖最后由 屁哥 于 2018-7-12 13:59 编辑
cupbbboom 发表于 2018-7-12 13:09
楼主,话不多说,直接上图给你把,应该是很详细了 。
然后 再上一段注释的代码  (for语句部分)


是年减去年 不小于0  temp >  0  直接执行 else  self.lasted.append 加进去了年
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-12 14:04:40 | 显示全部楼层
屁哥 发表于 2018-7-12 13:46
是年减去年 不小于0  temp >  0  直接执行 else  self.lasted.append 加进去了年


temp < 0,那么不光是>0, =0时,也会直接执行self.lasted.append的,当然还其他的地方,你再想想?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-6-9 15:47:37 | 显示全部楼层
回答的答案看不懂耶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

cupbbboom 的答案非常好啊,写的很详细了,支持下,谢谢你,我看懂了,9个币到现在都没有拿到,哈哈有点坑
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-6-25 17:43:13 | 显示全部楼层
shokunin 发表于 2019-6-9 15:47
回答的答案看不懂耶

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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循环的。也就是说这个代码存在错误。我表达的问题清楚吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-9 21:30:16 | 显示全部楼层
答案代码确实有误,修改如下:


   if temp < 0:
        i = 1
        while self.lasted[index - i] < 1: # 测一下是不是能借给需要的低位
            self.lasted[index - i] += self.borrow[index - i] - 1#他 -1
####           self.lasted[index - i - 1] -= 1 #这句不需要,因为上位的借位留给下一次循环解决
            i += 1 # 虽然他的上一位 -1了,但还是要测一下,他的上一位是不是真有数,如果有,那就跳过while了,进入下一环节咯
        self.lasted.append(self.borrow[index] + temp)
        self.lasted[index-i] -= 1        #这句不对,应该是index-i,表示直到找到能借到的那一位,也就是循环跳出来的时候
    else:
        self.lasted.append(temp)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-25 11:13:47 | 显示全部楼层
本帖最后由 Tigeroad 于 2020-5-25 11:46 编辑
boy007 发表于 2020-3-9 21:30
答案代码确实有误,修改如下:


是的!
不过你注释的“因为上位的借位留给下一次循环解决”,改成“下一步的lasted[index - i] -= 1 解决”更好,因为跳出while循环之前,i += 1, 所以下一步lasted[index - i] -= 1 是减去的更高一位的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 06:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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