《数据结构与算法(Python语言描述)》第二章练习——Time

创建一个Time类

有两种实现方式:

  1. 用三个参数hours/minutes/seconds
  2. 用一个seconds创建Time

注意:书上要求的是在内部的参数实现上有两种方式,就是说必须用三个参数创建,但内部可以自由表示;这里我直接用一个seconds参数表示了,需要的话,改动一下__init__方法就OK。

方式1:

  • 构建Time时,要对参数进行检测,不是很方便。
  • 操作时有点麻烦,需要考虑按参数相减后,可能出现负值的情况:
    例如hours位出现负值,就要把hours/minutes/seconds统统置零;
    以此类推,要写出三个if语句来支持减操作

方式2:

  • 创建需要从seconds分割出其他参数,但参数检查方便。
  • 对于减操作来说,可以采取用seconds参数相减,然后重新构造其他参数,只需要判断一下两数的差是否为负值就可以了。

综合来看,方式2更好一些,下面采取方式2:

class TimeValueError(ValueError):
    pass

class Time:
    def __init__(seconds):
        if isinstance(seconds, int) or isinstance(seconds, str):
            self._oldseconds = int(seconds) # 保留原始的seconds参数
            self._hours, self._minutes, self._seconds = self.create(self._oldseconds) # 将构建其他参数的过程单独封装

        else:
            # 让Time类只支持str或者int形式的数字
            raise TimeValueError("Time only support `int` or `str`:{}".format(seconds))

    def create(self, oldseconds):
        s = oldseconds
        ParameterList = []
        dividendList = [3600, 60, 1] # 将一小时、一分钟等换算成秒
        for dividend in dividendList:
            quotients, remainders = divmod(s, dividend) # divmod函数是内置函数,返回(商,余数)
            ParameterList.append(quotients)
            s = remainders
        return ParameterList

    def SecondRepresentation(self): # 返回时间的秒钟表示
        return self._oldseconds

    def __str__(self):
        return str(self._hours) + ":" + str(self._minutes) + ":" + str(self._seconds)

    def __lt__(self, other):
        # 比较函数有两种方法,可以比较self._oldseconds
        # 也可以比较两者字符串形式大小
        return str(self) < str(other)

    def __add__(self, other):
        self._hours, self._minutes, self._seconds = create(self.SecondRepresentation() + other.SecondRepresentation())

    def __sub__(self, other):
        self._hours, self._minutes, self._seconds = create(self.SecondRepresentation() - other.SecondRepresentation())

其他简单的方法就略过了,以下是简单的测试:

def testTime():
    t1 = Time(85131) # 23:38:51
    t2 = Time("83783") # 23:16:23
    print("Time1 is : {}".format(str(t1)))
    print("Time2 is : {}\n".format(str(t2)))
    print("Time1 < Time2 (True or False) : {}".format(t1 < t2))
    print("Time1 > Time2 (True or False) : {}\n".format(t1 > t2))
    print("Time hours:\n\tTime1:{0}\n\tTime2:{1}\n".format(
        t1.hours(), t2.hours()
    ))
    print("Time minutes:\n\tTime1:{0}\n\tTime2:{1}\n".format(
        t1.minutes(), t2.minutes()
    ))
    print("Time seconds:\n\tTime1:{0}\n\tTime2:{1}\n".format(
        t1.seconds(), t2.seconds()
    ))
    t1 + t2
    print("Time1 + Time2 : {}".format(str(t1)))
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值