python lambda表达式,Python 匿名函数lambda是什么?
python lambda表达式,Python 匿名函数lambda是什么?详细介绍
本文目录一览: python Lambda 形式的使用?
4.7.5. Lambda 形式
出于实际需要,有几种通常在函数式编程语言例如 Lisp 中出现的功能加入到了 Python。通过 lambda 关键字,可以创建短小的匿名函数。这里有一个函数返回它的两个参数的和: lambda a, b: a+b。 Lambda 形式可以用于任何需要的函数对象。出于语法限制,它们只能有一个单独的表达式。语义上讲,它们只是普通函数定义中的一个语法技巧。类似于嵌套函数定义,lambda 形式可以从外部作用域引用变量:
>>> def make_incrementor(n):
... return lambda x: x + n
...
>>> f = make_incrementor(42)
>>> f(0)
42
>>> f(1)
43
上面的示例使用 lambda 表达式返回一个函数。另一个用途是将一个小函数作为参数传递:
>>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
>>> pairs.sort(key=lambda pair: pair[1])
>>> pairs
[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two
python的lambda函数是什么?
Lambda 表达式是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象,是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包。
而且Lambda表达式非常好用,可以让代码简单、简洁。
Python——Lambda表达式是一个匿名函数,Lambda 表达式基于数学中的lambda演算得名,直接对应于其中的 lambda 抽象,是一个匿名函数,即没有函数名的函数。
Python由荷兰数学和计算机科学研究学会的Guido van Rossum 于1990 年代初设计,作为一门叫做ABC语言的替代品。Python提供了高效的高级数据结构,还能简单有效地面向对象编程。
Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。
Python解释器易于扩展,可以使用C或C++(或者其他可以通过C调用的语言)扩展新的功能和数据类型。Python 也可用于可定制化软件中的扩展程序语言。Python丰富的标准库,提供了适用于各个主要系统平台的源码或机器码。
扩展资料:
python的发展历程:
自从20世纪90年代初Python语言诞生至今,它已被逐渐广泛应用于系统管理任务的处理和Web编程。
Python的创始人为荷兰人吉多·范罗苏姆。1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。之所以选中Python(作为该编程语言的名字,是取自英国20世纪70年代首播的电视喜剧《蒙提·派森的飞行马戏团》。
ABC是由Guido参加设计的一种教学语言。就Guido本人看来,ABC这种语言非常优美和强大,是专门为非专业程序员设计的。但是ABC语言并没有成功,究其原因,Guido认为是其非开放造成的。Guido决心在Python中避免这一错误。同时,他还想实现在ABC中闪现过但未曾实现的东西。
就这样,Python在Guido手中诞生了。可以说,Python是从ABC发展起来,主要受到了Modula-3(另一种相当优美且强大的语言,为小型团体所设计的)的影响。并且结合了Unix shell和C的习惯。
Python的几个高级语法概念浅析(lambda表达式闭包装饰器)
1. 匿名函数匿名函数(anonymous function)是指未与任何标识符绑定的函数,多用在functional programming languages领域,典型应用场合:1) 作为参数传给高阶函数(higher-order function ),如python中的built-in函数filter/map/reduce都是典型的高阶函数2) 作为高阶函数的返回值(虽然此处的"值"实际上是个函数对象)与命名函数(named function)相比,若函数只被调用1次或有限次,则匿名函数在语法上更轻量级。具体语法上,python通过lambda语法支持函数体为表达式的匿名函数,即:python的lambda表达式本质上是个匿名函数,但其函数体只能是个表达式,不能包含其它语句。此外,高级动态语言常借助匿名函数实现闭包(closure)或装饰器(decorator)等高级语法。在一些场合下,lambda表达式的使用使得python程序看起来非常简洁。例如,下面是根据value对dict元素做排序的代码示例:>>> foo = {'father' : 65, 'mother' : 62, 'sister' : 38, 'brother' : 29, 'me' : 28}>>> sorted(foo.iteritems(), key=lambda x: x[1])[('me', 28), ('brother', 29), ('sister', 38), ('mother', 62), ('father', 65)]2. 闭包闭包(closure)本质上是一个包含了其引用环境(referencing environment)的函数或函数引用,这里的"引用环境"通常由一张表来维护,该表存储了函数体会访问的非局部变量(non-local variables)的引用。与C语言中的函数指针相比,闭包允许嵌套函数访问其作用域外的non-local变量,这与Python解释器对变量的作用域查找规则有关(Python支持LEGB的查找规则,想深究的话,可以参考
第4版第17章Scopes关于作用域及查找规则的详细讲解,或者查看这篇文章 做快速了解)。对于运行时内存分配模型会在线性栈上创建局部变量的语言来说(典型如C语言),通常很难支持闭包。因为这些语言底层实现中,若函数返回,则函数中定义的局部变量均会随着函数栈被回收而销毁。但闭包在底层实现上要求其要访问的non-local变量在闭包被执行的时候保持有效,直到这个闭包的生命周期结束,这意外着这些non-local变量只有在其确定不再被使用时才能销毁,而不能随着定义这些变量的函数返回销毁。因此,天生支持闭包的语言通常采用garbage collection的方式管理内存,因为gc机制保证了变量只有不再被引用时才会由系统销毁并回收其内存空间。具体语法上,闭包通常伴随着函数嵌套定义。以Python为例,一个简单的闭包示例如下:#!/bin/env python#-*- encoding: utf-8 -*- def startAt_v1(x): def incrementBy(y): return x + y print 'id(incrementBy)=%s' % (id(incrementBy)) return incrementBy def startAt_v2(x): return lambda y: x + y if '__main__' == __name__: c1 = startAt_v1(2) print 'type(c1)=%s, c1(3)=%s' % (type(c1), c1(3)) print 'id(c1)=%s' % (id(c1)) c2 = startAt_v2(2) print 'type(c2)=%s, c2(3)=%s' % (type(c2), c2(3))执行结果如下:id(incrementBy)=138009782type(c1)=
, c1(3)=5id(c1)=138009782type(c2)=
, c2(3)=5上述示例中,startAt_v1和startAt_v2均实现了闭包,其中:v1借助嵌套定义函数实现;v2则借助lambda表达式/匿名函数来实现。我们以v1为例对闭包做说明:1) 函数startAt_v1接受1个参数,返回1个函数对象,而这个函数对象的行为由嵌套定义的函数incrementBy实现。2) 对函数incrementBy来说,变量x就是所谓的non-local变量(因为x既非该函数定义的局部变量,又非普通意义上的全局变量),incrementBy实现具体的函数行为并返回。3) main入口的c1接收到的返回值是个函数对象,从id(incrementBy) == id(c1)可断定,c1"指向"的对象与函数名incrementBy"指向"的其实是同一个函数对象。4) 受益于Python对闭包的支持,与普通函数的对象相比,c1指向的对象可以访问不在其函数作用域内的non-local变量,而这个变量是由incrementBy的外层包装函数startAt_v1的入参提供的,于是,相当于c1指向的函数对象对其外层包装函数的入参具有"记忆"功能,通过调用外层包装函数创建闭包时,不同的入参被内层函数作为引用环境维护起来。5) 调用c1(3)时,传入的参数与引用环境维护的外层包装函数的参数一起运算得到最终结果。以上步骤分析说明了一个闭包从创建到执行的基本原理,理解这个case后,闭包的概念也应该清晰了。3. 装饰器python支持装饰器(decorator)语法。装饰器的概念对于初学者来说比较晦涩,因为它涉及到函数式编程的几个概念(如匿名函数、闭包),这也是本文先介绍匿名函数和闭包的原因。我们引用这篇文章对装饰器的定义:A decorator is a function that takes a function object as an argument, and returns a function object as a return value.从这个定义可知,装饰器本质上只是一个函数,它借助闭包的语法去修改一个函数(又称被装饰函数)的行为,即decorator其实是个闭包函数,该函数以被装饰函数名(这个函数名其实是一个函数对象的引用)作为入参,在闭包内修改被装饰函数的行为后,返回一个新的函数对象。特别说明:decorator并非必须以函数形式出现,它可以是任何可被调用的对象,例如它也可以class形式出现,参见这篇文章给出的例子。在定义好函数装饰器的前提下,当外部调用这个被装饰函数时,decorator的语法糖会由Python解释器解释为先执行装饰器函数,然后在装饰器返回的新函数对象上继续执行其余语句。来个实例分析一下:#!/bin/env python#-*- encoding: utf-8 -*- def wrapper(fn): def inner(n, m): n += 1 print 'in inner: fn=%s, n=%s, m=%s' % (fn.__name__, n, m) return fn(n, m) + 6 // 这里有return且返回值为int对象 return inner @wrapperdef foo(n, m): print 'in foo: n=%s, m=%s' % (n, m) return n * m print foo(2, 3)上面的示例中,foo通过@wrapper语法糖声明它的装饰器是wrapper,在wrapper中,定义了嵌套的inner函数(该函数的参数列表必须与被装饰函数foo的参数列表保持一致),装饰器wrapper修改foo的行为后,返回inner(注意:由于inner的返回值是个int对象,故wrpper最终返回的也是个int对象)。调用foo(2, 3)时,Python解释器先调用wrapper对foo做行为改写,然后返回int对象,不难推测,上述代码的执行结果如下:in inner: fn=foo, n=3, m=3in foo: n=3, m=3foo(2, 3)=15更多Python的几个高级语法概念浅析(lambda表达式闭包装饰器)相关文章请关注PHP中文网!
Python中的匿名函数——lambda函数
在Python中,lambda函数是一个简单的匿名函数。该函数没有函数名,它可以有多个参数,但函数只由一个表达式构成。
lambda函数具体的格式如下:
lambda 参数 : 表达式
其中, lambda 是关键字, 参数 是函数的参数,可以有0至多个。冒号后面是表达式,也是该函数中的唯一的表达式,lambda函数会返回该表达式的返回值。
我们来看一个具体的例子。
在上述代码中,number1, number2是lambda函数的参数,number1**2+number**2是函数的表达式,该函数返回number1, number2两个数的平方和。
上述代码创建了一个lambda函数后将其赋值给变量sum_square, 在print函数中通过sum_square来调用这个lambda函数。
上述的lambda函数完全可用标准的函数来实现,我们可以将上述代码改写成下面的代码。
在代码中,定义了函数sum_square,该函数包含两个参数,并执行一条语句并将该语句的执行结果作为函数返回值。通过上述代码可以帮助我们更直观地理解lambda函数。
lambda函数的可读性较差,那么为什么要有这样奇怪的匿名函数呢?这个要从lambda的使用场合说起。我们来看下面的代码。
上述代码定义了一个数值列表,调用python的内置函数filter来生成一个新的迭代器。 filter函数的第一个参数为一个函数,用于决定过滤的方法;第二个参数为一个可迭代的对象如列表、集合等。filter函数返回一个新的迭代器, 用于获得满足第一个函数为真的所有元素。在上述代码中,我们给filter传递的第一个参数是一个匿名函数:lambda number:number%3==0, 该函数在一个数整除3时为True,否则为False. filter函数会创建一个新的迭代器,通过调用上述匿名函数来判断该元素是否满足条件,得到所有3的倍数的数。
当然,上述代码也可以使用正常的函数方式来实现,如下所示:
我们可以看到,所有匿名函数的功能都可以通过标准函数来实现。匿名函数常在调用其它函数(如filter, map等)时作为参数使用。使用匿名函数可以使代码更为精简。匿名函数主要用于完成简单的任务,如果匿名函数过于复杂,会导致可读性较差,调试起来也比较困难,因此,强烈不建议使用lambda写天书般的代码。总之,要根据实际情况决定是否使用匿名函数。
学生如何写好Ph的Lambda函数
如何写好Python Lambda函数
如何写好Python的Lambda函数
当你需要完成一件小工作时,在本地环境中使用这个函数,可以
让工作如此得心应手, 它就是Lambda函数。
Lambda函数是Python中的匿名函数。有些人将它们简称为
lambdas, 它们的语法如下:
lambda arguments:expression
lambda关键字可以用来创建一个lambda函数, 紧跟其后的
是参数列表和用冒号分割开的单个表达式。例如, lambda x: 2
*x是将任何输入的数乘2, 而lambda x, y:x+y是计算两个
数字的和。语法十分直截了当,对吧?
假设你知道什么是lambda函数, 这里为你提供有关如何正确使
用lambda函数的一些常规准则。
1.不要返回任何值
看看语法, 您可能会注意到我们在lambda函数中并没有返回任
何内容。这都是因为lambda函数只能包含一个表达式。然而,
使用return关键字会构成不符合规定语法的语句, 如下所示:
如何写好Python的Lambda函数
该错误可能是由于无法区分表达式和语句而引起的。像是包含
return、try、with以及if的语句会执行特殊动作。然而, 表
达式指的是那些可以被计算出一个值的表达,例如数值或其他
Python对象。
通过使用lambda函数, 单个表达式会被计算为一个值并且参与
后续的计算, 例如由sorted函数排序。
2.不要忘记更好的选择
lambda函数最常见的使用场景是将它作为一些内置工具函数中
key的实参, 比如上面展示的sorted() 和max() 。根据情况
,我们可以使用其他替代方法。思考下面的例子:
如何写好Python的Lambda函数
在数据科学领域, 很多人使用pandas库来处理数据。如下所示
, 我们可以使用lambda函数通过map() 函数从现有数据中创
建新数据。除了使用lambda函数外, 我们还可以直接使用算术
函数, 因为pandas是支持的:
如何写好Python的Lambda函数
3.不要将它赋值给变量
对lambda函数命名的唯一作用可能是出于教学目的, 以表明
lambda函数的确是和其他函数一样的函数——可以被调用并且
具有某种功能。除此之外, 我们不应该将lambda函数赋值给变
量。
为lambda函数命名的问题在于这使得调试不那么直观。与其他
的使用常规def关键字创建的函数不同, lambda函数没有名
字,这也是为什么有时它们被称为匿名函数的原因。思考下面简
单的例子:
如何写好Python的Lambda函数
当您的代码存在关于lambda函数的问题(即in versi veO)
, Traceback错误信息只会提示您lambda函数存在问题。
相比之下, 使用正常定义的函数, Traceback会清晰地提示您有
问题的函数(即inver sive 1) 。
与此相关, 如果您想多次使用lambda函数, 最佳实践是使用通
过def定义的允许使用文档字符串的常规函数。
4.不要忘记列表推导式
有些人喜欢将lambda函数和高阶函数一起使用, 比如map
或filter。思考下面用法示例:
我们可以使用可读性更强的列表推导式代替lambda函数。如下
所示,我们使用列表推导式来创建相同的列表对象。与列表推导
如何写好Python的Lambda函数
式相比, 之前将map或filter函数与lambda函数一起使用
更麻烦。因此,在创建涉及高阶函数的列表时,应考虑使用列表
推导式。
通过避免这些错误, 你应该能在代码中正确使用lambda函数。
使用lambda函数的经验准则是保持简单以及只在本地使用一次
Python 匿名函数lambda是什么?
在Python语言中除了def语句用来定义函数之外,还可以使用匿名函数lambda,它是Python一种生成函数对象的表达式形式。匿名函数通常是创建了可以被调用的函数,它返回了函数,而并没有将这个函数命名。lambda有时被叫做匿名函数也就是这个原因,需要一个函数,又不想动脑筋去想名字,这就是匿名函数。
#-*- coding:utf-8 -*-#__author__ = "www.iplaypy.com" # 普通python函数def func(a,b,c): return a+b+c print func(1,2,3)# 返回值为6 # lambda匿名函数f = lambda a,b,c:a+b+c print f(1,2,3)# 返回结果为6# 注意观察上面的Python示例代码,f = lambda a,b,c:a+b+c 中的关键字lambda表示匿名函数,# 冒号:之前的a,b,c表示它们是这个函数的参数。# 匿名函数不需要return来返回值,表达式本身结果就是返回值。
python3 lambda表达式函数
返回的是一个函数。。。
lambda 就是匿名函数。。。函数一般是接收(可以不接受)参数,执行特定的功能,然后返回(返回可以为空)
lambda x:x%n > 0,意思是这个匿名干了一件事,什么事呢,就是用函数的参数,对n取模后,判断是否大于0。其实就是判断函数的参数,是否是n的整数倍。然后返回的是这个匿名函数,然后_not_divisible函数再把这个匿名函数返回给调用者。
所以,bk就是一个函数。但这个函数可以通过n去控制
比如,调用divi_5 = _not_divisible(5),返回的是一个函数,这个函数接受一个参数,如果参数可以整除5,就返回False,否则True
怎么用呢?divi_5现在是指向到一个函数了,所以,它就是函数喽
divi_5(10)
lambda你可以理解为一个函数生成器,他返回的是一个函数,比如你代码中的lambda x:x%n意思就是返回一个函数,这个函数的作用是算X%n的值.所以返回的return bk之后,bk成了一个函数这个函数接收一个参数X
我也刚学到这卡了,网上找的这个理解起来比较舒服一点
下面是自己总结的,运行也能成功。答案也是对的。。
_not_divisible(n)返回值是一个函数,这个函数接收一个(X)参数
_not_divisible(n)(X)
python lambda函数用法?
在 Python 中,lambda函数是一种匿名函数,即定义函数的方式不同于通常的定义函数的方式。 lambda 函数通常被用来简化程序代码。
例如,下面是一个定义普通函数的例子:
def add(x, y):
return x y
使用 lambda 函数,我们可以将上面的函数简化为:
add = lambda x, y: x y
上面的 lambda 函数定义了两个参数 x 和 y,并返回了两个参数的和。
lambda 函数的一个重要特点是,它仅能包含一个表达式,因此通常非常短小。
另一个使用 lambda 函数的常见场景是将函数作为参数传递给另一个函数。例如:
def my_func(f, x, y):
return f(x, y)
result = my_func(lambda x, y: x y, 2, 3)
在上面的代码中,我们将 lambda 函数 lambda x, y: x y 作为参数传递给了函数 my_func,并使用它来计算两个数的和。
总之,lambda 函数是一种很有用的工具,可以帮助我们简化程序代码。
#元组组成列表lst
#lst按组成列表中的
元素-元组的
第二个元素的字母的
a~z升序排序为:
[(4, 'four'),
(1, 'one'),
(3, 'three'),
(2, 'two')]
#返回列表lst的第4个元组
(2,"two")中的
第二个元素"two"的
第三个字符"o"
这里lambda x的x是函数的参数,是lst的元素(这里是一个元组),
x[1]是函数的返回值,是lst元素(元组)的第2个元素即字符串,
所以,lst.sort(key=lambda x:x[1])是以lst元素(元组)的第二个元素为key排序,默认为升序
排序后的lst为[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]
print(lst[3][1][2])是打印排序后的lst中的第4个元素(元组)的第2个元素(字符串)的第3个字符,结果就是打印字符串two的字符o
python中lambda x:lambda :x2作何理解?
我也遇到这个问题,仔细研究了一下,现在说一下。
这是一个lambda表达式,返回值是一个lambda函数。你应该这么读:
lambda
x:
(lambda:
x**2),
这是两个lambda函数嵌套,第一个lambda输入x,返回lambda:
x**2,
第二个lambda没有输入,返回x**2,其中返回式的x是源自于第二个lambda表达式的闭包(可以理解为第一个lambda表达式的函数空间)。
如果写成函数式的方法,可能更好理解。
def
lambda1(x):
def
lambda2():
return
x**2
return
lambda2
这种嵌套的函数常用于装饰器,或者函数式编程。我遇到的情况是为了保存闭包。