python的列表推导式和lambda表达式

推导式是用来创建列表,字典,和集合的。

推导式其实就是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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值