今天给大家介绍一下Python中的匿名函数。
匿名函数
- 由
lambda
关键字来定义 - 参数列表不需要小括号
- 冒号不是开启新的语句块的
- 只能写在一行上
- 没有return语句,最后一个表达式的值就是返回值
一个简单的例子:
In [1]: lambda x: x+1
Out[1]: <function __main__.<lambda>>
# 第一种用法
(lambda x: x + 1)(3) # 第一个括号用来改变优先级,第二对括号表示函数调用
In [2]: (lambda x: x+1)(3)
Out[2]: 4
# 第二种用法,把匿名函数赋值给变量
f = lambda x: x + 1
f(5)
In [3]: f = lambda x: x+1
In [4]: f(5)
Out[4]: 6
lambda x, y: x + y
# 也可以这样调用
(lambda x, y: x + y)(3, 5) # 第一个括号是用来改变优先级的,第二个括号是调用函数的
add = lambda x, y: x + y
add(3, 5)
也可以设置默认参数:
lambda x, y=1: x + y
add = lambda x, y=1: x + y
add(3)
# 调用的时候也可以用关键字参数
add(x=5)
lambda x, y=1: x + y
<function <lambda> at 0x1019e10d0>
add = lambda x, y=1: x + y
add(3)
4
# 调用的时候也可以用关键字参数
add(x=5)
6
可变参数可以吗?
In [5]: f = lambda *x: x
In [6]: f(1, 2, 3)
Out[6]: (1, 2, 3)
In [7]: lst = [1, 2, 3]
In [8]: f(*lst)
Out[8]: (1, 2, 3)
关键字参数可以吗?
In [9]: f = lambda **kw: kw
In [10]: f(a=0)
Out[10]: {'a': 0}
In [11]: dict01 = {'name': 'lavenliu.cn', 'age': 23}
In [12]: f(**dict01)
Out[12]: {'age': 23, 'name': 'lavenliu.cn'}
可变参数与可变关键字参数同时使用呢?
In [13]: (lambda *args, **kwargs: print(args, kwargs))(*range(3), **{str(x): x for x in range(3)})
(0, 1, 2) {'0': 0, '1': 1, '2': 2}
In [14]: (lambda *args, **kwargs: print(args, kwargs))(*range(3), **{str(x): x for x in range(3)})
(0, 1, 2) {'0': 0, '1': 1, '2': 2}
参数槽可以吗?
In [15]: f = lambda x, *, y: x+y
In [16]: f(1, y=3)
Out[16]: 4
普通函数所支持的参数变化,匿名函数都支持。
再来一例:
In [17]: concat = lambda *args: ''.join(args)
In [18]: concat('a', 'b', 'c')
Out[18]: 'abc'
In [19]: lower = (lambda x, y: x if x < y else y)
In [20]: lower(7, 3)
Out[20]: 3
In [21]: lower('a', 'b')
Out[21]: 'a'
In [22]: lower(2.3, 4.5)
Out[22]: 2.3
匿名函数通常和高阶函数配合使用,作为参数传入,或者作为返回值返回。
匿名函数最好不要定义成递归函数。
In [29]: fib = lambda n: 1 if n == 0 or n == 1 else fib(n-1) + fib(n-2)
In [30]: fib(5)
Out[30]: 8
一个例子:
from collections import namedtuple
User = namedtuple('User', ['name', 'age'])
users = [User('lavenliu', 23), User('taoqi', 20)]
def get_age(user):
return user.age
sorted(users, key=get_age)
[User(name='taoqi', age=20), User(name='lavenliu', age=23)]
# 或者使用匿名函数
sorted(users, key=lambda x: x.age)
[User(name='taoqi', age=20), User(name='lavenliu', age=23)]
list(map(lambda x: x.age, users))
list(filter(lambda x: x.age < 30, users))
自己实现一个map函数,
In [31]: def map_(fn, it):
...: return [fn(x) for x in it]
...:
In [32]: def square(n):
...: return n ** 2
...:
In [33]: lst1 = [1, 2, 3, 4, 5]
# 使用自定义的map函数
In [34]: map_(square, lst1)
Out[34]: [1, 4, 9, 16, 25]
自己实现一个filter函数,
def filter_(fn, it):
return [x for x in it if fn(x)]
今天的内容就到这里,欢迎大家继续关注微信公众号:小白的技术客栈。
转载于:https://blog.51cto.com/lavenliu/2122629