按照惯例这里应该是lambda的文档,但是相对于官方文档给出的内容比较少,所以这里就暂时打破惯例了。
了解匿名函数前,先要知道什么是python函数
在python中使用 def funtion_name(paramter)的方式定义函数即:
>>>>def function_name(paramter):
>>>> pass
这样的函数拥有函数名,调用的时候只需要
function_name(input_paramter)
暂且将def定义的函数叫做'有名函数',那么什么是匿名函数呢?顾名思义,这类函数没有显示的定义函数名。
认识匿名函数:
匿名函数不需要显示的定义函数名称,使用【lambda paramter : expression】的方式【1个或者多个参数,表达式,一个返回值】,即:
lambda arg1,arg2.... : expression
比如,我要写一个函数用于计算2个数值的相乘
使用def方式:
#!/usr/bin/env python2.7
# -*- coding=utf-8 -*-
def product(a,b):
return a * b
用匿名函数来编写
#!/usr/bin/env python2.7
# -*- coding=utf-8 -*-
func = lambda a,b : a*b
使用场景
1. 需要将一个函数对象作为参数来传递的时候,可以定义一个lambda函数(lambda作为函数的参数或者函数的返回值)
#!/usr/bin/env python2.7
# -*- coding=utf-8 -*-
# lambda作为参数传递,第一种常用情况
def sub_func(a, b, func):
print('a = ',a)
print('b = ',b)
print('a - b =',func(a, b))
sub_func(100,2,lambda a, b: a-b)
# lambda作为参数传递,第二种常用情况
member_list = [
{"name":“风清扬”,"age":99,"power":99999},
{"name":“大老王”,"age":89,"power":88888},
{"name":“老吴”,"age":120,"power":77777}
]
# sorted循环第一个参数中的每个元素传递给后边的匿名函数
new_list = sorted(member_list, key = lambda member_list: member_list['power'])
print(new_list)
num_list = [100,77,69,31,44,56]
num_str = list(map(lambda x:{str(x):x}, number_list))
print(num_str)
# lambda 作为函数的返回值
def run_func(a, b):
return lambda c: a+b+c
return_func = run_func(1,1000)
print(return_func)
print(return_func(100))
>>> <function run_func.<locals>.<lambda> at 0x00000254E4C94158>
>>> 10101
# 理解不错的话,这个函数返回一个函数对象,函数对象将它的运行环境保存了一下,所以在run_func都执行完了 我们还能使用a,b参数(暂时不着急理解这个,后续会学到的,calm down)
2. 要处理的业务符合lambda函数的情况(任意多个参数和一个返回值)并且只有一个地方会用到这个函数,不会在其他地方重用(重用的话还是老老实实用def定义函数吧)
^_^ 这个就不举例子了,我也没写过业务代码暂时还没有经验
匿名函数的多种形式
# 无参数
lambda_a = lambda: 100
print(lambda_a())
# 一个参数
lambda_b = lambda num: num * 10
print(lambda_b(5))
# 多个参数
lambda_c = lambda a, b, c, d: a + b + c + d
print(lambda_c(1, 2, 3, 4))
# 表达式分支
lambda_d = lambda x: x if x % 2 == 0 else x + 1
print(lambda_d(6))
print(lambda_d(7))
其他好玩的写法
data = ([1, 4, 3], [3, 2, 5], [5, 1, 2], [4, 3, 1], [2, 5, 3])
sorted(data, key=lambda _: _[0])
>>>[[1, 4, 3], [2, 5, 3], [3, 2, 5], [4, 3, 1], [5, 1, 2]]
sorted(data, key=lambda _: _[1])
>>>[[5, 1, 2], [3, 2, 5], [4, 3, 1], [1, 4, 3], [2, 5, 3]]
sorted(data, key=lambda _: _[2])
>>>[[4, 3, 1], [5, 1, 2], [1, 4, 3], [2, 5, 3], [3, 2, 5]]