0# 异常处理与单元测试
异常处理
与其他语言类似,基本用法:
try:捕捉可能出现异常的部分
except异常名称(as 异常的别名):有此类异常时,按照下面的代码处理,没有就跳过
except:有剩下的异常时,按照下面的代码处理,没有就跳过
else:没有异常时按下面的代码处理
finally:不管有无异常最后总是要处理的操作
手动抛出异常:
raise 异常名称
上面的try…except…else…finally不是每一个部分都要有的
如:
try:
fh = open("testfile", "w")
fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
print "Error: 没有找到文件或读取文件失败"
else:
print "内容写入文件成功"
fh.close()
测试
测试的步骤:
1.通常构造一个测试类,继承自unittest.TestCase
2.在类中setUp()函数(名称是固定的,让unittest可以识别)写一些准备阶段的代码
构造test__xxx(),编写要测试的内容,很可能要用到断言,写出应该测试什么内容
例子如下:
class Calculator:
def __init__(self,x,y):
self.x=x
self.y=y
def add(self):
return self.x+self.y
def subtract(self):
return self.x-self.y
要对这个例子进行测试,在项目下再建一个测试的脚步
import unittest
from demo import Calculator
class Calculatortest(unittest.TestCase):
def setUp(self):
# self.c = Calculator(5, 3)
print("一般仅用来做初始化,不做过多操作")
def test_add(self):
c = Calculator(3,4)
self.assertEqual(8, c.add())
def tearDown(self):
# del self.c
print("是对测试用例进行删除")
# unittest.main()
if __name__ == '__main__':
# 2表示为了查看详细点的信息,也可填1或其他
unittest.main(verbosity=2)
执行结果:
Launching unittests with arguments python -m unittest test.testCalculator in F:\python练习\python\test
一般仅用来做初始化,不做过多操作
是对测试用例进行删除
Ran 1 test in 0.005s
OK
Process finished with exit code 0
如果将8改成7,让他失败,结果是:
一般仅用来做初始化,不做过多操作
是对测试用例进行删除
Ran 1 test in 0.017s
FAILED (failures=1)
8 != 7
Expected :7
Actual :8
<Click to see difference>
Traceback (most recent call last):
......
小数格式化的有关问题
字符串可以前面加上f来省略后面的".format()部分"
In[2]: a=520
In[3]: f'a={a}'
Out[3]: 'a=520'
下面是一些常见格式
f'a={a:f}' #以float类型打印a
Out[5]: 'a=520.000000'
In[6]: f'a={a:+f}' #打印+
Out[6]: 'a=+520.000000'
In[7]: f'a={a:-f}'
Out[7]: 'a=520.000000'
In[8]: b=-123.123
In[9]: f'b={b:-f}'
Out[9]: 'b=-123.123000'
In[11]: f'c={c:.2f}'
Out[11]: 'c=1234567.46'
In[12]: f'c={c:,f}'
Out[12]: 'c=1,234,567.456789'
In[14]: f'c={c:,.2f}'
Out[14]: 'c=1,234,567.46'
In[20]: x=18
In[21]: y=23
In[22]: f'{x/y:%}'
Out[22]: '78.260870%'
一些关于浮点数处理的函数
math.floor() 向下取整
math.ceil() 向上取整
math.trunc() 往0取整
round() 四舍五入(这个函数是全局函数,不是math里的函数)
随机化处理
模块random里面很多随机有关的函数
random.choice(l):从l序列中随机选一个数
random.sample():获取指定书目的序列
random.shuffle():将序列打乱顺序
random.randint():生成范围内的随机整数
random.random():生成0-1的浮点数
random.getrandbits():生成指定位数的随机数,如2位是0-3,3位是0-7等等
In[23]: a=list(range(1,11))
In[24]: a
Out[24]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
In[25]: import random
In[26]: random.choice(a)
Out[26]: 9
In[27]: random.choice(a)
Out[27]: 8
In[28]: random.choice(a)
Out[28]: 8
In[29]: random.choice(a)
Out[29]: 8
In[30]: random.choice(a)
Out[30]: 10
In[31]: random.sample(a,3)
Out[31]: [10, 4, 5]
In[32]: random.sample(a,3)
Out[32]: [2, 10, 6]
In[33]: random.sample(a,3)
Out[33]: [10, 9, 7]
In[34]: random.shuffle(a)
In[35]: a
Out[35]: [10, 2, 7, 6, 4, 5, 1, 3, 8, 9]
In[36]: a
In[38]: random.shuffle(a)
In[39]: a
Out[39]: [1, 2, 9, 10, 7, 5, 8, 6, 3, 4]
In[42]: random.randint(1,10)
Out[42]: 1
In[43]: random.randint(1,10)
Out[43]: 6
In[44]: random.randint(1,10)
Out[44]: 8
In[45]: random.randint(1,10)
Out[45]: 10
In[46]: random.random()
Out[46]: 0.3594700695906212
In[47]: random.random()
Out[47]: 0.09601856293695743
In[48]: random.random()
Out[48]: 0.007282626979247642
In[49]: random.getrandbits(2)
Out[49]: 3
In[50]: random.getrandbits(2)
Out[50]: 0
In[51]: random.getrandbits(2)
Out[51]: 1
In[52]: random.getrandbits(2)
Out[52]: 2
In[53]: random.getrandbits(2)
Out[53]: 1
In[54]: random.getrandbits(2)
Out[54]: 3
日期和时间的问题
datetime模块里包含了和时间有关的内容
1.date类:表示日期的类
2.time类:表示时间的类
3.datetime类:表示时间日期的类
初始化只需要datetime.date(年,月,日)
date例子:
In[56]: import datetime
In[57]: datetime.date.today()
Out[57]: datetime.date(2019, 9, 19)
In[58]: today=datetime.date.today()
In[59]: today.year
Out[59]: 2019
In[60]: today.month
Out[60]: 9
In[61]: today.day
Out[61]: 19
In[62]: today.weekday() #打印周几了(从周日开始算)
Out[62]: 3
In[63]: today.isoweekday() #打印周几了(从周一开始算)
Out[63]: 4
In[64]: birthday=datetime.date(2010,3,21)
In[65]: birthday.year
Out[65]: 2010
In[66]: birthday.day
Out[66]: 21
time:和date类似
In[68]: t=datetime.time(15,12,11)
In[69]: t.hour
Out[69]: 15
In[70]: t.minute
Out[70]: 12
In[71]: t.second
Out[71]: 11
In[72]: t.microsecond
Out[72]: 0
datetime相当于前两个结合了一下
In[73]: now=datetime.datetime.now()
In[74]: now
Out[74]: datetime.datetime(2019, 9, 19, 13, 34, 41, 582503)
字符串和日期的转换:
字符串到日期:strptime()
日期转换到字符串:strftime()
可以根据自己的喜好来设置字符串显示格式,如下
In[75]: s='2000-1-1'
In[76]: t=datetime.datetime.strptime(s,'%Y-%m-%d')
In[77]: t
Out[77]: datetime.datetime(2000, 1, 1, 0, 0)
In[78]: now=datetime.datetime.now()
In[79]: now
Out[79]: datetime.datetime(2019, 9, 19, 20, 47, 13, 165350)
In[80]: txt=now.strftime("%Y/%m/%d")
In[81]: txt
Out[81]: '2019/09/19'
格式符:
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
计算时差时,需要用到timedelta
In[88]: d=datetime.datetime(2008,8,8,8,8,8)
In[89]: birthday=datetime.datetime(2000,1,1,1,1,1)
In[90]: diff=d-birthday
In[91]: diff
Out[91]: datetime.timedelta(days=3142, seconds=25627)
In[92]: diff.days
Out[92]: 3142
In[93]: diff.seconds
Out[93]: 25627
In[94]: diff.total_seconds()
Out[94]: 271494427.0
In[95]: d+datetime.timedelta(days=100)
Out[95]: datetime.datetime(2008, 11, 16, 8, 8, 8)
In[96]: d+datetime.timedelta(days=-100) #往后时可以改成负数
Out[96]: datetime.datetime(2008, 4, 30, 8, 8, 8)