测试开发---推导式、迭代器和生成器
(1)推导式
urls = [] for i in range(1,5): url = 'page{}'.format(i) urls.append(url) print(urls) # ['page1', 'page2', 'page3', 'page4'] urls1 = ['page{}'.format(i) for i in range(1,5)] print(urls1) # ['page1', 'page2', 'page3', 'page4']
II.字典推导式:相当于dic.append()
dic1 = {i:i+1 for i in range(5)} print(dic1) # {0: 1, 1: 2, 2: 3, 3: 4, 4: 5}
项目应用:将str转为字典
""" cook_str = 'Transfer-Encoding = chunked; Connection= keep-alive' 转为{'Transfer-Encoding ': ' chunked', ' Connection': ' keep-alive'} """ cook_str = 'Transfer-Encoding = chunked; Connection= keep-alive' dic2 = cook_str.split(';') # ['Transfer-Encoding = chunked', ' Connection= keep-alive'] dic3 = {} for item in dic2: key = item.split('=')[0] value = item.split('=')[1] dic3[key] = value print(dic3) # 字典推导式 dic4 = {item.split('=')[0]: item.split('=')[1] for item in cook_str.split(';')} print(dic4)
(2)迭代器和生成器
I.生成器表达式:节省内存
II.可迭代对象:可进行for循环遍历
特征:a.内部只实现了iter方法 b.可迭代对象转成迭代器:iter(对象)
迭代协议:(1)包含iter方法的 (2)包含getitem方法的。只要对象中包含了这两种方法中的任意种,就可以进行迭代操作,也就实现了迭代协议。
可迭代对象:只要内部实现了迭代协议的就是可迭代对象(可迭代对象可进行相关的迭代操作,比如for循环,map函数等)
所有的迭代器都是可迭代对象。
li = [1,2,3,4] # 可迭代对象 li1 = iter(li) # 迭代器,type:<class 'list_iterator'> print(next(li1)) # 1 print(next(li1)) # 2
III.迭代器
特征:a.实现了iter方法b.实现了next方法
迭代器协议:
(1)实现了迭代器协议的对象(实现方式:对象内部定义了一个iter()方法)
(2)对象实现了__next__
方法
(3)__next__
方法返回某个数值(一般情况下,返回这个对象的特定数字,并按一定顺序进行依次返回)
(4)__next__
方法需要在值取完时,抛出StopIteration的错误信息
IV.生成器是迭代器的一种
生成器比迭代器多了几种方法: send():发送数据,与生成器进行交互, close():关闭生成器, throw()方法
生成器《迭代器《迭代器对象
def gen(): for i in range(1,5): se = yield i print('se的值',se) g = gen() # 生成器对象 print(next(g)) # 生成器取值: 1 print(g.send(100)) # 发送到 se = yield i 的返回结果中:se的值 100 2 print(next(g)) # se的值 None 3 # throw:在生成器内部主动引发一个异常 参数:(异常类型,异常信息) g.throw(ValueError, "hello python") g.close() # 关闭生成器 print(next(g))
项目应用:读取excel数据
from openpyxl import load_workbook # 读写excel库 def gen_read1(workbook_path,sheet_name): # 打开工作薄 wb = load_workbook(workbook_path) sheet = wb[sheet_name] max_row = sheet.max_row max_column = sheet.max_column header = [] datas_list = [] # 1张表单的全部测试数据 for row in range(2, max_row + 1): # 行遍历,1行即1条测试用例数据,存在1个字典中 row_dict = {} for col in range(1, max_column + 1): # 列遍历,列表中存储多条测试用例 # 方法1 row_dict[sheet.cell(1, col).value] = sheet.cell(row, col).value # 方法2 header.append(sheet.cell(1, col).value) # 读取excel标题行 row_dict[header[col - 1]] = sheet.cell(row, col).value # 测试用例数据以{标题行:测试数据存储},注意:标题行存在[]中,以0开始 # datas_list.append(datas_dict) yield row_dict # 方法2 def gen_read2(workbook_path,sheet_name): # 打开工作薄 wb = load_workbook(workbook_path) sheet = wb[sheet_name] row = sheet.max_row +1 col = sheet.max_column + 1 test_data = ({sheet.cell(1,j).value:sheet.cell(i,j).value for j in range(1,col)}for i in range(2,row)) return test_data # 方法3:放在命名元组中,性能更优 # 返回的是[]嵌套[]的数据 def gen_read3(workbook_path,sheet_name): from collections import namedtuple # 打开工作薄 wb = load_workbook(workbook_path) sheet = wb[sheet_name] row = sheet.max_row + 1 col = sheet.max_column + 1 # 命名元组 # 标题行 header = [sheet.cell(1,j).value for j in range(1,col)] test_data = namedtuple('test_data',header) # 数据行,按列读取 data =([sheet.cell(i,j).value for i in range(2,row)]for j in range(1,col)) # 拆分:每个标题对应一列,对应一个[] tu = test_data(*data) return tu if __name__ == '__main__': ss = gen_read2(r'G:\Works\FrameWork\class_004\test_data.xlsx', 'register') print(list(ss))