类和函数学习笔记(python)

类和函数

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+方向剪  有意思的功能!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值