类和函数
1、 时间
作为用户定义类型的另外一个例子,定义一个Time的类,用于记录每一天的时间,类定义如下:
class Time(object):
"""Represents the time of day.
attributes:hour, minute, second
"""
我们可以创建一个时间对象,并给其属性小时数、分钟数、秒钟数赋值
In[109]: time=Time()
In[110]: time.hour=11
In[111]: time.minute=59
In[112]: time.second=30
In[115]: def print_time(t):
...: print '%.2d:%.2d:%.2d'% (t.hour, t.minute, t.second)
...:
In [116]: print_time(time)
11:59:30
2、纯函数
stage1:简单原型
In[131]: 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
...:
In[119]: start=Time()
In [120]: start.hour=9
In [121]: start.minute=45
In [123]: start.second=0
In [124]: duration=Time()
In [125]: duration.hour=1
In [126]: duration.minute=35
In [127]: duration.second=0
In [133]: done=add_time(start,duration)
In [134]: print_time(done)
10:80:00
stage2:改进版本
In [136]: 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
...:
...:
In [137]: done=add_time(start,duration)
In [138]: print_time(done)
11:20:00
3、 修改器
In [145]: import math
...:
...: def increment(t,seconds):
...: t.second += seconds
...:
...: if t.second >=60:
...: n = math.floor(t.second/60.0)
...: t.second -= 60*n
...: t.minute += n
...:
...: if t.minute >= 60:
...: k = math.floor(t.minute/60.0)
...: t.minute -= 60*k
...: t.hour += k
...:
...: return t
...:
...:
In [146]: print_time(start)
09:45:00
In [147]: print_time(increment(start,0))
09:45:00
In [148]: print_time(increment(start,60))
09:46:00
In [149]: print_time(increment(start,61))
09:47:01
In [150]: print_time(increment(start,600))
09:57:01
In [151]: print_time(increment(start,3600))
10:57:01
4、 原型与计划
有规划开发!
stage1:将时间转化为int的函数:
In [154]: def time_to_int(t):
...: minutes=t.hour*60+t.minute
...: seconds=minutes*60+t.second
...: return seconds
...:
...:
In [155]: time_to_int(start)
Out[155]: 39421.0
In [156]: import copy
...:
In [157]: tx=copy.deepcopy(start)
In [158]: print_time(tx)
...:
10:57:01
In [159]: print_time(tx)
...: tx.hour=0
...: tx.minute=1
10:57:01
In [160]: print_time(tx)
00:01:01
In [161]: time_to_int(tx)
Out[161]: 61.0
stage2:将整数转换回时间对象
In [171]: def int_to_time(seconds):
...: time=Time()
...: minutes,time.second=divmod(seconds,60)
...: time.hour,time.minute=divmod(minutes,60)
...: return time
...:
...:
In [172]: print_time(int_to_time(1))
00:00:01
In [173]: print_time(int_to_time(61))
00:01:01
In [174]: print_time(int_to_time(3600))
01:00:00
In [175]: print_time(int_to_time(3600*12))
12:00:00
In [176]: time_to_int(int_to_time(12))=12
File "<ipython-input-176-494dc476e2b8>", line 1
time_to_int(int_to_time(12))=12
SyntaxError: can't assign to function call
In [177]: time_to_int(int_to_time(12))==12
Out[177]: True
stage3:时间相加
In [178]: def add_time(t1,t2):
...: seconds=time_to_int(t1)+time_to_int(t2)
...: return int_to_time(seconds)
...:
In [179]: add_time(start,duration)
Out[179]: <__main__.Time at 0xa30d828>
In [180]: print_time(add_time(start,duration))
12:32:01
In [181]: print_time(tx)
00:01:01
In [182]: print_time(add_time(tx,tx))
00:02:02
5、 调试
不变式(invariant):在程序的执行过程中应当总是为真的条件。
stage1: 我们对上述的代码,可以写一个valid_time函数,接收时间对象,并当违反它的第一个不变式时,返回false.
In [185]: 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
...:
In [186]: print_time(tx)
00:01:01
In [187]: tx.hour=-1
In [188]: valid_time(tx)
Out[188]: False
In [189]: valid_time(start)
Out[189]: True
stage2:接着在每个函数的开头,检查参数,确保参数有效。
In[191]: 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)
...:
In [192]:add_time(start,duration)
Out[192]:<__main__.Time at 0xa30de48>
In[193]: print_time(add_time(start,duration))
12:32:01
In[194]: print_time(tx)
-01:01:01
In[195]: print_time(add_time(start,tx))
Traceback (most recent call last):
File "<ipython-input-195-f46e1eba13a4>",line 1, in <module>
print_time(add_time(start,tx))
File"<ipython-input-191-cb6f9d818d64>", line 3, in add_time
raise ValueError, 'invalid Time Object inadd_time'
ValueError: invalid Time Object in add_time
stage3:或者用assert语句
In[199]: 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)
...:
In [200]:print_time(add_time(start,duration))
12:32:01
In[201]: print_time(add_time(start,tx))
Traceback (most recent call last):
File "<ipython-input-201-f46e1eba13a4>",line 1, in <module>
print_time(add_time(start,tx))
File"<ipython-input-199-4c8fb164926b>", line 2, in add_time
assert valid_time(t1) and valid_time(t2)
AssertionError
win10系统:ctrl+alt+方向剪 有意思的功能!