测试开发---推导式、迭代器和生成器

(1)推导式

I.列表推导式:list.append()

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.生成器是迭代器的一种

特征:a.实现了__iter__方法b.实现了__next__方法

生成器比迭代器多了几种方法:  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))

 

posted @ 2021-12-07 16:58  鲲尘轻杳  阅读(36)  评论(0编辑  收藏  举报