day14:列表/集合/字典推导式&生成器表达式&生成器函数
推导式推导式的定义:?通过一行循环判断,遍历一系列数据的方式 推导式的语法: val for val in Iterable 三种方式: [val for val in Iterable] {val for val in Iterable} {k:v for k,v in Iterable} 列表推导式1.单循环推导式 将[1,2,3,4,5] -> [3,6,9,12,15] # 1.单循环推导式 [1,15] lst = [1,5] lst_new = [] for i in lst: res = i * 3 lst_new.append(res) print(lst_new) 改写成推导式 lst = [i*3 lst] print(lst) 2.带有判断条件的单循环推导式 2.带有判断条件的单循环推导式 (只能是单项分支,接在for后面) lst = [1,5,7,8 lst: if i % 2 == 1: lst_new.append(i) 改写成推导式 lst = [i in lst ] print(lst) 3.双循环推导式 3. 双循环推导式 lst1 = ["A",BCD"] lst2 = [XYZQ "谁"?"谁" lst_new = lst1: for j lst2: strvar = i + ?" + j lst_new.append(strvar) 改写成推导式 lst = [i + " + j in lst1 lst2] print(lst) 4.带有判断条件的多循环推导式 4.带有判断条件的多循环推导式 lst_new = lst2: if lst1.index(i) == lst2.index(j): strvar = i + j lst_new.append(strvar) 改写成推导式 lst = [ i + in lst2 lst2.index(j) ] print(lst) 推导式练习题1.{'x': 'A','y': 'B','z': 'C' } 把字典写成x=A,y=B,z=C的列表推导式 使用等号"="进行拼接 lst = [k + =" + v for k,v dic.items()] print(lst) 2.x是0-5之间的偶数,y是0-5之间的奇数 把x,y组成一起变成元组,放到列表当中 方法一 lst = [(x,y) for x in range(6) for y if x % 2 == 0 and y % 2 == 1(lst) 方法二 lst = [(x,1)">if y % 2 == 1print(lst) 3.使用列表推导式 制作所有99乘法表中的运算 for前面是一个format字符串的格式化 lst = [{}*{}={:2d} ".format(i,j,i*j) in range(9,-1) in range(1,i+1) ] print(lst) 4.求M,N中矩阵和元素的乘积 M = [? [1,3],? 实现思路 M = [[1,[4,[7,9]] N = [[2,[3,4]] """ M[0][0] * N[0][0] => 2 M[0][1] * N[0][1] => 4 M[0][2] * N[0][2] => 6 M[1][0] * N[1][0] => 12 M[1][1] * N[1][1] => 15 M[1][2] * N[1][2] => 18 M[2][0] * N[2][0] => 28 M[2][1] * N[2][1] => 32 M[2][2] * N[2][2] => 36 外层的循环动的慢,内层的循环动的快,外层的循环动一次,内层的循环动3次,利用这个规律取出对应下标,乘积即可. """ 效果一 [2,36] lst = [M[i][j] * N[i][j] in range(3) in range(3)] 效果二 [[2,36]] # 1 . 先遍历出三个空列表 lst = [ [] in range(3) ] => [ [],[],[] ] 2 . 把空列表中的数据在通过推导式算出所有内容 lst = [ [M[i][j] * N[i][j] in range(3)] print(lst) 集合推导式关于集合推导式的一个示例: 1.集合有自动去重的效果 2.用三元表达式+推导式即可实现 案例: 满足年龄在18到21,存款大于等于5000 小于等于5500的人,开卡格式为:尊贵VIP卡老x(姓氏),否则开卡格式为:普通用户卡老x(姓氏) 把开卡的种类统计出来 """ listvar = [ {name":彭云飞age":18,1)">money":10000},{夏圣钦":19,1)">":5100陈正正":20,1)">":4800王添龙":21,1)">":2000万潇阳":20} ] 常规写法 setvar = set() listvar: if 18 <= i["] <= 21 and 5000 <= i["] <= 5500: res = 尊贵VIP卡老" + i[][0] else普通用户卡老][0] setvar.add(res) (setvar) 改写成集合推导式 {三元运算符 + 推导式} setvar = { "][0] "] <= 5500 else listvar } print(setvar) 字典推导式1.enumerate 功能: 枚举 ; 将索引号和iterable中的值,一个一个拿出来配对组成元组放入迭代器中 iterable: 可迭代性数据 (常用:迭代器,容器类型数据,可迭代对象range) enumerate形成字典推导式示例: from collections import Iterator lst = [东邪西毒南帝北丐] 基本使用 it = enumerate(lst) [(0,'东邪'),(1,'西毒'),(2,'南帝'),(3,'北丐')] (isinstance(it,Iterator)) for + next in range(4): (next(it)) list start可以指定开始值,默认是0 it = enumerate(lst,start=1) print(list(it)) [(1,(4,'北丐')] enumerate 形成字典推导式 变成字典 dic = { k:v in enumerate(lst,1)">) } print(dic) {1: '东邪',2: '西毒',3: '南帝',4: '北丐'} dict 强制变成字典 dic = dict(enumerate(lst,1)">)) 多个iterable中的值,1)">配对组成元组放入迭代器中 |