1.程序报错:程序在哪一行报错之后,后面的程序都不会被执行。
(1)异常类型:IndexError——索引错误,ZeroDivisionError——除零错误
FileNotFoundError——找不到文件错误,TypeError——类型错误等
2.捕捉异常:格式——try,except语句:
try:
可能会产生报错的代码
except 你想捕捉错误的名字(异常类型):
错误发生后你想相应执行的操作
except 你想捕捉错误的名字(异常类型):
执行的操作
else:
当程序正确执行之后要执行的语句
finally:
无论程序正确与否都会被执行的语句
这个语句中可以有多个except,根据你觉得可能发生错误的类型,但是当一个except就捕捉到了对应的错误,那么后面的except语句就都不会执行了。
else和finally:else放在最后一个except之后,当程序正确执行之后要执行的语句
finally放在最后,跟上无论程序正确与否都会被执行的语句
3.测试:程序的行为是否和我们预期相同或验证改动老代码之后不该受影响的地方也仍然会按预期执行。
(1)assert语句:assert 布尔表达式(返回的是布尔值),测试时,我们在assert跟上我们认为是True的表达式,如果最终求值结果是True,则无事发生,继续运行后面代码。若发生错误,就会提示AssertionError断言错误。需要注意:一旦出现AssertionError程序就会终止,不会再运行后面的代码,但是这样我们就不知道后面的代码中有没有什么其他问题。所以一般使用测试库,这样可以一次性测试多个用例,并且直观的告诉我们那个用例通过,哪个没有。
(2)unittest库:常用的python单元测试库,单元测试——对软件中的最小可测试单元进行验证(如验证某函数某方面表现是否符合预期),且unittest库是python自带的,使用的时候需要 import导入。注意:测试的时候一般把测试代码和需要实现的代码分开而不是混在一起。
格式:当我们想测试一个函数的时候,我们需要将测试的函数和类引入进来,如果测试文件和被测试文件位于同一文件夹下,语法为:from 文件名 import 函数名/类名,接下来就要创建类,举例子:class TestMyAdder(unittest.TestCase):,把创建的类定义为TeseCase的子类,这样能继承它的各种测试功能,在这个类下面可以定义不同的个测试用例,每一个测试用例都是类下面的一个方法,举例子:def test_positive_with_positive(self):,注意:但是名字必须以test_开头,因为unittest库会自动搜寻test_开头的方法,并且只把test_开头的方法当成测试用例。
(3)unittest.TestCase类的常见测试方法:
assertEqual(A,B)——assert A=B,assertTrue(A)——assert A is True,assertIn(A,B)——assert A in B,assertNotEqual(A,B)——assert A !=B,assertFalse(A)——assert A is False,assertNotIn(A,B)——assert A not in B。
注意:因为各种用例之间是独立的,所以当你想用很多种方法来测试用例时需要在每个方法中都创建相同的对象,浪费资源,为了避免这种情况,有一种方法:setUp(self):换行缩进后面跟上创建对象的语句,把这个方法放在用例的最前面,则程序在测试所有用例时会先把这个方法运行一遍,这样只需要在setUp方法中创建一次对象作为这个类的属性,后面的用例中就可以通过这个属性获取已创建好的对象。
注意:使用这个unittest之后当你要测试时,是在下面的终端输入python -m unittest,当测试结果是点的时候(几个用例几个点)说明测试通过。当有点是F的时候,则说明该用例出错。
下面是一段程序和他的测试:
class ShoppingList:
"""初始化购物清单, shopping_list是字典类型, 包含商品名和对应价格
例子: {"牙刷": 5, "沐浴露": 15, "电池": 8}"""
def __init__(self, shopping_list):
self.shopping_list = shopping_list
"""返回购物清单上有多少项商品"""
def get_item_count(self):
return len(self.shopping_list)
"""返回购物清单商品价格总额数字"""
def get_total_price(self):
total_price = 0
for price in self.shopping_list.values():
total_price += price
return total_price
import unittest
from shopping_list import ShoppingList
class TestShoppingList(unittest.TestCase):
def setUp(self):
self.shopping_list = ShoppingList({"纸巾": 8, "帽子": 30, "拖鞋15"}:
def test_get_item_count(self):
self.assertEqual(self.shopping_list.get_item_count(), 3)
def test_get_total_price(self):
self.assertEqual(self.shopping_list.get_total_price(), 55)
4.高阶函数:函数作为参数的函数
注意:当函数作为参数传入函数的时候,只需写函数名,不需要括号和自己原本的参数
5.匿名函数(当用完即丢,只需要一次性使用的时候):匿名函数关键字为lambda,当匿名函数作为参数传入函数的时候格式为:
lambda 自己本身的参数:返回的表达式,其中定义匿名函数的时候不需要return,因为他作为参数传入函数的时候会在冒号后写表达式。举例子:calculate_and_print(7,lambda num:num*5,print)
定义匿名函数:lambda num1,num2:num1+num2,而定义普通函数:
def calculate_sum(num1,num2):
return num1+num2
当调用匿名函数的时候和调用普通函数一样,都是(lambda num1,num2:num1+num2)(2,3),后面的括号是传入的参数,唯一的区别是前面的匿名函数也要被括住表示为一个整体。
注意:匿名函数有局限性,冒号之后无法有多个语句或者表达式,只能有一个语句/表达式,所以只适用于简单的场景。