1、异常处理
错误的分类分为:
1、语法错误(最简单的) ------> SyntaxError 。 这就会最常见的语法报错!
2、语义错误(5/0)
3、逻辑错误(最难排查的)------>逻辑错误不报错!但是不是自己想要的结果
排除错误的方式:try except
try:后面写的是有可能出现异常的代码!
except 异常类型 as 实例: 捕获特定异常
else:未招异常时。
finally:无论是否遇到异常均会执行!
#coding=gbk
try:
x = 5 / 0
print(x)
except ZeroDivisionError as e:
print('不能除零',e)
except:
print('其他异常')
else:
print('没有异常')
finally: #中间不管有没有遇到异常,都会执行的!
print('中间不管有没有遇到异常,都会执行的!')
就是有需要资源释放的时候! 我们就需要是用到finally这样的一个异常处理了!就是不管有没有遇到异常! 我们都需要执行finally代码块中的逻辑代码!
真实工作中! 我们遇到异常不能不处理! 通常我们会手动跑出异常! 就是使用raise关键字来手动的抛异常。
2、代码测试 (import unittest)
写类
def get_formatted_name(first,last):
full_name = '{} {}'.format(first,last)
return full_name.title()
print(get_formatted_name('tom','lee'))
写测试类
#coding=gbk
import unittest
from Day09Study.test import get_formatted_name
class NameTstCase(unittest.TestCase):
def test_title_name(self): # 名字已test_下划线开头!
formatted_name = get_formatted_name('tom','lee')
self.assertEqual(formatted_name,'Tom Lee')
if __name__ == '__main__':
unittest.main()
断言一下两个结果是否相等的测试!
3、数值、日期、时间
1、小数格式化、取证与四舍五入
'数值:{}'.format(a) 在python3.6以后可以这样写:f‘数值:{函数名}’ 。 如果我们想要实现以指定格式显示值的话!就要这样写: '数值:{:}'.format(参数名:想要出现的参数的类型)。 冒号的后面是类型。在python3.6版本以后f‘数值:{参数名:参数类型}’ 。
f'数值:{a:-f}' :显示出来a这个参数,以负数和浮点型展示
f'数值:{a:+f}' :显示出来a这个参数,以正数和浮点型展示
f'数值:{a:,f}' : 显示出来a这个参数,以千分为隔的显示!
f'数值‘:{a:,.2}:显示出来a这个参数,以千分为隔并且只保留小数点后两位的显示! 小数位保留的时候,用到了四舍五入的方式
x = 18 , y = 23 . '{:.2%}'.format(x / y ) :打印x/y的值!并且保留小数点后两位,然后以百分比的形式展示出来
对于小数的处理 : 在import math 这个模块中:
1、 math.trunc(变量名) : 阶段的意思! 将小数点后面的内容截掉! 没有用到四舍五入
2、math.floor(变量名):这是一个向下取整的运算,跟四舍五入没有关系!总是像下取整 123.987 = 123
3、math.ceil(变量名) : 这是一个向上取整的!跟四舍五入没有关系! 总是向上取整:123.111 = 124
4、round(要传入的值,保留几位小数):这是一个真正的四舍五入,他是一个全局的函数。能控制保留几位小数。
2、随机数的学习 :
1、random :
import random
lis = list(range(1,11))
random.choice(lst) #从该列表中随机的得到一个值
random.sample(lst,3) #从该列表中随机的拿到三个值 也可以是4个五个!
random.shuffle(lst) #将列表中的值随机打乱
--------以上三种都是对序列、列表进行操作的---------
random.randint(1,10) #从1-10之间随机取出来一个整数
random.random() # 随机得到一个小于1的浮点型数据 但是精度比较长
random.getrandbits(5) #生成一个指定比特位数的随机数 .这是给定5个比特位内的随机数!
3、日期与时间的常用操作 :
import datetime : 这个模块都是时间 。
当我们只关注年月日不考虑时分秒的时候,我们使用date 。
当我们只关注时分秒,不关注年月日的时候,我们使用的是time。
当我们即需要年月日!又需要时分秒的时候,我们使用的是datetime。
import datetime
datetime.MAXYEAR #在python中表示最大年份的
datetime.MINYEAR #在python中表示最小年份的
today = datetime.date.today() #获取当前的日期
today.year #获取当前日期中的年份
today.month #获取当前日期中的月份
today.day #获取当前日期中的天数
today.weekday() #获取当前日期对应的周几! 注意周二显示为1 ,周一显示为0 .从0开始显示
today.isoweekday() #根据国际时间获取当前日期对应的周几! 注意周二显示的是2,从1开始显示的!
#自己构造日期,指定某一个人的生日
birthdate = datetime.date(2010,3,12)
birthdate.year #输出2010 根据自己定义的输出!
#自己构造时间
t = datetime.time(15,26,30) #参数顺序 , 时,分,秒
t.hour #输出15 按照自己定义的输出!
dt = datetime.datetime(年,月,日,时,分,秒) #自己构造一个时间
now = datetime.datetime.now() #
now # 输出:datetime.datetime(年,月,日,时,分,秒,毫秒)
now.year # 当前年份
-----------字符串和日期之间的转换---------------------
s = '2018-3-15'
t = datetime.datetime.strptime(s,'%Y-%m-%d') #将字符串转化为日期时间!
now = datetime.datetime.now()
txt = now.strftime('%Y/%m/%d') #将日志转化为字符串
常见的占位符:
1、 %Y 四位年份
2、%y 二位年份
3、%m 二位月份
4、%d 二位日期
5、%H 二位小时
6、%M 二位分钟
7、%S 二位秒数
8、%f 微妙
9、%W 星期数,0...6
.....
4、时间的计算 : impport datetime
import datetime
d= datetime.datetimr(2018,3,5,22,44)
birthdate = datetime.datetime(2016,5,2,19,33,44)
d - birshdate #输出 datetime.timedelta(672,11416) 这两个属性第一个参数是表示天数 ,第二个属性表示的是秒数 ,也就是说两个日期想歌672天11416秒
diff = d - birshdate #diff的类型为 。 timedelta类型
diff.day #ouput : 672
diff.seconds #output : 11416秒
diff.total_seconds # output : 58072261.0 秒! 也就是说两个日期之间总共相差这个秒数
-------------------------------
#已知一段时间往后推一段时间
o = datetime.datetime(2008,8,8,20,8)
o + datetime.timedelta(days = 100) #这是在改日期往后推100天的天数
#已知一段时间往前推一段时间
result = d + datetime。timedelta(days =- 100) #这是往前推100天的天数 。如果吧days换成seconds的话,就是往前推多少秒数。换成hours 就换成了小时
4、unittest单元测试
1、单元测试概述 :当代码写完以后呢!我们需要看看我们的代码的功能是否完善,我们就需要去测试。单元测试分为
1、单元测试 :最小的测试 unittest,对代码最基本单元(函数、方法)的测试 。就是给予特定条件判断结果是否符合预期。
2、集成测试
3、系统测试
4、验收测试
5、回归测试
2、单元测试的案例 :
1、导入一个模块 : import unittest unittest中的asserEqual:断言是否相等的方法
import unittest
def add(a,b):
return a + b
#不用单元测试的时候
if __name__ == '__main__':
result = add(5,3)
print(result)
#用单元测试的方法 , 首先定义一个我们自己的类,集成unittest这个模块下面的TetCase的=这个基类
class MyTest(unittest.TestCase):
#定义我们想要实现的功能!这个功能定义在一个方法中,并且约定俗成的以test_开头
def test_add(self):
#开始测试,我们知道两个值的和,所以我们定义一个看看是否相等!用assertEqual :断言是否相等
self.assertEqual(8,add(5,3)) #判断这个8是否和调用这个函数的结果相等
if __name__ == '__main__':
#使用这个规则运行
unittest.main()
#如果输出 ok的话!就说明OK了。
我们常用的断言方法有哪些呢!?只有这一个断言相等嘛!?不是的!常见的还有:
1、assertTrue(A in B ) : 断言结果是否为true : 判断一个变量是否在另外的一个变量中,我们使用的是 in 这个关键字
2、assertIn(A,B) : 专门来断言判断是否包含的!判断A是否在B中!
3、assertEqual(3.3 , 1.1 + 2.2) :这个明显是真,但是测试不通过,这时候我们应该使用assertAlmostEqual() : 判断几乎相等
4、assertIs(A,B) : 判断两个值的地址值是否相等。也就是是否为同一个引用
5、assertIsNone(A,B):判断函数或者是方法返回的结果是否为None。
6、assertIsInstance(A,类型) :判断这个字面值或者是变量是不是另外一个类型的实例。
7、assertGreater(A,B) : 判断是否大于
3、类与测试装置 :
案例 :
这是我们自己编写的类:
#coding=gbk
class Calcilator:
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
这是我们在同级目录下在创建的一个测试类:
# coding=gbk
import unittest
# 写一个测试用例的类
from Day09Study.assertTest import Calcilator
class CalculatorTest(unittest.TestCase):
def test_add(self):
c = Calcilator(5, 3)
self.assertEqual(8,c.add())
def test_subtract(self):
c = Calcilator(5,4)
self.assertEqual(1,c.subtract())
if __name__ == '__main__':
unittest.main()
每次测试的时候都需要去定义 c = Calcilator(5, 3) 。太麻烦了! 在unittest中! 给我们定义了一个特殊的函数! 叫setUp,看代码
# coding=gbk
import unittest
# 写一个测试用例的类
from Day09Study.assertTest import Calcilator
class CalculatorTest(unittest.TestCase):
def setUp(self): #设置准备安装的意思
self.c = Calcilator(5, 3)
def test_add(self):
# c = Calcilator(5, 3)
self.assertEqual(8,self.c.add())
def test_subtract(self):
# c = Calcilator(5,4)
self.assertEqual(1,self.c.subtract())
if __name__ == '__main__':
unittest.main()
注意看后面的改变!在调用c的时候我们就需要使用self.c来调用了! 当我们来测试数据库连接的时候,我们测试完肯定要关掉的! 所以我们还使用unittest模块中自带的tearDown函数
# coding=gbk
import unittest
# 写一个测试用例的类
from Day09Study.assertTest import Calcilator
class CalculatorTest(unittest.TestCase):
def setUp(self): #设置准备安装的意思
self.c = Calcilator(5, 3)
def test_add(self):
# c = Calcilator(5, 3)
self.assertEqual(8,c.add())
def test_subtract(self):
# c = Calcilator(5,4)
self.assertEqual(1,c.subtract())
def tearDown(self):
del(self.c)
if __name__ == '__main__':
unittest.main()
这个时候整体的结构就OK了!这就是差不多整体的结构!