python学习第9天

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值