目录
前言
Python的一些内置函数在程序中经常运用到,以下是本人对一些常用内置函数的总结,水平有限,请多多包涵。
提示:以下是本篇文章正文内容,下面案例可供参考
一、Lambada匿名函数的几种用法
示例
下面是一些lambda函数示例:
lambda x, y: x*y;函数输入是x和y,输出是它们的积x*y
lambda:None;函数没有输入参数,输出是None
lambda *args: sum(args); 输入是任意个数的参数,输出是它们的和(隐性要求是输入参数必须能够进行加法运算)
lambda **kwargs: 1;输入是任意键值对参数,输出是1
四个用法
由于lambda语法是固定的,其本质上只有一种用法,那就是定义一个lambda函数。在实际中,根据这个lambda函数应用场景的不同,可以将lambda函数的用法扩展为以下几种:
1.将lambda函数赋值给一个变量,通过这个变量间接调用该lambda函数。
例如,执行语句add=lambda x, y: x+y,定义了加法函数lambda x, y: x+y,并将其赋值给变量add,这样变量add便成为具有加法功能的函数。例如,执行add(1,2),输出为3。
2.将lambda函数赋值给其他函数,从而将其他函数用该lambda函数替换。
例如,为了把标准库time中的函数sleep的功能屏蔽(Mock),我们可以在程序初始化时调用:time.sleep=lambda x:None。这样,在后续代码中调用time库的sleep函数将不会执行原有的功能。例如,执行time.sleep(3)时,程序不会休眠3秒钟,而是什么都不做。
3. 将lambda函数作为其他函数的返回值,返回给调用者。
函数的返回值也可以是函数。例如return lambda x, y: x+y返回一个加法函数。这时,lambda函数实际上是定义在某个函数内部的函数,称之为嵌套函数,或者内部函数。对应的,将包含嵌套函数的函数称之为外部函数。内部函数能够访问外部函数的局部变量,这个特性是闭包(Closure)编程的基础,在这里我们不展开。
4. 将lambda函数作为参数传递给其他函数。
部分Python内置函数接收函数作为参数。典型的此类内置函数有这些。
filter函数。此时lambda函数用于指定过滤列表元素的条件。例如filter(lambda x: x % 3 == 0, [1, 2, 3])指定将列表[1,2,3]中能够被3整除的元素过滤出来,其结果是[3]。
sorted函数。此时lambda函数用于指定对列表中所有元素进行排序的准则。例如sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))将列表[1, 2, 3, 4, 5, 6, 7, 8, 9]按照元素与5距离从小到大进行排序,其结果是[5, 4, 6, 3, 7, 2, 8, 1, 9]。
map函数。此时lambda函数用于指定对列表中每一个元素的共同操作。例如map(lambda x: x+1, [1, 2,3])将列表[1, 2, 3]中的元素分别加1,其结果[2, 3, 4]。
reduce函数。此时lambda函数用于指定列表中两两相邻元素的结合条件。例如reduce(lambda a, b: '{}, {}'.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9])将列表 [1, 2, 3, 4, 5, 6, 7, 8, 9]中的元素从左往右两两以逗号分隔的字符的形式依次结合起来,其结果是'1, 2, 3, 4, 5, 6, 7, 8, 9'。
另外,部分Python库函数也接收函数作为参数,例如gevent的spawn函数。此时,lambda函数也能够作为参数传入。
二、filter函数
1.概述
filter()函数是Python 3内置的一种常用函数,主要的功能是按照给定的条件过滤列表,并返回符合条件的元素。filter为真(非0)被保留,为假(0)则舍弃
filter(function,iterable)
function -> 判断条件
iterable -> 可迭代对象
和map函数相同,在Python中filter函数返回的是一个迭代器,这意味着我们无法通过index访问filter对象,也不能通过len获得filter对象的长度。
我们可以直接for循环来依次输出filter对象中的每个元素,但是这个迭代器只能执一次,如果想多次重复使用filter函数的结果,可以使用list将这个迭代器转换为列表。
# Demo
Demo_lists=[1,2,3,4,5,6,7]
Demo_result_lists=filter(lambda x:x>2,Demo_lists)
print(f'filter type : {type(Demo_result_lists)}')
print('First iterator output : ')
for iter in Demo_result_lists:
print(iter)
print('Second iterator output : ')
for iter in Demo_result_lists:
print(iter)
Demo_result_lists=filter(lambda x:x>2,Demo_lists)
Demo_result_lists=list(Demo_result_lists)
print('First list output : ')
print(Demo_result_lists)
print('Second list output : ')
print(Demo_result_lists)
# Result
First iterator output :
3
4
5
6
7
Second iterator output :
First list output :
[3, 4, 5, 6, 7]
Second list output :
[3, 4, 5, 6, 7]
2.常用方式:
作用:筛选,去除列表的某项,列表里面可为列表,字典等
常用匿名函数lambaz来定义判定条件
注意filter返回的是迭代器,一般都需用list()来变为列表
实例:
1.filter筛选列表奇数
# 1.利用filter函数筛选出列表中为奇数的元素
Demo_lists=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]
def Is_odd(n):
return n%2==1
Result_lists=filter(Is_odd,Demo_lists)
#非0为保留,0就去除
Result_lists=list(Result_lists)
print(Result_lists)
# Result
[1, 3, 5, 7, 9, 11, 13, 15, 17]
2.filter筛选字典构成的列表
# 2.利用filter函数处理字典构成的列表
Dict_demo_lists=[
{'name':'Tom','score':64},
{'name':'Amy','score':75},
{'name':'Jack','score':88},
{'name':'Louis','score':55}
]
Result_lists=filter(lambda x:x['score']>70,Dict_demo_lists)
Result_lists=list(Result_lists)
print(Result_lists)
# Result
[{'name': 'Amy', 'score': 75}, {'name': 'Jack', 'score': 88}]
三、Map(函数,序列)
map() 会根据提供的函数对指定序列做映射。
def square(x) : # 计算平方数
return x ** 2
...
>>> map(square, [1,2,3,4,5]) # 计算列表各个元素的平方
<map object at 0x100d3d550> # 返回迭代器
>>> list(map(square, [1,2,3,4,5])) # 使用 list() 转换为列表
[1, 4, 9, 16, 25]
>>> list(map(lambda x: x ** 2, [1, 2, 3, 4, 5])) # 使用 lambda 匿名函数
[1, 4, 9, 16, 25]
四、reduce(函数,序列)
reduce() 函数会对参数序列中元素进行累积。
函数先对第1,2个元素进行操作,再用得到的结果与第3个进行函数操作,一直到结果与最后一个元素进行操作
#!/usr/bin/python
from functools import reduce
def add(x, y) : # 两数相加
return x + y
sum1 = reduce(add, [1,2,3,4,5]) # 计算列表和:1+2+3+4+5
sum2 = reduce(lambda x, y: x+y, [1,2,3,4,5]) # 使用 lambda 匿名函数
print(sum1)
print(sum2)
>>15
>>15
五、总结
本文仅仅简单介绍了匿名函数lamba,filter,map,reduce的使用,
1.filter,map都返回迭代器(注意用list(迭代器))
2.fliter,map,reduce的第一个参数函数既可以通过def定义,也能匿名函数lamba
3.lamba x:x**2即为x=x**2, list(fllter(lamba x:x>60,[10,20,60,70,90]))即为[70,90]
list(map(lamba x:x**2,[1,2,3]))即[1,4,9] reduce(lamba x,y:x+y ,[1,2,3,4])即((1+2)+3)+4=10