【Think Python】Python笔记(十六)类和函数

编写以自定义对象为参数的函数,并返回自定义对象作为结果;

(一)时间

  • 定义一个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)

(四)调试

如果 minutesecond 的值介于 0 和 60 之间(包括 0 但不包括 60 ),并且 hour 是正值,那么这个 Time 对象就是合法的。hourminute 应该是整数值, 但我们可能也允许 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语句非常有用,因为它们区分了处理普通条件的代码和检查错误的代码。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值