Python类和函数_时间与纯函数

写一些函数,这些函数用自定义类型做参数和返回值。

一,时间

定义一个叫做 Time 的类,记录下当日的时间:

>>> class Time:

...     """Represents the time of day.

...     attributes: hour, minute, second."""

...

>>> Time()

<__main__.Time object at 0x10076ba58>

我们可以建立一个新的 Time 对象,然后对“时分秒”分别进行赋值:

>>> time = Time()

>>> time.hour = 11

>>> time.minute = 59

>>> time.second = 30

>>> time

<__main__.Time object at 0x10076b908>

这个 Time 对象的状态图如下:

二,纯函数

后面的章节中,我们要写两个函数来对 time 进行加法操作。这两个函数展示了两种函数类型:纯函数和修改器。

写这两个函数的过程中,也体现了一种新的开发模式:原型和补丁模式,这种方法就是在处理复杂问题的时候,先从简单的原型开始,然后逐渐解决复杂的内容。 

下面这段代码就是 add_time 函数的一个原型: 

>>> def add_time(t1, t2):

...     sum = Time()

...     sum.hour = t1.hour + t2.hour

...     sum.minute = t1.minute + t2.minute

...     sum.second = t1.second + t2.second

...     return sum

... 

这个函数新建了一个新的 Time 对象,并初始化了所有的值,然后返回了一个对新对象的引用,即sum。

这种函数叫纯函数,因为这种函数并不修改传来做参数的对象,也没有什么效果,比如显示值或者让用户输入些什么等等,而只是返回一个值而已。 

下面就来测试一下这个函数add_time,我将建立两个 Time 对象来计算一步电影的时长;start 包含了一个电影的开始时间,然后 duration(持续时间)包含了该电影的时长。

假设某部电影的时长是1小时35分钟,add_time 函数就会算出电影结束的时间。

>>> start = Time()

>>> start.hour = 9

>>> start.minute = 45

>>> start.second = 0

>>> duration = Time()

>>> duration.hour = 1

>>> duration.minute = 35

>>> duration.second = 0

>>> done = add_time(start, duration)

>>> print_time(done)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

NameError: name 'print_time' is not defined

SyntaxError: invalid syntax

这里提示函数print_time没有定义,现在来定义函数:

>>> def print_time(time):

...     print('%.2d:%.2d:%.2d' % (time.hour, time.minute, time.second))

... 

再打印 add_time 函数计算的电影结束时间:

>>> print_time(done)

10:80:00

很明显,返回的结果10点80分00秒肯定是不对的,而应该是11:20:00才对。问题就出在了函数不知道如何应对“时分秒”的六十位进位,所以超过60的时候没进位就这样了。

因此,我们得把超出六十秒的进位到分,超过六十分的进位到小时。以此思路来修改add_time函数:

>>> def add_time(t1, t2):

...     sum = Time()

...     sum.hour = t1.hour + t2.hour

...     sum.minute = t1.minute + t2.minute

...     sum.second = t1.second + t2.second

...     if sum.second >= 60:

...         sum.second -= 60

...         sum.minute += 1

...     if sum.minute >= 60:

...         sum.minute -= 60

...         sum.hour += 1

...     return sum

...

函数修改完成后,需要重新赋值给变量done:

>>> done = add_time(start, duration)

>>> print_time(done)

11:20:00

从返回结果看,函数正确工作了。

三,修改器

有时候需要对作为参数的对象进行一些修改,这时候这些修改就可以被调用者察觉,这样工作的函数就叫修改器了。

increment 函数,增加给定的秒数到一个 Time 对象,就可以被改写成一个修改器:

def increment(time, seconds):
      time.second += seconds
      if time.second >= 60:
              time.second -= 60
              time.minute += 1
     if time.minute >= 60:
               time.minute -= 60
               time.hour += 1

第一行代码进行了最简单的运算,如果秒数超过六十会怎么样?

当秒数超过六十的时候,就需要运行不只一次了,必须一直运行,直到 time.second 的值小于六十了才行。

总结:

从第1节的“时间”到第3节的“修改器”,我们的开发规划就是【原型+补丁模式】。对每个函数,我都先写了一个简单的原型,只进行基本的运算,然后测试一下,接下来逐步修补错误。

这种模式很有效率,尤其是在你对问题的理解不是很深入的时候。

但渐进式的修改也会产生过分复杂的代码——因为要应对很多特例情况,而且也不太靠靠——因为不好确定你是否找到了所有的错误。

结束。

原文地址:https://www.cnblogs.com/liusingbon/p/13273746.html