浅析Python中元祖,列表和字典的区别

Python012

浅析Python中元祖,列表和字典的区别,第1张

这三种数据结构属于不同类型,都具有属于自己独特的方法和属性,发挥不同的功用,彼此不可完全替代,各自有各自存在的意义。

1列表和元组:

表面上来看,列表是用[]包裹,元组是用()包裹的;

定义上来看,元组是不可变对象,即元组中的值可以看,但不能改,也就是不能增、删、改,没有类似append(),insert()等方法;而列表是可变对象,更为灵活,方法众多,包括增、删、改。

作用上来看:元组占用空间少、元组中的值不会被意外修改,可以进行对变量赋值、多变量交换,也作为函数参数的传递方式:

如:

a,b=b,a(元组本质上是用逗号定义的,可以没有圆括号,但不能少逗号,即使只有一个元素,也要写为('python',))

2.至于字典么,也有其独特的存在意义,类似列表是可变对象,不过不在乎元素的顺序(当然你也可以让它有顺序),每个元素是一个键值对等等。

算了,不说了,看文档,或找本书看吧,推荐《Python语言及其应用》Bill

Lubanovic著

pytest是目前比较成熟功能齐全的测试框架,使用率肯定也不断攀升。在实际

工作中,许多测试用例都是类似的重复,一个个写最后代码会显得很冗余。这里,我们来了解一下

@pytest.mark.parametrize装饰器,可以很好的解决上述问题。

释义:参数名称

格式:字符串"arg1,arg2,arg3"

释义:参数值列表

格式:必须是列表,如[val1,val2,val3]

单个参数,里面是值的列表,如@pytest.mark.parametrize("name",["Jack","Locus","Bill"])

多个参数,需要用元祖来存放值,一个元祖对应一组参数的值,如@pytest.mark.parametrize("user,age",[("user1",15),("user2",24),("user3",25)])

释义:可以理解为用例的id

格式:字符串列表,如["case1","case2","case3"]

释义:当indirect=True时,若传入的argnames是fixture函数名,此时fixture函数名将成为一个可执行的函数,

argvalues作为fixture的参数,执行fixture函数,最终结果再存入 request.param;当indirect=False时,fixture

函数只作为一个参数名给测试收集阶段调用。

备注:这里可以将the setup phase(测试设置阶段)理解为配置 conftest.py 阶段,将the collection phase(

测试收集阶段)理解为用例执行阶段。

由以上代码可以看到,当装饰器装饰测试类时,定义的数据集合会被传递给类的所有方法。

当测试用例只需要一个参数时,我们存放数据的列表无序嵌套序列,@pytest.mark.parametrize("name", data)

装饰器的第一个参数也只需要一个变量接收列表中的每个元素,第二个参数传递存储数据的列表,那么测试用

例需要使用同名的字符串接收测试数据(实例中的name)且列表有多少个元素就会生成并执行多少个测试用例。

当测试用例需要多个数据时,我们可以使用嵌套序列(嵌套元组&嵌套列表)的列表来存放测试数据。

装饰器@pytest.mark.parametrize()可以使用单个变量接收数据,也可以使用多个变量接收,同样,测

试用例函数也需要与其保持一致。

当使用单个变量接收时,测试数据传递到测试函数内部时为列表中的每一个元素或者小列表,需

要使用索引的方式取得每个数据。

当使用多个变量接收数据时,那么每个变量分别接收小列表或元组中的每个元素列表嵌套多少个多

组小列表或元组,测生成多少条测试用例。

通过测试结果,我们不难分析,一个测试函数还可以同时被多个参数化装饰器装饰,那么多个

装饰器中的数据会进行交叉组合的方式传递给测试函数,进而生成n * n个测试用例。

输出结果显示收集到4个用例,两个通过,一个被跳过,一个标记失败,当我们不想执行某组测试

数据时,我们可以标记skip或skipif当我们预期某组数据会执行失败时,我们可以标记为xfail等。

参数化装饰器有一个额外的参数ids,可以标识每一个测试用例,自定义测试数据结果的显示,

为了增加可读性,我们可以标记每一个测试用例使用的测试数据是什么,适当的增加一些说明。

在使用前你需要知道,ids参数应该是一个字符串列表,必须和数据对象列表的长度保持一致。

不加ids参数的返回结果

加ids参数的返回结果

我们可以看到带ids参数的返回结果中的用例都被一个列表明确的标记了,而且通过这种标记

可以更加直观的看出来,每个测试用例使用的数据名称及测试内容。