• 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节的“修改器”,我们的开发规划就是【原型+补丁模式】。对每个函数,我都先写了一个简单的原型,只进行基本的运算,然后测试一下,接下来逐步修补错误。

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

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

    结束。

  • 相关阅读:
    浅析电商防止恶意下单
    Dubbo与Hadoop RPC的区别
    中秋福利 | 10本技术图书(编程语言、数据分析等)免费送
    IOS渠道追踪方式
    数据迁移的应用场景与解决方案Hamal
    JVM锁实现探究2:synchronized深探
    网页设计简史看设计&代码“隔膜”
    知物由学 | 你真的了解网络安全吗?
    一行代码搞定Dubbo接口调用
    测试周期内测试进度报告规范
  • 原文地址:https://www.cnblogs.com/liusingbon/p/13273746.html
Copyright © 2020-2023  润新知