列表推导式, 生成器表达式(字典推导式, 集合推导式).
列表推导式: 一行代码构建一个有规律比较复杂的列表.
列表推导式与之前写法对比
- l1 = []
- for i in range(1,101):
- l1.append(i)
- print(l1)
- # 列表推导式
- l1 = [i for i in range(1, 101)]
- print(l1)
两种构建方式:
1. 循环模式: [变量(加工后的变量) for 变量 in iterable]
2. 筛选模式: [变量(加工后的变量) for 变量 in iterable if 条件]
循环模式:
- # 循环模式:
- # 将 10 以内所有整数的平方写入列表.
- print([i**2 for i in range(1, 11)])
- # 100 以内所有的偶数写入列表.
- print([i for i in range(2, 101, 2)])
- # 从 python1 期到 python100 期写入列表 list
- print([f'python{i}期' for i in range(1, 101)])
筛选模式:
- # 1-100 里大于 49 的数
- print([i for i in range(1, 101) if i> 49])
- # 三十以内可以被三整除的数.
- print([i for i in range(1, 31) if i % 3 == 0])
- # 过滤掉长度小于 3 的字符串列表, 并将剩下的转换成大写字母
- l1 = ['barry', 'fdsaf', 'alex', 'sb', 'ab']
- print([i.upper() for i in l1 if len(i)> 3])
- # 找到嵌套列表中名字含有两个'e'的所有名字(有难度)
- names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
- l1 = []
- for i in names:
- for j in i:
- if j.count('e')> 1:
- l1.append(j)
- print(l1)
- # 列表推导式
- print([j for i in names for j in i if j.count('e')> 1])
列表推导式的优缺点:
列表推导式的优缺点:
优点:
简单, 快捷, 装 b.
缺点:
可读性不高, 不好排错.
# 慎用, 不要入迷.
生成器表达式:
与列表推导式几乎一模一样.
循环模式, 筛选模式.
- obj = (i for i in range(1, 11))
- # 把中括号换成小括号解释生成器表达式
如何触发生成器 (迭代器) 取值?
1. next(obj)
2. for 循环
- for i in obj:
- print(i)
3. 数据转化
- print(list(obj))
- # 生成器表达式: 生成器 节省内存.
字典推导式, 集合推导式
- # 字典推导式, 集合推导式: 两种模式: 循环模式, 筛选模式
- l1 = ['小潘', '怼怼哥','西门大官人', '小泽 ml 亚']
- # {0: '小潘', 1: '怼怼哥', 2: '西门大官人'}
- dic = {}
- for index in range(len(l1)):
- dic[index] = l1[index]
- print(dic)
- # 字典推导式
- print({i:l1[i] for i in range(len(l1))})
- # 集合推导式生成 1~100 的集合
- print({i for i in range(1, 101)})
来源: http://www.bubuko.com/infodetail-3098646.html