写python的时候,大多数场景下,我都是if else选手,因为最核心的逻辑几乎都是通过if else语句来实现的。关于匿名函数这块儿,其实可以用常见的循环等方法来实现,但是如果你想成为一个python的高手,匿名函数还是必须要了解的。因为匿名函数,能够让你的代码足够简洁,01什么是匿名函数?

在python中,匿名函数,顾名思义,就是没有名字的函数,它主要用在那些只使用一次的场景中。如果我们的程序中只需要调用一次某个简单逻辑,把它写成函数还需要先定义、取函数名字等一些列操作,这种场景下使用匿名函数往往能够让你的程序更加简单。

匿名函数还有名称,叫做lambda。匿名函数格式如下:

lambda arg1,arg2 ...,argN : expression

它常用格式是lambda关键字+逗号分隔的参数+冒号+表达式。

简单看个例子吧:----计算一个数的平方---

>>> lambda x: x**2

at 0x7f6ebe013a28>

---注意,这个是一个函数的地址---

>>> func=lambda x: x**2

>>> func(2)

4

>>>

>>> func(3)

9

利用lambda,我们实现对一个数字x求平方的运算,在python中,**代表乘方操作。

上面的例子中,x就是参数,冒号后面的x**2就是expression表达式。

当然,我们也可以定义一个函数来实现乘方操作。

lambda区别于函数的一点在于,lambda是一个表达式,它不是一个函数,也不是一个语句。因此,lambda可以被用在一些特殊的地方,例如下面的场景:

我们可以用range函数来生成一个list,如下:>>> a=[ range(10)]

>>> a

[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]

如果我们要对这些数字做乘方操作,则可以直接写成下面的样子:>>> b=[(lambda x: x*x)(x) for x in range(10)]

>>> b

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

----如果用函数来实现,会发现报错---

>>> def fun(x):

...    return x**2

...

>>>

>>> c=[fun(range(10))]

Traceback (most recent call last):

File "", line 1, in

File "", line 2, in fun

TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'int'

当然,你也可以利用函数,使用另外的方法来实现这个过程如下:>>> def fun2(x):

...    return x**2

...

>>> c=[]

>>> for i in range(10):

...     c.append(fun2(i))

>>> c

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

相比于前面的lambda函数,这个方法显得不那么灵巧。02函数式编程

所谓的函数式编程,代表代码中每块都是不可变的,都是由函数构成的,函数本身相互独立,互不影响,相同的输入都对应相同的输出,函数式编程特性,和lambda有密切的关系。

来看下面的例子,假如我们想让一个list中的元素都乘以2,可以写成下面的形式:>>> l=[1,2,3,4,5]

>>> def double_num(l):

...   for index in range(0, len(l)):

...       l[index] *= 2

...   return l

...

>>> double_num(l)

[2, 4, 6, 8, 10]

>>> l

[2, 4, 6, 8, 10]

上面这段代码,就不是一个函数式编程的例子。

因为每次输入列表L,L的值都会被改变,如果我们多次调用double_num这个函数,每次的结果都不一样。

那么如果我们让它变成一个函数式编程,就得写成下面这样:>>> l=[1,2,3,4,5]

>>> def double_num1(l):

...     new_list=[]

...     for index in l:

...          new_list.append(index*2)

...     return new_list

...

>>> double_num1(l)

[2, 4, 6, 8, 10]

>>> l

[1, 2, 3, 4, 5]

在python中,提供了常用的几个函数map、filter、reduce同lambda一起使用,来实现函数式编程(注意,这3个函数需要在python3的环境下使用)。

map函数  map(function, list)

注意,这里的function可以是匿名函数,也可以是普通的函数。

还是上面的乘以2的例子,假如我们使用map函数配合lambda来实现,可以写成下面这样:>>> l = [1, 2, 3, 4, 5]

>>> new_list = map(lambda x: x * 2, l)

>>> for i in new_list:

...   print(i)

...

2

4

6

8

10

这里的lambda就可以用函数来替换,如下:>>> l = [1, 2, 3, 4, 5]

>>> def double_x(x):

...    return x*2

>>> res=map(double_x, l)

>>> for i in res:

...   print(i)

...

2

4

6

8

10

filter函数 filter(function,list)

filter函数主要用来对可迭代的对象中的每个元素,都用function判断,将返回true的对象返回,返回false的对象抛弃,如下为判断一个集合中的偶数:>>> l = [1, 2, 3, 4, 5]

>>> new_l=filter(lambda x: x%2==0, l)

>>> for i in new_l:

...     print(i)

...

2

4

reduce函数 reduce(function, list)

reduce主要用来对一个列表做一些累计操作,假如我们要计算某个列表的累计乘积,可以用下面的方法:>>> from functools import reduce

>>> l = [1, 2, 3, 4, 5]

>>> product = reduce(lambda x,y: x*y, l)

>>> product

12003lambda的性能如何?

下面是一个例子,测试不同的方案下,使用lambda、for循环和新建list的方法,分别对一个集合元素乘以2,计算的耗时情况:[root@VM-0-14-centos ~]# python3 -mtimeit -s'a=range(1000)' 'map(lambda x: x*2, a)'

1000000 loops, best of 3: 0.538 usec per loop

[root@VM-0-14-centos ~]# python3 -mtimeit -s'a=range(1000)' '[x * 2 for x in a]'

10000 loops, best of 3: 122 usec per loop

[root@VM-0-14-centos ~]# python3 -mtimeit -s'a=range(1000)' 'l = []' 'for i in a: l.append(i * 2)'

1000 loops, best of 3: 252 usec per loop

可以看到,使用map+lambda计算的时候,性能是更好的。map函数是由c语言写的,运行的时候不需要通过python解释器,并且内部做了很多优化,因此性能会更好。

更多lambda细节请关注python3的官方文档。今天就到这里吧。

python中定义匿名函数的关键字是,Python中的匿名函数相关推荐

  1. python自定义函数的关键字_Python3.x中自定义比较函数

    在Python3.x的世界里,cmp函数没有了.那么sorted,min,max等需要比较函数作为参数的函数该如何用呢? 以min函数的定义为例,有两种重载形式: 单参数(一个迭代器): 复制代码 代 ...

  2. 深度学习项目中在yaml文件中定义配置,以及使用的python的PyYAML库包读取解析yaml配置文件

    文章目录: 1 yaml说明介绍 1.1 yaml介绍 1.2 YAML 相关网址 2 YAML的python包PyYAML的使用 2.1 关于PyYAML的相关网址 2.2 安装PyYAML 2.3 ...

  3. python最基本的规则是关键字吗,Python 关键字

    很多语言都是有关键字的,Python 也不例外. 不同的编程语言提供了不同的保留关键字集,但是在所有编程语言中都有一个重要且通用的规则,我们不能使用保留关键字来命名我们变量.函数.类.模板以及其他对象 ...

  4. python怎么定义全局字典_一种Python全局配置规范以及其魔改

    0x01 模块 or global 很多初学者有个误区,就是在Python中需要配置一个全局的参数时,首先想到的是global关键字,而实际上global不是干这个事的,global的功能是在将局部作 ...

  5. CSS中定义多个链接样式,在CSS中定义【导航栏】超链接样式

    1.案例css代码 .divcss5 a:link{ color:#F00}/* 链接默认为红色 */ .divcss5 a:hover{ color:#000}/* 鼠标悬停黑色 */ .divcs ...

  6. java中定义类头的修饰符,JAVA中定义类头时能使用的修饰符是什么

    满意答案 壹壹8623000 2013.06.16 采纳率:47%    等级:12 已帮助:9954人 1.public 使用对象:类.接口.成员 介绍:无论它所处在的包定义在哪,该类(接口.成员) ...

  7. python怎么定义一个变量自增_Python语言中的自增运算

    本文主要向大家介绍了Python语言中的自增运算,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 接触过其他语言的同学可能都知道算数运算符里面有个自增运算符++, 在写循环的时候非 ...

  8. java script中定义的var变量怎么在body中使用,深入分析JavaScriptvar中的预解析与副作用...

    var的副作用 隐式全局变量和明确定义的全局变量间有些小的差异,就是通过delete操作符让变量未定义的能力. 通过var创建的全局变量(任何函数之外的程序中创建)是不能被删除的. 无var创建的隐式 ...

  9. python如何定义变量a_简述如何用Python定义一个变量类型?

    本文主要讲述了如何去定义一个Python变量,变量的概念基本上和初中代数的方程变量是一致的,只是在计算机程序中,变量不仅可以是数字,还可以是任意数据类型. 变量在程序中就是用一个变量名表示了,变量名必 ...

最新文章

  1. 【入门篇】如何正确使用机器学习中的训练集、验证集和测试集?
  2. matlab摆线等时性程序,摆的等时性实验报告.doc
  3. MDK升级后的头文件冲突
  4. 【转】ABP源码分析二十二:Navigation
  5. 论文浅尝 | emrKBQA: 一个面向临床医疗问答的KBQA数据集
  6. STM32工作笔记0031---基于STM32F103C8自己实现的跑马灯实验_使用STLINK调试
  7. Java技术简介及Tomcat部署
  8. 这7个问题,软件测试面试必问!!!
  9. Java异常处理机制(基础知识)
  10. 未来教育二级MS Office无纸化考试模拟软件
  11. haneWIN搭建Win10 NFS服务器
  12. 【国家集训队】跳跳棋(LCA+二分答案)
  13. 最准通达信强势顶底指标公式 副图 源码
  14. oracle误删了表怎么恢复数据,oracle误删除表或者表数据的恢复方法总结
  15. 模仿的网易和钱钱钱的腾讯
  16. NormalEstimation法向量估计理论和代码---PCL源码笔记
  17. 在vue项目中使用html2canvas截图(固定区域截图)
  18. FF新推荐弹窗怎么彻底让他爬
  19. 封装、继承、多态 通俗理解
  20. java物流网站的设计与实现

热门文章

  1. [luogu P1438] 无聊的数列
  2. matlab绘制函数的图像,在matlab内绘制函数图像
  3. EFCore 从入门到精通-8(再谈映射关系)
  4. 有趣的递归缩写(Recursive acronym)
  5. 只是我的执着依然执着 忘了谁是路人甲
  6. mysql 删除表数据但不删除表结构SQL语句
  7. vivo手机使用应用沙盒一键修改cpu参数
  8. 超无敌搞笑的 Q 版语文 ^_^
  9. kt-connect简单使用
  10. 水晶服务器维护,《新丝路》服务器维护公告