推导式是用来创建列表,字典,和集合的。
推导式其实就是for循环,只不过把代码写简单了一点。 循环嵌套的推导式相当于是两层for循环,无论是几层循环,都可以加上条件过滤if 语句 其作用和循环里面加上if语句作用一样。我们通常用这样一个语句i for i in range(5)。这里的range()可以换成任何可以迭代的数据结构。里面的参数也必须和前面的重名,意思是把里面的参数i赋值给外面的参数i。当你想生成的数据结构是列表和集合时外面的参数只有一个,如果你想生成字典,外面的参数形式就要变成x:y
格式为变量名= 变量名中的元素格式 for 循环遍历 if 条件过滤
首先来看一个推导式创建列表
list1=[i for i in range(5)] #结果是[0,1,2,3,4]
它的for循环格式是
for i in range(5):
list1.append(i)
加了判断条件的推导式
list1=[i for i in range(5) if i %2==0] #结果是[0, 2, 4]
它的for循环格式是
for i in range(5):
if i%2==0:
list1.append(i)
双重循环的推导式
matrix = [[1, 2], [3, 4]] flatten = [num for i in matrix for num in i] #[1,2,3,4]
它的for循环格式是
for i in matrix: for num in i: flatten.append(num)
注意如果是这样写的
matrix = [[1, 2], [3, 4]] flatten = [i for i in matrix for j in i] print(flatten) #结果是[[1, 2], [1, 2], [3, 4], [3, 4]] 其双重循环代码是
matrix = [[1, 2], [3, 4]] flatten=[] for i in matrix: for j in i: flatten.append(i)
双重推到的if语句和一层循环一样
matrix = [[1, 2], [3, 4]]
flatten = [i for j in matrix for i in j if i>2] #[3,4]
当推导式和三元表达式结合
matrix = [[1, 2], [3, 4]]
flatten = [x if x%2==0 else -x for j in matrix for x in j x>2] #[-3,4]
这次上强度了hhh,我感觉实际开发中根本不会这样写,可读性太差了
数据是这样流通的:第一次循环先把matrix的[1,2]和[3,4]给j 然后第二次循环把[1,2]的数据给x,然后再判断x大于二吗?大于的话把数字给if三元表达式,再判断x能整除2吗?
for i in matrix: for x in i: if x>2: if x%2==0: flatten.append(x) else: flatten.append(-x) 列表中可以包含很多种数据类型比如 元组,还有很多格式不在这里一一举例了
list1=[(x,y)for x in [1,2] for y in [2,3] #list1=[(1,2)(1,3)(2,2)(2,3)]
接下来是字典
基础用法:
flatten={x: x**2 for x in range(5)} #{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
交换键值对 matrix = {"a":3} flatten={x:y for y,x in matrix.items()} #{3: 'a'}
matrix = ['a','b'] matrix1=[1,2] flatten={x:y for x in matrix for y in matrix1} #{'a': 2, 'b': 2}本来是1,后来2给1覆盖了
接下来是集合
flatten={x for x in range(10) }
flatten={x for x in [1,2,1,2,3] } #集合会自动去重{1,2,3}
如何用推导式生成二维列表呢 ?
list1=[[] for _ in range(4)] #[[],[],[],[]]
list1=[[n for n in range(1)] for _ in range(4) ] #[[0], [0], [0], [0]]
rows = 3 matrix = [[0]*(i+1) for i in range(rows)] # 结果:[[0], [0, 0], [0, 0, 0]]
rows, cols = 3, 4 matrix = [[i*j for j in range(cols)] for i in range(rows)] # 结果:[[0, 0, 0, 0], [0, 1, 2, 3], [0, 2, 4, 6]]
lambda的主要作用
1匿名函数,2作为参数传递 3配合filter函数和sort函数
其基本语法是lambda 变量 :表达式
a=lambda x,y:x+y print(a(1,2)) #结果是3
a=lambda x,y:x+y def add(aaa,x,y): print(aaa(x, y)) add(a,1,2) #结果是3
# 筛选列表中的偶数
numbers = [1, 2, 3, 4, 5]
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens) # 输出: [2, 4]
# 按元组的第二个元素排序
students = [("Alice", 90), ("Bob", 85), ("Charlie", 95)]
sorted_students = sorted(students, key=lambda x: x[1])
print(sorted_students) # 输出: [('Bob', 85), ('Alice', 90), ('Charlie', 95)]
lambda嵌套
# 生成一个幂函数生成器
power_maker = lambda n: lambda x: x**n
square = power_maker(2)
cube = power_maker(3)
print(square(3)) # 输出 9
print(cube(3)) # 输出 27