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

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

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

    结束。

  • 相关阅读:
    Postgresql HStore 插件试用小结
    postgres-xl 安装与部署 【异常处理】ERROR: could not open file (null)/STDIN_***_0 for write, No such file or directory
    GPDB 5.x PSQL Quick Reference
    postgresql 数据库schema 复制
    hive 打印日志
    gp与 pg 查询进程
    jquery table 发送两次请求 解惑
    python 字符串拼接效率打脸帖
    postgresql 日期类型处理实践
    IBM Rational Rose软件下载以及全破解方法
  • 原文地址:https://www.cnblogs.com/liusingbon/p/13273746.html
Copyright © 2011-2022 走看看