测试开发进阶(二)

测试开发进阶(二)

结构化工程

https://pythonguidecn.readthedocs.io/zh/latest/writing/structure.html

  • readme: 对项目的整体介绍,同时也是一份使用手册
  • LICENS:阐述该项目的许可说明和授权
  • setup.py:通过setup把核心代码打包
  • api_test:存放项目的核心代码
  • requirements.txt:项目依赖的第三方库
  • docs:包的参考文档
  • tests:代码的测试
  • makefile:同于项目的管理,根据项目需求添加其他的文件和目录

    数据类型扩展

基本数据类型

数值

  • 整数

  • 浮点数

  • 布尔类型

  • decimal

  • 复数

序列类型

  • 字符串
  • 元祖
  • 列表

元祖在定义的时候就确认了存放的空间,内存固定,占用空间较小

列表的空间可以动态变化,内存占用的空间比元祖大的多

在数据固定的情况下使用元祖

散列

  • 字典
  • 集合

命名元祖

1
from collections import namedtuple

普通元祖:

1
2
tu = ('zx', '1994', '男')
print(tu[0])

命名元祖:

使用namedtuple相当于创建了一个类,s1相当于实例话了一个包含name,age,gender三个属性的类。

__main__:当前模块下

1
2
3
4
5
6
7
8
9
from collections import namedtuple

student = namedtuple('Student', ['name', 'age', 'gender'])
print(type(student)) # <class 'type'> 一个类

s1 = student('zx', '1994', '男')
print(type(s1)) # <class '__main__.Student'>
print(s1.name) # zx
print(s1[0]) # zx

推导式

列表推导式

普通列表创建

1
2
3
4
5
6
7
8
9
l = [1, 2, 3, 4]

urls = []
for i in range(0,101,10):
urls.append(f'http://....?page={i}')
print(urls)
"""
['http://....?page=0', 'http://....?page=10', 'http://....?page=20', 'http://....?page=30', 'http://....?page=40', 'http://....?page=50', 'http://....?page=60', 'http://....?page=70', 'http://....?page=80', 'http://....?page=90', 'http://....?page=100']
"""

列表推导式

1
2
3
4
5
urls = [f'http://....?page={i}' for i in range(0,101,10)]
print(urls)
"""
['http://....?page=0', 'http://....?page=10', 'http://....?page=20', 'http://....?page=30', 'http://....?page=40', 'http://....?page=50', 'http://....?page=60', 'http://....?page=70', 'http://....?page=80', 'http://....?page=90', 'http://....?page=100']
"""

三目运算

1
2
3
4
5
a = 10
if a > 5:
print(5)
else:
print(0)
1
2
3
4
5
a = 4
res = 5 if a > 5 else 0 # (判断语句成立)if(判断语句)else(判断语句不成立)
print(res) # 0
res = 5 if a > 5 else ('=' if a > 5 else "!")
print(res) # !

结合列表推导式

1
2
[i for i in range(10) if i % 2 == 0] # [0, 2, 4, 6, 8]
[i if i % 2 == 0 else -1 for i in range(10) ] # [0, -1, 2, -1, 4, -1, 6, -1, 8, -1]

####字典推导式

1
2
3
4
5
6
7
8
9
10
11
12
dic = {i for i in [1, 2, 3]} 
# 集合{1, 2, 3}

dic = {i: 1 for i in [1, 2, 3]}
# 字典{1: 1, 2: 1, 3: 1}

dic = {k: v for k in [1, 2, 3] for v in [3, 2, 1]}
# {1: 1, 2: 1, 3: 1} 错误 ❌❌❌
dic = {k: v for k, v in zip([1, 2, 3], [3, 2, 1])}
# {1: 3, 2: 2, 3: 1} 正确 ✅✅✅
# 其实就是:
dict(zip([1, 2, 3], [3, 2, 1]))

生成器表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
tu = (i for i in range(5))
# <generator object <genexpr> at 0x11433d138>
next(tu) # 0
next(tu) # 1
next(tu) # 2
next(tu) # 3
next(tu) # 4
next(tu)
"""
Traceback (most recent call last):
File "/Users/zhongxin/Desktop/py/zx/02/0807_2.py", line 33, in <module>
print(next(tu))
StopIteration
"""

迭代器和生成器

生成器的作用:当我们要存储大量数据的时候,使用生成器可以节约内存

创建生成器的方式:

  1. 生成器表达式
  2. yield

只能用于函数中,当一个函数中出现yield这个关键字,那么这个函数就是一个生成器函数。

1
2
3
4
5
6
# yield 后面不写东西
def gen():
for i in range(100000):
yield
res = gen() # <generator object gen at 0x114203138>
next(res) # None
1
2
3
4
5
6
7
# yield 后面写i
def gen1():
for i in range(100000):
yield i
res = gen()
next(res) # 1
next(res) # 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def gen3():
for i in range(100000):
print(f'{i}--*******')
yield i
print(f'{i}--#######')
res = gen3()
print(res)
print(next(res))
"""
第一次next打印内容
0--*******
0
"""
print(next(res))
"""
第一次next打印内容
0--*******
0
第二次next打印内容
0--#######
1--*******
1
"""

可迭代对象和迭代器

  • 可迭代对象

对象内部实现了迭代协议的称之为可迭代对象

​ 迭代协议:该对象实现了__iter__方法

  • 可迭代对象都可以使用for循环进行遍历

  • 能够使用for循环进行遍历的都是可迭代对象

1
2
3
li = [11, 22, 33, 44]
for i in li:
print(i)
  • 迭代器

要求:

  1. 对象实现了迭代协议
  2. 内部还要实现__next_方法

next()方法

通过iter()可以将可迭代对象转化为迭代器

生成器是一种特殊的迭代器

1
2
3
4
li = [11, 22, 33, 44]
item = iter(li)
print(item) # <list_iterator object at 0x1032c8390>
print(next(item)) # 11

迭代器和生成器的区别:

  1. 生成器相比迭代器多了三种方法:send(),close(),throw()
  • send():与生成器内部进行数据交互
1
2
3
4
5
6
7
8
9
10
11
12
13
def gen():
i = 0
while i < 10:
j = yield i
print(j)
i += 1


g = gen()
print(g) # <generator object gen at 0x114203138>
print(next(g)) # 0
print(next(g)) # None 1
print(g.send(8)) # 8 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def gen1():
i = 0
while i < 10:
j = yield i
if j is not None:
i = j
i += 1
g = gen1()
print(next(g)) # 0
print(g.send(8)) # 9
print(g.send(5)) # 6
print(g.send(10))
"""
Traceback (most recent call last):
File "/Users/zhongxin/Desktop/py/zx/02/0807_5.py", line 26, in <module>
print(g.send(10))
StopIteration
"""
 wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
您的支持将鼓励我继续创作!