Python匿名函数

匿名函数

  匿名:隐藏名字,即没有名称

  匿名函数:没有名字的函数

lambda表达式

  Python中使用lambda表达式构建匿名函数。

  lambda 参数列表:表达式

  调用:(lambda 参数列表:表达式)(参数)

(lambda x : x + 1 )(4)

foo = lambda x : x ** 2  #表达式,只能写一行,不能出现赋值语句,不能见等号
foo(2) #调用
#输出
4
##################################
foo1 = lambda x,y : (x+y) ** 2 
foo1(1,2) #9

等价于:
def foo2(x,y):

  return (x+y) ** 2

foo2(1,2)

 

总结匿名函数:

  使用lambda关键字进行定义,格式为lambda [参数列表] :表达式 , 不能写赋值语句,只能写一行

  参数列表不需要写小括号,无参就不写参数

  冒号来分隔参数列表和表达式部分

  不需要使用return,表达式的值就是匿名函数的返回值,表达式中标不能使用等号

  lambda表达式只能写一行,使用lambda表达式,往往简洁化

匿名函数往往使用在高阶函数传参时,使用lambda表达式,往往能简化代码

示例:

#返回常量的函数
print((lambda : 0)()) #x = (lambda : 0)()

#加法匿名函数,带缺省值
add = (lambda  x,y=20:x + y)
add(5,4) # 9 

add(3) # 23 

#keyword-only参数
add1 = (lambda x,*,y:x + y)
add1(1,y=2) # 3 


add1 = (lambda x,*,y=20:x + y)
add1(1) # 21 


#可变参数
x = (lambda *args:(x for x in range(5)))() #返回一个生成器对象
next(x)

#lambda函数返回一个列表
y = (lambda *args:[x for x in range(5)])(*range(5))
print(y)
# [0,1,2,3,4]
print((lambda *args:[x for x in range(5)])(*range(10)))
# [0,1,2,3,4]

print((lambda *args:{x % 2 for x in range(5)})(*range(5)))
#{0,1} 或{1,0}

print([x for x in (lambda *args:map(lambda x:x+1,args))(*range(5))]) 
# [1, 2, 3, 4, 5] 高阶函数
print([x for x in (lambda *args:map(lambda x:(x+1,args),args))(*range(5))])
# [(1, (0, 1, 2, 3, 4)), (2, (0, 1, 2, 3, 4)), (3, (0, 1, 2, 3, 4)), (4, (0, 1, 2, 3, 4)), (5, (0, 1, 2, 3, 4))]

 

defaultdict运用lambda函数传参:

#示例1
from collections import defaultdict
d = defaultdict(list)
d[0].extend([1])
print(d)

#示例2
from collections import defaultdict
d = defaultdict(lambda :[])
d[0].extend([1])
print(d)


#示例3

from collections import defaultdict
d = defaultdict(lambda :list())
d[0].extend([1])
print(d)

 

 

sorted内嵌函数:

sorted(['a',1,2,3],key=str)

改写为lambda函数表达式

sorted(['a',1,2,3],key=lambda x:str(x))


sorted(['a', 1, 'b', 12, 'c', 28],key=lambda x :ord('x') if isinstance(x,str) else x)


sorted(['a', 1, 'b', 12, 'c', 28],key=lambda x :int(x,16) if isinstance(x,str) else x)

 

posted @ 2020-04-14 21:29  Alrenn  阅读(139)  评论(0)    收藏  举报