鱼C论坛

 找回密码
 立即注册
查看: 3788|回复: 6

[技术交流] Python44 课后题的第0题的代码修改

[复制链接]
发表于 2017-12-7 16:25:21 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 payton24 于 2017-12-7 16:31 编辑

做课后题44,也是折腾了一下,发现甲鱼老师的代码好像有点问题,修改了一下。
主要是_calc模块的时间处理逻辑有问题,附上测试代码。
正常运行时可以去掉print()以及begin、end的初始值,欢迎探讨,看看还有没有缺漏的地方。



  1. ##定制一个计时器的类
  2. ##start和stop代表启动计时和停止计时
  3. ##t1=MyTimer()
  4. ##t1.start()
  5. ##t1.stop()
  6. ##t1和t2是计时器对象,直接调用t1或print(t1)均可显示结果。
  7. ##当计时器未启动或者已经停止计时,调用stop方法给予温馨提示
  8. ##      t1:未开始计时!
  9. ####    t1.stop '提示:请先调用start()开始计时'
  10. ##      t1.start()  '计时开始'
  11. ##        t1.stop ()  '计时结束'
  12. ##        t1   '总共运行了5秒'
  13. ##       t1+t2 总共运行了8秒
  14. ##两个计时器对象可以进行相加:例如t1=5,t2=3,则t1+t2=8
  15. ##只能使用有限资源完成。
  16. ##使用time的localtime方法获取时间
  17. ## time.localtime返回时间元组(struct_time)
  18. ##表现你的类 __str__ 和 __repr__

  19. import time as t

  20. class MyTimer():
  21.     def __init__(self):
  22.         self.unit = ['年','月','日','小时','分钟','秒']
  23.         self.borrow = [0,12,31,24,60,60]   #用于调整负数值的显示。
  24.         self.prompt = '未开始计时!'
  25.         self.lasted = []
  26.         self.begin = 0
  27.         self.end = 0

  28. ##        self.startmark = 0
  29.         
  30.     def __str__(self):
  31.         return self.prompt    #使用魔法方法代替打印,调用print(t1)时显示self.prompt的内容。
  32.     __repr__ = __str__        #将打印的内容赋值到__repr__,调用t1时显示结果。

  33.     def __add__(self,other):    ##显示t1+t2的结果。
  34.         prompt = "总共运行了"   #这是个局部变量,与self.prompt不同
  35.         result = []
  36.         for index in range(6):
  37.             result.append(self.lasted[index]+other.lasted[index])
  38.             if result[index]:  #result不为0时才输出,可省略例如0天0小时等无用字符。
  39.                 prompt +=(str(result[index])+self.unit[index])
  40.         return prompt
  41.         
  42.    
  43.     ##开始计时
  44.     def start(self):
  45. ##        self.startmark =1
  46. ##        self.begin = t.localtime()
  47.         self.begin = (2017, 11, 22, 14, 0, 47)   ##调试结果用

  48.         self.prompt ='提示:请先调用stop()停止计时'  
  49. #如果没有执行t1.stop()语句马上调用t1,则self.prompt的内容发生变化,并显示提示语句。
  50.         print("计时开始...")

  51.     ##停止计时
  52.     def stop(self):
  53. ##        if self.startmark == 0:    #设置self.startmark进行提示
  54.         if not self.begin:        
  55.             print('提示:请先调用start()开始计时')
  56.         else:
  57. ##            self.end = t.localtime()
  58.             self.end = (2017, 11, 22, 15, 0, 41)     ##调试结果用
  59.             self._calc()
  60.             print("计时结束!")

  61.     ##内部方法,计算运行时间
  62.     def _calc(self):
  63.         self.lasted = []            ##存放最终计算结果。
  64.         self.prompt = "总共运行了"
  65.         for index in range(6):
  66.             temp=self.end[index]-self.begin[index]
  67.             print('Temp值:{}'.format(temp))  #调试用
  68.             if temp <0:   #低位不够减,向高位借
  69.                 self.lasted.append(self.borrow[index] + temp)  ##当前位加借位值
  70.                 print('last1进来了:{}'.format(self.lasted))
  71.                 self.lasted[index-1] -=1                        ##高位减一
  72.                 print('last2进来了:{}'.format(self.lasted))               
  73. ################################################################################################################
  74.                 i=1
  75.                 while self.lasted[index-i]<0: ##self.lasted[index-i]当前高一位的值,假设小于1,则没得'借',再向高一位借。
  76.                     self.lasted[index-i] += self.borrow[index-i]  #self.borrow[index-i]为高位借值列表。
  77.                                                                                    #自己先向高位借对应的数再借给低一位。
  78.                     self.lasted[index-i-1] -=1  ##高二位自动减1。
  79.                     i +=1  ##循环判断比自己高位的执行情况
  80.                     print('while我进来了!{}'.format(self.lasted))  ##调试用
  81. ################################################################################################################
  82.             else:
  83.                 self.lasted.append(temp)  ##存放结果

  84. ##由于高位随时会借位,等self.lasted存放完最终结果后再依次调用。
  85.         for index in range(6):            
  86. ##            self.lasted.append(self.end[index]-self.begin[index]) ##计算相减结果,放入列表。引入借数后取消这一行
  87.             if self.lasted[index]:  ##self.lasted[index]不为0时,才执行下面语句进行赋值
  88.                 self.prompt +=(str(self.lasted[index])+self.unit[index]) #把self.lasted的值加入进来。
  89.         
  90. ##        print(self.prompt) #使用魔法方法代替打印      
  91.         ##为下一轮计时初始化变量
  92.         self.begin = 0
  93.         self.end = 0
  94.                
  95. t1 = MyTimer()
  96. t2 = MyTimer()
  97. t1.start()
  98. t1.stop()
  99. ##t2.start()
  100. ##t2.stop()
  101. ##t1
  102. ##t2
  103. ##t1+t2
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-7 15:41:19 | 显示全部楼层
我也发现了...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-11 12:16:47 | 显示全部楼层
我草,天才程序员,这么好的帖子居然没人顶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-11 17:33:05 | 显示全部楼层
最后的__add__的加法模块跟着楼主的程序学习,改了好半天才改好,唉,基础还是不太扎实啊!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-7 23:31:05 | 显示全部楼层
楼主这个calc函数设计得太好了一看就懂了谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-8 22:44:40 | 显示全部楼层
我也发现了,艹!!!!,浪费了我很长时间!!还以为自己理解错了!!就是它自己有问题!!!!!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-29 17:49:46 | 显示全部楼层
楼主代码修改得好!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 00:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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