lambda

lambda 函数也叫匿名函数,也就是没有名字的函数

lambda匿名函数的格式:冒号前是参数,可以有多个,用逗号隔开,冒号右边的为表达式。其实lambda返回值是一个函数的地址,也就是函数对象。

通常和内置函数一起使用

lambda函数的特点和使用场景
特点

'''
从函数命名的角度:匿名,直接返回可供调用的值
从输入输出的角度:支持多个输入参数,但只支持一个表达式
从函数功能的角度:结构简单,无须定义函数名。但所能实现的功能也极其受限。
从访问变量的角度:只支持访问lambda自己定义的变量。不支持外部变量访问
从运行效率的角度:lambda实际上仍开辟了一个内存单元,并没有提升运行效率
'''

lambda函数复制给变量:减少函数定义的麻烦,同时支持代码复用

add=lambda x,y:x+y
print(add(1,2))

将lambda函数作为参数传递给其他函数

max

dict1 = {
    'tank': 1000,
    'egon': 500,
    'sean': 200,
    'jason': 500
}

# 获取dict1中薪资最大的人的名字
# 字符串的比较: ASCII
print(max(dict1, key=lambda x: dict1[x]))

min

# dict1 = {
#     'tank': 100,
#     'egon': 500,
#     'sean': 200,
#     'jason': 50
# }
# # new_list = ['egon', 'sean', 'tank', 'jason']
# new_list = sorted(dict1, key=lambda x: dict1[x], reverse=True)
# print(new_list)

zip() 压缩

zip() 函数可以把两个列表“压缩”成一个 zip 对象(可迭代对象)这样就可以使用一个循环并行遍历两个列表。

a = [1, 2, 3]
b = ['a', 'b', 'c']

for i in zip(a,b):
    print(i)
    
#结果:
(1, 'a')
(2, 'b')
(3, 'c')

从上面的测试结果来看,zip() 函数压缩得到的可迭代对象所包含的元素是由原列表元素组成的元组

Pthon 2.x 的 zip() 函数直接返回列表

Python 3.x 的 zip() 返回 zip 对象

如果 zip() 函数压缩的两个列表长度不相等,那么 zip() 函数将以长度更短的列表为准

a = [1, 2, 3, 4, 5]
b = ['a', 'b', 'c']

for i in zip(a,b):
    print(i)

#结果
(1, 'a')
(2, 'b')
(3, 'c')

zip() 函数不仅可以压缩两个列表,也可以压缩多个列表。比如下面试验同时压缩 多 个列表

>>> [x for x in zip(a, b, c)]
[('a', 1, 0.1), ('b', 2, 0.2)]

它还可以这样玩

a = [1, 2, 3, 4, 5]
b = ['a', 'b', 'c']

for i, v in zip(a,b):
    print(i, v)

map()映射

map() 函数的功能是对 可迭代对象中的每个元素,都调用指定的函数,并返回一个 map 对象

注意:该函数返回的是一个 map 对象,不能直接输出,可以通过 for 循环或者 list() 函数来显示

语法:

map(function, iterable)

function 参数表示要传入一个函数,其可以是内置函数、自定义函数或者 lambda 匿名函数;

iterable 表示一个或多个可迭代对象,可以是列表、字符串等。

map() 会根据提供的函数对指定序列做映射。用前面的函数,依次映射执行后面的可迭代对象

l = ['s','a','n','t']

res = map(lambda x : '666' + x,l)
for i in res:
    print(i)
#结果
#666s 666a 666n 666t

res = map(lambda a : a + '.jpg' if a[-1] != 'd' else a,l)
for i in res:
    print(i)

map() 函数还可传入多个可迭代对象作为参数

listDemo1 = [1, 2, 3, 4, 5]
listDemo2 = [3, 4, 5, 6, 7]
new_list = map(lambda x,y: x + y, listDemo1,listDemo2)
print(list(new_list))

结果:[4, 6, 8, 10, 12]

注意,由于 map() 函数是直接由用 C 语言写的,运行时不需要通过 Python 解释器间接调用,并且内部做了诸多优化,所以相比其他方法,此方法的运行效率最高。

reduce()合并

常用来对一个集合做一些累积操作

reduce() 函数在 Python 3.x 中已经被移除,放入了 functools 模块,因此在使用该函数之前,需先导入 functools 模块。

from functools import reduce

其中,function 规定必须是一个包含 2 个参数的函数;iterable 表示可迭代对象。

reduce函数与map函数有不一样地方,map操作是并行操作,reduce函数是把多个参数合并的操作,也就是从多个条件简化的结果,在计算机的算法里,大多数情况下,就是为了简单化

from functools import reduce
a = reduce(lambda x,y: x+y,[1,2,3,4])
print(a)
#10

from functools import reduce
listDemo = [1, 2, 3, 4, 5]
product = reduce(lambda x, y: x * y, listDemo)
print(product)
#120

filter()过滤

filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由filtre对象。

filter() 接收两个参数,第一个为函数,第二个为序列

序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。

语法:

filter(function, iterable)

list_demo = [1,2,3,4,5,6,7,8,8]

nl = filter(lambda x:x % 2 == 0,list_demo)
for i in nl:
    print(i)
    
#结果:2 4 6 8 8

filter()函数接受2个参数:1个函数对象以及1个可迭代的对象,接下来我们定义1个函数然后对1个列表进行过滤。

  首先我们创建1个列表,并且剔除掉小于等于3的元素:

回顾一下发生了什么:

  1. 我们定义了列表original_list
  2. 接着我们定义了一个接受数值型参数number的函数filter_three,当传入的参数值大于3时会返回True,反之则会返回False
  3. 我们定义了filter对象filtered,其中filter()接受的第一个参数是函数对象,第二个参数是列表对象
  4. 最终我们将filter对象转化为列表,最终得到经filter_three过滤后original_list内留下的元素。

总结:通常来说,当对集合中的元素进行一些操作时,如果操作非常简单,比如相加、累积这种,那么应该优先考虑使用 map()、filter()、reduce() 实现。

当然,在数据量不多的情况下,使用 for 循环等方式也可以。

不过,如果要对集合中的元素做一些比较复杂的操作,考虑到代码的可读性,通常会使用 for 循环。

 posted on 2019-11-15 15:04  Rannie`  阅读(312)  评论(0编辑  收藏  举报
去除动画
找回动画