Python的Lambda函数用法详解

在Python中有两种函数,一种是def定义的函数,另一种是lambda函数,也就是大家常说的匿名函数。今天我就和大家聊聊lambda函数,在Python编程中,大家习惯将其称为表达式。

1.为什么要用lambda函数?

先举一个例子:将一个列表里的每个元素都平方。

先用def来定义函数,代码如下

def sq(x):
  return x*x 

map(sq,[y for y in range(10)]) 

再用lambda函数来编写代码

map(lambda x: x*x,[y for y in range(10)])

从这个简单的例子,我们可以看出,用lambda函数首先减少了代码的冗余,其次,用lambda函数,不用费神地去命名一个函数的名字,可以快速的实现某项功能,最后,lambda函数使代码的可读性更强,程序看起来更加简洁。

从上面这个简单的例子,也可以看出来lambda函数的语法是唯一的,其形式如下:

lambda argument_list:expersion

语法中的argument_list是参数列表,它的结构与Python中函数(function)的参数列表是一样的,例如

a,b
a=1,b=2
*args
**kwargs
a,b=1,*args
空
.... 

语法中的expression是一个关于参数的表达式,表达式中出现的参数需要在argument_list中有定义,并且表达式只能是单行的。比如以下的一些合法的表达式

1
None
a+b
sum(a)
1 if a >10 else 0
...... 

除了上面提到的lambda函数的优点外,我看有的文章说用lambda函数会提高效率,那究竟是不是呢?我们写一段代码来验证一下

import time 

# 测试的Def函数
def square1(n):
  return n ** 2 

# 测试的Lambda函数
square2 = lambda n: n ** 2 

print(time.time()) 

# 使用Def函数
i = 0
while i < 1000000000:
  square1(100)
  i += 1 

print(time.time()) 

# 使用lambda函数
i = 0
while i < 1000000000:
  square2(100)
  i += 1 

print(time.time()) 

1413272496.27
1413272703.05 (Def  函数:207s)
1413272904.49 (Lambda函数:201s) 

从上面可以看出,两种的所需的时间差不多,效率丝毫不受影响。

2.lambad函数的用法上面也讲到了匿名函数的优点,那它到底有哪些用处呢?

(1)直接赋给一个变量,然后再像一般函数那样调用

c=lambda x,y,z:x*y*z
c(2,3,4) 

24 

当然,也可以在函数后面直接传递实参

(lambda x:x**2)(3)
9

(2)将lambda函数作为参数传递给其他函数比如说结合map、filter、sorted、reduce等一些Python内置函数使用,下面举例说明。

fliter(lambda x:x%3==0,[1,2,3,4,5,6])
[3,6]
squares = map(lambda x:x**2,range(5)
print(lsit(squares))
[0,1,4,9,16] 

与sorted函数结合使用,比如:创建由元组构成的列表:

a=[('b',3),('a',2),('d',4),('c',1)]

按照第一个元素排序

sorted(a,key=lambda x:x[0])
[('a',2),('b',3),('c',1),('d',4)] 

按照第二个元素排序

sorted(a,key=lambda x:x[1])
[('c',1),('a',2),('b',3),('d',4)] 

与reduce函数结合使用

from functools import reduce
print(reduce(lambda a,b:'{},{}'.format(a,b),[1,2,3,4,5,6,7,8,9]))
1,2,3,4,5,6,7,8,9 

(3)嵌套使用将lambda函数嵌套到普通函数中,lambda函数本身做为return的值

def increment(n):
  return lambda x:x+n 

f=increment(4)
f(2)
6 

(4)字符串联合,有默认值,也可以用x=(lambda...)这种格式

x=(lambda x='Boo',y='Too',z='Z00':x+y+z)
print(x('Foo')) 

'FooTooZoo' 

(5)在tkinter中定义内联的callback函数

import sys
from tkinter import Button,mainloop 

x=Button(text='Press me',command=(lambda :sys.stdout.write('Hello,World\n')))
x.pack()
x.mainloop() 

这段代码还是挺有意思的,希望小伙伴们可以复制粘贴运行一下哈。(6)判断字符串是否以某个字母开头有

Names = ['Anne', 'Amy', 'Bob', 'David', 'Carrie', 'Barbara', 'Zach']
B_Name= filter(lambda x: x.startswith('B'),Names)
print(B_Name)
['Bob', 'Barbara'] 

(7)求两个列表元素的和

a = [1,2,3,4]
b = [5,6,7,8]
print(list(map(lambda x,y:x+y, a,b)))
[6,8,10,12] 

(8)求字符串每个单词的长度

sentence = "Welcome To Beijing!"
words = sentence.split()
lengths = map(lambda x:len(x),words)
print(list(lengths))
[7,2,8] 

总结

对于lambda函数的使用在Python社区一直存在争议,支持一方认为lambad函数的使用,使得Python代码更加紧凑,更加Pythonic;反对方则认为Python的lambda函数限制多多,最严重的当属于它只能由一条表达式组成,用多了以后反而使得程序看起来不那么清晰。

但我个人觉得作为一个Python的初级用户,lambda函数确实让编码更简洁,更省事,一句话好用就行,其余的看神仙打架吧!

以上所述是小编给大家介绍的Python的Lambda函数用法详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • 举例讲解Python的lambda语句声明匿名函数的用法

    所谓匿名函数,即是不需要定义函数,像表达式一样使用,不需要函数名(很多时候名字让我很困扰),一些简单的函数简单化, 举个例子 我需要两个整数相加的函数,通常是这么定义的 def add(x, y): return x + y 很好的完成了我需要的功能, 但是我现在需要一个数字与字符串相加的函数 def addstr(x, y): return x + str(y) 又一次完成了我的需求,但是 我突然需要两个整数相减,相除的功能这样函数就得 一直写下去, 但是使用lambda 匿名函数可以直接使用

  • Python lambda函数基本用法实例分析

    本文实例讲述了Python lambda函数基本用法.分享给大家供大家参考,具体如下: 这里我们简单学习一下python lambda函数. 首先,看一下python lambda函数的语法,如下: f=lambda [parameter1,parameter2,--]:expression lambda语句中,冒号前是参数,可以有0个或多个,用逗号隔开,冒号右边是返回值.lambda语句构建的其实是一个函数对象. 1>无参数 f=lambda :'python lambda!' >>&

  • 详解Python的Lambda函数与排序

    lambda函数是一种快速定义单行的最小函数,是从 Lisp 借用来的,可以用在任何需要函数的地方.下面的例子比较了传统的函数与lambda函数的定义方式. 前几天看到了一行求1000的阶乘的Python代码 Python代码 print reduce(lambda x,y:x*y, range(1, 1001)) 一下子被python代码的精简与紧凑所折服,故对代码进行了简单的分析. reduce与range都是Python的内置函数. range(1,1001)表示生成1到1000的连续整数

  • 简单介绍Python中的filter和lambda函数的使用

    filter(function or None, sequence),其中sequence 可以是list ,tuple,string.这个函数的功能是过滤出sequence 中所有以元素自身作... filter(function or None, sequence),其中sequence 可以是list ,tuple,string.这个函数的功能是过滤出sequence 中所有以元素自身作为参数调用function时返回True或bool(返回值)为True的元素并以列表返回. filter

  • python 用lambda函数替换for循环的方法

    场景如下: 现在有一个dataframe,其中一列为score,值从0-100, df: score 98 88 37 68 86 33 现在需要增加一列level,给这些分数分类,90分以上为A,60-90为B,60以下为C. 常用的方法肯定是使用for循环,对每一行进行处理. import pandas as pd list = [98,88,37,68,86,33] df = pd.DataFrame(list, columns=['score']) # convert list to d

  • python中lambda函数 list comprehension 和 zip函数使用指南

    lambda 函数 Python 支持一种有趣的语法,它允许你快速定义单行的最小函数.这些叫做 lambda 的函数,是从 Lisp 借用来的,可以用在任何需要函数的地方. def f(x): return x*2,用lambda函数来替换可以写成:g = lambda x: x*2`g(3)结果是6.(lambda x: x*2)(3)`也是同样的效果. 这是一个 lambda 函数,完成同上面普通函数相同的事情.注意这里的简短的语法:在参数列表周围没有括号,而且忽略了 return 关键字

  • python内置函数:lambda、map、filter简单介绍

    lambda lambda可以理解为一种小函数,但是它是一个表达式,而不是一个语句,所以在def不允许出现的地方仍然可以使用lambda函数,例如list里.但是lambda内只可以执行一个表达式. def f(x): return x**2 print f(3) a = lambda x: x**2 print a(3) a = lambda x,y: x+y print a(1,2) ~ 一个lambda语句就相当于一个函数定义,调用的时候也和函数一样. map函数 有时候我们可以需要处理一

  • Python的Lambda函数用法详解

    在Python中有两种函数,一种是def定义的函数,另一种是lambda函数,也就是大家常说的匿名函数.今天我就和大家聊聊lambda函数,在Python编程中,大家习惯将其称为表达式. 1.为什么要用lambda函数? 先举一个例子:将一个列表里的每个元素都平方. 先用def来定义函数,代码如下 def sq(x): return x*x map(sq,[y for y in range(10)]) 再用lambda函数来编写代码 map(lambda x: x*x,[y for y in r

  • python中sort()函数用法详解

    目录 1.函数sort()是对列表就地排序 2.函数sort()修改序列,不返回任何值 3.sorted()函数会返回一个排序列表,不改变原有序列 4.函数sort()是升序排序,如何降序排序,需要用到函数reverse() 5.函数sort()排序的高级用法 (1) key参数 (2) reverse参数 补充:python中sort的用法——对列表中的元素按关键字排序 总结 1.函数sort()是对列表就地排序 >>> x=[8,9,0,7,4,5,1,2,3,6] >>

  • python中getopt()函数用法详解

    目录 一.函数用法 二.示例 通过getopt模块中的getopt( )方法,我们可以获取和解析命令行传入的参数 一.函数用法 getopt(args, shortopts, longopts=[ ]) args:固定写法sys.argv[1:] shortopts:短参 字符串类型,限制命令行可传入的短参名称(命令行可不传参,如果传参,必须是指定的参数名,否则会报错) 参数名必须为单字符,前面使用单短横线(-) 命令行写法: -a 不带参数值形式 -b test_b 带参数值形式(中间空格可省

  • 详解Python的lambda函数用法

    lambda函数用法 lambda非常重要的一个定义.lambda在[运行时]才绑定,[不是]在定义的时候绑定.下面这个列子: 本意想:让X分别与0到1的数相加.x+0,x+1,x+2,x+3 实际运行结果是: 0 0 0 0 原因就是上面提到的,运行时才绑定.先运行的for循环,无法捕捉到循环. func = [lambda x: x + n for n in range(4)] # x+n,n是从0到3 For循环,x+0,x+1,x+3 for f in func: print(f(0))

  • Python中flatten( )函数及函数用法详解

    flatten()函数用法 flatten是numpy.ndarray.flatten的一个函数,即返回一个一维数组. flatten只能适用于numpy对象,即array或者mat,普通的list列表不适用!. a.flatten():a是个数组,a.flatten()就是把a降到一维,默认是按行的方向降 . a.flatten().A:a是个矩阵,降维后还是个矩阵,矩阵.A(等效于矩阵.getA())变成了数组.具体看下面的例子: 1.用于array(数组)对象 >>> from n

  • python isinstance函数用法详解

    这篇文章主要介绍了python isinstance函数用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 isinstance() 函数来判断一个对象是否是一个已知的类型类似 type(). isinstance() 与 type() 区别: type() 不会认为子类是一种父类类型,不考虑继承关系. isinstance() 会认为子类是一种父类类型,考虑继承关系. 如果要判断两个类型是否相同推荐使用 isinstance(). 语法

  • python yield和Generator函数用法详解

    这篇文章主要介绍了python yield和Generator函数用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 首先我们从一个小程序导入,各定一个list,找出其中的素数,我们会这样写 import math def is_Prims(number): if number == 2: return True //除2以外的所有偶数都不是素数 elif number % 2 == 0: return False //如果一个数能被除1和

  • python中的Json模块dumps、dump、loads、load函数用法详解

    目录 json的作用 python中的Json模块dumps.dump.loads.load函数用法详解 1.json.dumps()和loads() 2.json.dump()和json.load() 3.如何读取写入多行数据呢? json的作用 JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式 json.dumps(): 对数据进行编码,把python对象转换为字符串数据json.loads(): 对数据进行解码,把json的字符串转换为pyth

  • Python中itertools的用法详解

    iterator 循环器(iterator)是对象的容器,包含有多个对象.通过调用循环器的next()方法 (next()方法,在Python 3.x中),循环器将依次返回一个对象.直到所有的对象遍历穷尽,循环器将举出StopIteration错误. 在for i in iterator结构中,循环器每次返回的对象将赋予给i,直到循环结束.使用iter()内置函数,我们可以将诸如表.字典等容器变为循环器.比如 for i in iter([2, 4, 5, 6]): print i 标准库中的i

  • python正则-re的用法详解

    天在刷题的时候用到了正则,用的过程中就感觉有点不太熟练了,很久没有用正则都有点忘了.所以现在呢,我们就一起来review一下python中正则模块re的用法吧. 今天是review,所以一些基础的概念就不做介绍了,先来看正则中的修饰符以及它的功能: 修饰符 •re.I 使匹配对大小写不敏感 •re.L 做本地化识别匹配 •re.M 多行匹配,影响^和$ •re.S 使.匹配包括换行在内的所有字符 •re.U 根据Unicode字符集解析字符.这个标志影响\w \W \b \B •re.X 该标志

随机推荐