编写以自定义对象为参数的函数,并返回自定义对象作为结果;
(一)时间
- 定义一个
Time
类
class Time:
"""Represents the time of day.
attributes: hour, minute, second
"""
- 创建一个
Time
对象:
time = Time()
time.hour = 11
time.minute = 59
time.second = 30
(二)函数的分类
- **纯函数:**一个纯函数并不修改作为参数传入的对象,只是返回一个值,也没有产生一个如显示一个值或者获得用户输入的影响;
- **修改器:**用函数修改作为参数传入的对象;
- 一般来说,使用纯函数实现的程序比修改器实现的函数开发更快、更不容易出错;
- 因此,一般情况下,推荐使用纯函数进行编程,只有在少数情况下使用修改器
(三)原型 VS 方案
原型和补丁(protptype and patch):这是一种开发方案,针对每一个函数,编写一个可以进行基本运算的原型,并进行测试,逐步修改错误;
- 这种增量修正在对于问题还没有深入理解的时候很是有效,但是这可能导致代码过度复杂,因为需要处理很多特殊情况;
设计开发(designeddevelopment):对问题有高层次的理解能够使得开发变得容易;
Time
对象本质上是一个基于六十进制的三位数;- 属性
second
是“个位”; - 属性
minute
是“六十位”; - 属性
hour
是“360位数”;
- 属性
def time_to_int(time):
minutes = time.hour * 60 + time.minute
seconds = minutes * 60 + time.second
return seconds
def int_to_time(seconds):
time = Time()
minutes, time.second = divmod(seconds, 60)
time.hour, time.minute = divmod(minutes, 60)
return time
def add_time(t1, t2):
seconds = time_to_int(t1) + time_to_int(t2)
return int_to_time(seconds)
(四)调试
如果 minute
和 second
的值介于 0 和 60 之间(包括 0 但不包括 60 ),并且 hour
是正值,那么这个 Time
对象就是合法的。hour
和 minute
应该是整数值, 但我们可能也允许 second
有小数部分;
这样的要求称之为不变式(invariants),因为它们总是为真,否则就是某些地方出错了;
- 编写函数来检查不变式能够哦帮助检查错误并找出出错的原因:
def valid_time(time):
if time.hour < 0 or time.minute < 0 or time.second < 0:
return False
if time.minute >= 60 or time.second >= 60:
return False
return True
- 可以在每个函数的开头检查参数:
def add_time(t1, t2):
if not valid_time(t1) or not valid_time(t2):
raise ValueError('invalid Time object in add_time')
seconds = time_to_int(t1) + time_to_int(t2)
return int_to_time(seconds)
- 也可以使用**assert语句:**在检查并失败的情况下抛出异常:
def add_time(t1, t2):
assert valid_time(t1) and valid_time(t2)
seconds = time_to_int(t1) + time_to_int(t2)
return int_to_time(seconds)
assert
语句非常有用,因为它们区分了处理普通条件的代码和检查错误的代码。