Python lambda 匿名函数,map函数与列表推导讲解与运用实例


lambda 匿名函数,map函数与列表推导在Python中也属于比较基础的内容,但是在使用过程中往往容易忘记其使用方法。
而如果可以合理的时候使用这些方法,会使我们的开发效率得到大大的提高,同时程序的运行效率也会得到提升。
以下是对lambda 匿名函数,map函数与列表推导进行详细的讲解:

1、lambda 匿名函数

也是一种生成函数对象表达式的方法,与def 定义函数类似,但是它没有给函数对象取名。

f = lambda x,y : x + y
print(f(2, 3))
# ------运行结果------
# 5
# ------运行结果------

lambda 函数通常用来定义一个简单,临时需要使用的函数,当然也正是因为这一特点,它也经常被用在其他地方。
如在PyQt中,当信号与需要传参的槽函数连接时,就会用到lambda函数来临时构建一个匿名函数。

2、map函数

map 函数将可迭代对象中的每一个对象依次传入需调用的函数,并返回一个新的可迭代对象。如:

def add_one(data):
    return data + 1
int_list = [1,3,5,7,9]
map_obj = map(add_one,int_list)
print(map_obj)
# ------运行结果------
# <map object at 0x000002538E4FC0C8>
# ------运行结果------
# Python 内置可迭代对象可用list方法取出
print(list(map_obj))
# ------运行结果------
# [2, 4, 6, 8, 10]
# ------运行结果------

map 函数与lambda 结合

print(list(map(lambda x: x + 1, int_list)))
# 运行结果与上面自定义的函数相同
# ------运行结果------
# [2, 4, 6, 8, 10]
# ------运行结果------

注意map函数与zip函数的差别,zip的用法为:
如有两组分别一一对应的列表(或元祖),就可以使用zip函数来方便的构建字典。

name_list = ['小明', '小李', '小周']
age_list = [18, 20, 22]
name_age_dict = dict(zip(name_list, age_list))
print(name_age_dict)
# ------运行结果------
# {'小明': 18, '小李': 20, '小周': 22}
# ------运行结果------

map 函数也可以作用于多个可迭代对象 如:

print(pow(2, 3)) # 2的3次方
# 相当于计算 2的2次方,3的3次方,4的4次方
map_obj2 = map(pow, [2,3,4], [2,3,4])
print(list(map_obj2))
# ------运行结果------
# [4, 27, 256]
# ------运行结果------

3、列表推导

列表推导用简单的话来说就是:**对一个系列中的值应用一个任意的表达式,将其结果收集到一个新的列表中并返回。**如:

list_a = [1,2,3,4]
list_b = [str(i) for i in list_a]
print(list_b)
# ------运行结果------
# ['1', '2', '3', '4']
# ------运行结果------

代码解析:在 in 后面的可迭代对象中进行 for 循环取值,将取出来的值,放入句首的函数或者表达式中进行处理。

用map函数也可实现上述功能:

map_obj3 = map(str,list_a)
print(list(map_obj3))

但明显列表推导式比map函数使用起来更加简单。

列表推导和if 判断

**而且列表推导中还可以增加if判断条件,**如:

list_c = [str(i) for i in list_a if i < 3]
print(list_c)
# ------运行结果------
# ['1', '2']
# ------运行结果------

增加了if判断的列表推导式的运行过程,可简单的理解为:
先for循环取值,然后if条件判断,满足条件的值,再放入句首的函数中进行处理。

多个列表推导

多个列表推导式的情况:

list_d = [1,2,3]
list_e = [(str(i),j**2) for i in list_d
          for j in list_d ]
print(list_e)
# ------运行结果------
# [('1', 1), ('1', 4), ('1', 9), ('2', 1),
# ('2', 4), ('2', 9), ('3', 1), ('3', 4), ('3', 9)]
# ------运行结果------

多个for循环的结果,就像是自己写的两层嵌套的for循环一样,出现的结果数量是内层循环次数乘以外层循环数,也叫多个for循环的笛卡尔积。

多个列表推导式与多个if 条件

list_f = [(str(i),j) for i in list_d if i < 3
                     for j in list_d if j < 3]
print(list_f)
# ------运行结果------
# [('1', 1), ('1', 2), ('2', 1), ('2', 2)]
# ------运行结果------

看起来有点复杂,但是结合前面的内容,理解起来应该很容易。其基本过程也是for循环取值,然后判断,只不过又多层for循环而已。

4、字典推导式、集合推导式

从列表推导式衍生出来的还有字典推导式,集合推导式。如:

字典推导式:

list_g = [1,2,3,4]
dict_a = {i:i**2 for i in list_g}
print(dict_a)
# ------运行结果------
# {1: 1, 2: 4, 3: 9, 4: 16}
# ------运行结果------

注意此种情况:

dict_b = {i:j**2 for i in list_g for j in list_g}
print(dict_b)
# ------运行结果------
# {1: 16, 2: 16, 3: 16, 4: 16}
# ------运行结果------

本来是要产生笛卡尔积个数量的结果,但是由于字典的键不能重复,所以键对应的值都为最后的内层循环4的平方的值,这里需要注意一下。

还有一种情况是:

list_h = [('小明', 18), ('小李', 20), ('小周', 22)]
dict_c = {key:value for key,value in list_h}
print(dict_c)
# ------运行结果------
# {'小明': 18, '小李': 20, '小周': 22}
# ------运行结果------

集合推导式

list_g = [1,2,3,4]
set_a = {str(i) for i in list_g}
print(set_a)
# ------运行结果------
# {'1', '4', '3', '2'}
# ------运行结果------

以上内容均为原创,未经允许,禁止转载。

猜你喜欢

转载自blog.csdn.net/zhouz92/article/details/106365896
今日推荐