Python之匿名函数

Python之匿名函数 今天给大家介绍一下Python中的匿名函数。

匿名函数

  1. lambda关键字来定义
  2. 参数列表不需要小括号
  3. 冒号不是开启新的语句块的
  4. 只能写在一行上
  5. 没有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)]

今天的内容就到这里,欢迎大家继续关注小白的技术客栈。

原文发布于微信公众号 - 小白的技术客栈(XBDJSKZ)

原文发表时间:2017-12-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程

Python之匿名函数

Python之匿名函数 今天给大家介绍一下Python中的匿名函数。 匿名函数 由关键字来定义 参数列表不需要小括号 冒号不是开启新的语句块的 只能写在一行上 ...

17510
来自专栏java达人

关于java传参

有一个比较经典的例子,如果你能说出此题的结果,说明你是java内存解析能手: public class Test1 { public static clas...

1747
来自专栏python3

python变量

以上实例,两个整型对象1和2的分配给变量 a 和 b,字符串对象 "john" 分配给变量 c。

351
来自专栏Nian糕的私人厨房

C_09 指针

内存地址:为了正确的访问内存单元上的数据,我们人为的给每个内存起上编号,这个编号就是内存的地址

745
来自专栏Celebi的专栏

C/C++ 学习笔记四(指针、数组)

工作中经常使用到C/C++,为对C有个比较深刻的了解,重新拾起学习C的任务。在看书的同时,记录下思考的过程,也记录下重要的知识点。

810
来自专栏null的专栏

C/C++——set的基本操作总结

set容器中只能存储键,是单纯的键的集合,其中键是不能重复的。 set支持大部分的map的操作,但是set不支持下标的操作,而且没有定义mapped_type...

2963
来自专栏锦小年的博客

Python学习笔记3.2-python内置函数大全

学习python不可避免的首先要了解python的内置函数,熟悉了这些以后可以给编程带来很大的方便。 1、数学运算类 函数名 函数功能 备注 abs...

1999
来自专栏我爱编程

Day6函数式编程2/3

返回函数 函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。 实现一个可变参数的求和。 def lazy_sum(*args):...

3366
来自专栏desperate633

LintCode 二进制求和题目分析代码

553
来自专栏武培轩的专栏

Leetcode#53.Maximum Subarray(最大子序和)

题目描述 给定一个序列(至少含有 1 个数),从该序列中寻找一个连续的子序列,使得子序列的和最大。 例如,给定序列 [-2,1,-3,4,-1,2,1,-5,4...

2985

扫描关注云+社区