有时候把一个问题变得更难(或者更一般)反而更容易(因为特例会更少,出错的机会也会更少)。1、编写一个print_time函数,接收一个时间对象作为形参,并以“时:分:秒”的格式打印出来。为了演示这个问题,需要先把时间对象写出来,先定义一个类,然后实例化生成一个时间对象classTime(object):'''代表一天中的时间。attributes:hour,minute,second'''time=Time()time.hour=1time.minute=9time.second=30这个比较简单,但是为了打印出来漂亮,还需要做一些处理在渲染结果上,格式运算符'%.2d'可以打印一个至少包含两个字符的整数,必要时以0def为前缀print_time(t):h='%.2d'%t.hourm='%.2d'%t.minutes='%.2d'%t.secondreturnh+':'+m+':'+s#print(h+':'+m+':'+s)print_time(time)本来,我是用print来打印的,但是后面的练习需要这个函数输出值,所以改成后面返回。这一点其实已经出现过好几次了。一定要记住打印出来后type类型是Nonetype。当你需要使用该值时,将其更改为返回。注意两者的区别。2、写一个布尔函数is_after,接收两个时间对象t1和t2,如果t1在t2之后返回True,否则返回False。这次我做了一个挑战,就是不带if语句。让我想起以前的一个例子,就是用一个运算符来代替if语句的判断,所以我最初的代码是这样time2=Time()#因为需要两个参数进行比较,所以新建一个对象time2。hour=2time2.minute=23time2.second=1defis_after(t1,t2):returnt1>t2is_after(time,time2)--------------------------------------------------------------------------TypeErrorTraceback(最近调用最后)in6defis_after(t1,t2):7returnt1>t2---->8is_after(time,time<2)9ipython-input-8-20b0e959ab71>inis_after(t1,t2)5time2.second=16defis_after(t1,t2):---->7returnt1>t28is_after(time,time2)9TypeError:'>'notsupportedbetween'Time'and'Time'instances,butanerrorreported,indicatingtheoperation'>'isnotsupportedbetweenclasses.我觉得可以用前者减去后者大于0来代替:time2=Time()time2.hour=2time2.minute=23time2.second=1defis_after(t1,t2):returnt1-t2>0is_after(time,time2)--------------------------------------------------------------------------TypeErrorTraceback(mostrecentcalllast)in6defis_after(t1,t2):7returnt1-t2>0---->8is_after(9time,time2)inis_after(t1,t2)5time2.second=16defis_after(t1,t2):---->7returnt1-t2>08is_after(time,time2)9TypeError:unsupportedoperandtype(s)for-:'Time'and'Time'显然我没有抓住错误的重点,重点是类Time,我比较了两个类的对象发现比较错误现在,应该比较的是上一个练习中返回的时间,因此将代码更改为以下内容:time2=Time()time2.hour=2time2.minute=23time2.second=1defis_after(t1,t2):returnprint_time(t1)>print_time(t2)#如果前者大于后者则返回True,否则返回False,可以代替判断语句is_after(time,time2)今天求的时候两次之间的间隔,我们先用借减再按位计算,后来发现如果先将时间对象转为整数,则求差或求和再转为时间会更容易。首先写两个函数,一个是将时间转换为整数秒,一个是将Convert秒转换为时间。deftime_to_int(time):minutes=time.hour*60+time.minuteseconds=minutes*60+time.second返回秒defint_to_time(seconds):time=Time()minutes,time.second=divmod(seconds,60)#divmod函数将第一个参数除以第二个参数,并以元组形式返回商和余数time.hour,time.minute=divmod(minutes,60)returntime写完我们需要做一个简单的测试,测试正确的time_to_int(int_to_time(100))==100以上两个函数的返回值为True,证明以上函数是正确的。求和时,可以简单地写成:defadd_time(t1,t2):seconds=time_to_int(t1)+time_to_int(t2)returnint_to_time(seconds)有更少的特殊情况和更少的错误机会)。调试建议:调试的时候学习一个新的概念,当分秒的值在0到60之间(包括0但不包括60)时不变的事件对象是合法的,并且小时是正值,这些需求被称为不变量,因为它们应该永远是真的。这给了我们调试的方向。编写代码来检查不变量可以帮助您检测错误并找到其根本原因,例如以下defvalid_time(time):iftime.hour<0ortime.minute<0ortime.second<0:returnFalseiftime.minute>=60ortime.second>=60:returnFalsereturnTrue先写一个通过不变量的函数,然后在每个函数的开头通过不变量检查函数,确保它们是有效的。在每个函数的开头接收,你可以检查参数以确保它们是有效的)seconds=time_to_int(t1)+time_to_int(t2)返回int_to_time(seconds)