一、概念
Python中的推导式(comprehensions),又称为解析式,是一种独特的数据处理方式!可以从一个数据序列构建另一个新的数据序列的结构体!具有使用方便,且让代码看起来更高级!
Python中支持各种数据结构的推导式:
- 列表(list)推导式
- 字典(dict)推导式
- 集合(set)推导式
- 元组(tuple)推导式,本身不支持,tuple()函数得以实现
二、列表推导式
- 语法
- 变量名 = [表达式 for 变量 in 列表 for 变量 in xxx]
- 变量名 = [表达式 for 变量 in 列表 if 条件]
- 语义
- 遍历出列表中的内容给变量,表达式根据变量值进行逻辑运算,或者遍历列表中的内容给变量,然后给if条件进行判断,符合的值再给表达式。
- 练习
1. 快速创建一个包含1-10的元素列表
list1 = [i for i in range(1,11)]
print(list1)
2. 快速创建一个包含1-10的元素列表
list2 = [i for i in range(1,11) if i % 2 == 0]
print(list2)
3. 现在有一个列表lst =[[1,2,3],[4,5,6],[7,8,9]],思考取出1/4/7和1/5/9元素
# 现有列表lst = [[1,2,3],[4,5,6],[7,8,9]] ,求出1/4/7和1/5/9元素,思考如何取出?
lst = [[1,2,3],[4,5,6],[7,8,9]]
lst1 = [lst[i][0] for i in range(len(lst))]
print(lst1)
lst2 = [lst[i][i] for i in range(len(lst))]
print(lst2)
4. 过滤掉长度小于或等于3的字符串列表,并将剩下的转换成大写字母
names = ['Bob','Tom','alice','Jerry','Wendy','Smith']
new_names =[name.upper() for name in names if len(name)>3]
print(new_names)
#结果
['ALICE', 'JERRY', 'WENDY', 'SMITH']
5. 计算30以内可以被3整除的数字(一个for循环)
multiples = [i for i in range(20) if i % 5 ==0]
print(multiples)
#执行结果
[0, 5, 10, 15]
6. 多个for循环
lst1 = [1,2,3,4,5]
lst = [x * y for x in lst1 for y in range(3)]
print(lst)
7. 多个for,以及多个if
# 多个for,多个if
lst1 = [1,2,3,4,5]
lst2 = [x * y for x in lst1 for y in range(3) if x>2 if y>1]
print(lst2)
三、字典推导式
语法: {k : v for 循环 if 条件}
#字典推导式
dict1 = {"k1":1,'k2':2}
dict2 = {key:value *3 for key, value in dict1.items()}
print(dict2)
四、集合推导式
语法:{结果 for 循环 if 条件}
#集合推导式
set1 = {5, 4, 3, 2, 1}
set2 = {x * 2 for x in set1 if x > 2}
print(set2)
五、元组推导式,在Python中元组使用()表示,但是()又被用作是生成器了!
语法:tuple( 结果 for 循环 if 循环)
#没有元组推导式,需要加上tuple()函数!因为在Python中,()圆括号被Python给用作生成器的语法了!
tuple1 = (1, 2, 3, 4, 5)
tuple2 = (x * 2 for x in tuple1)
print(tuple2)
#<generator object <genexpr> at 0x000001EF3512DF90>
tuple1 = (1, 2, 3, 4, 5)
tuple2 = tuple(x * 2 for x in tuple1)
print(tuple2)
#结果
(2, 4, 6, 8, 10)
六、生成器表达式
6.1 在语法上,生成器表达式与一般的列表推导式一样,且支持列表推导式的语法(for和if语句)
6.2 重要区别:列表推导式在内存中产生所有的结果集,生成器表达式不在内存中构建结构,而是返回一个生成器对象(支持迭代协议!),后面按需产生值!
gen = (x ** 2 for x in range(4))
print(gen)
print('__iter__' in dir(gen))
print('__next__' in dir(gen))
#<generator object <genexpr> at 0x000002754703D0B0>
#True
#True
print('*' * 30)
for i in gen:
print(i)
#结果
******************************
0
1
4
9