精华内容
下载资源
问答
  • lambdaPython编程语言中使用频率较高的一个关键字。那么,什么是lambda?它有哪些用法?网上的文章汗牛充栋,可是把这个讲透的文章却不多。这里,我们通过阅读各方资料,总结了关于Python中的lambda的“一个语法,...

    lambda是Python编程语言中使用频率较高的一个关键字。那么,什么是lambda?它有哪些用法?网上的文章汗牛充栋,可是把这个讲透的文章却不多。这里,我们通过阅读各方资料,总结了关于Python中的lambda的“一个语法,三个特性,四个用法,一个争论”。欢迎阅读和沟通(个人微信: fibona007)。

    由于文章是从我的公众号上复制过来的,因此排版不整齐,但是内容绝对充实,欢迎关注公众号[测试不将就],阅读原文

    一个语法

    在Python中,lambda的语法是唯一的。其形式如下:

     lambda argument_list: expression

    其中,lambda是Python预留的关键字,argument_list和expression由用户自定义。具体介绍如下。

    1. 这里的argument_list是参数列表,它的结构与Python中函数(function)的参数列表是一样的。具体来说,argument_list可以有非常多的形式。例如:

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

    2. 这里的expression是一个关于参数的表达式。表达式中出现的参数需要在argument_list中有定义,并且表达式只能是单行的。以下都是合法的表达式:

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

    3.  这里的lambda argument_list: expression表示的是一个函数。这个函数叫做lambda函数。

     

    三个特性

    lambda函数有如下特性:

    1. lambda函数是匿名的:所谓匿名函数,通俗地说就是没有名字的函数。lambda函数没有名字。

    2. lambda函数有输入和输出:输入是传入到参数列表argument_list的值,输出是根据表达式expression计算得到的值。

    3. lambda函数一般功能简单:单行expression决定了lambda函数不可能完成复杂的逻辑,只能完成非常简单的功能。由于其实现的功能一目了然,甚至不需要专门的名字来说明。

    下面是一些lambda函数示例:

    •       lambda x, y: x*y;函数输入是x和y,输出是它们的积x*y
    •      lambda:None;函数没有输入参数,输出是None
    •      lambda *args: sum(args); 输入是任意个数的参数,输出是它们的和(隐性要求是输入参数必须能够进行加法运算)
    •      lambda **kwargs: 1;输入是任意键值对参数,输出是1

     

    四个用法

     

    由于lambda语法是固定的,其本质上只有一种用法,那就是定义一个lambda函数。在实际中,根据这个lambda函数应用场景的不同,可以将lambda函数的用法扩展为以下几种:

    1. 将lambda函数赋值给一个变量,通过这个变量间接调用该lambda函数

      例如,执行语句add=lambda x, y: x+y,定义了加法函数lambda x, y: x+y,并将其赋值给变量add,这样变量add便成为具有加法功能的函数。例如,执行add(1,2),输出为3。

    2. 将lambda函数赋值给其他函数,从而将其他函数用该lambda函数替换

    例如,为了把标准库time中的函数sleep的功能屏蔽(Mock),我们可以在程序初始化时调用:time.sleep=lambda x:None。这样,在后续代码中调用time库的sleep函数将不会执行原有的功能。例如,执行time.sleep(3)时,程序不会休眠3秒钟,而是什么都不做。

          3. 将lambda函数作为其他函数的返回值,返回给调用者。

    函数的返回值也可以是函数。例如return lambda x, y: x+y返回一个加法函数。这时,lambda函数实际上是定义在某个函数内部的函数,称之为嵌套函数,或者内部函数。对应的,将包含嵌套函数的函数称之为外部函数。内部函数能够访问外部函数的局部变量,这个特性是闭包(Closure)编程的基础,在这里我们不展开。

          4. 将lambda函数作为参数传递给其他函数

    部分Python内置函数接收函数作为参数。典型的此类内置函数有这些。

    • filter函数。此时lambda函数用于指定过滤列表元素的条件。例如filter(lambda x: x % 3 == 0, [1, 2, 3])指定将列表[1,2,3]中能够被3整除的元素过滤出来,其结果是[3]。

    • sorted函数。此时lambda函数用于指定对列表中所有元素进行排序的准则。例如sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))将列表[1, 2, 3, 4, 5, 6, 7, 8, 9]按照元素与5距离从小到大进行排序,其结果是[5, 4, 6, 3, 7, 2, 8, 1, 9]。

    • map函数。此时lambda函数用于指定对列表中每一个元素的共同操作。例如map(lambda x: x+1, [1, 2,3])将列表[1, 2, 3]中的元素分别加1,其结果[2, 3, 4]。

    • reduce函数。此时lambda函数用于指定列表中两两相邻元素的结合条件。例如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]中的元素从左往右两两以逗号分隔的字符的形式依次结合起来,其结果是'1, 2, 3, 4, 5, 6, 7, 8, 9'。

    另外,部分Python库函数也接收函数作为参数,例如gevent的spawn函数。此时,lambda函数也能够作为参数传入。

     

    一个争议

    事实上,关于lambda在Python社区是存在争议的。Python程序员对于到底要不要使用lambda意见不一致。

    • 支持方认为使用lambda编写的代码更紧凑,更“pythonic”。

    • 反对方认为,lambda函数能够支持的功能十分有限,其不支持多分支程序if...elif...else...和异常处理程序try ...except...。并且,lambda函数的功能被隐藏,对于编写代码之外的人员来说,理解lambda代码需要耗费一定的理解成本。他们认为,使用for循环等来替代lambda是一种更加直白的编码风格。

    关于lambda的争执没有定论。在实际中,是否使用lambda编程取决于程序员的个人喜好。

    以上就是我们总结的关于Python中的lambda的“一个语法,三个特性,四个用法,一个争论”。如有纰漏之处,欢迎批评指正。

     

    作者:软件工程专家/全栈测试开发/技术写作者,欢迎添加作者微信(fibona007)交流。欢迎微信关注个人公号"测试不将就"(ID: awesometest),我们一起探讨高质量软件养成之道。

     
     
     
     
     
     
     
    展开全文
  • 前几天看到了一行求1000的阶乘的Python代码:print reduce ( lambda x , y : x * y , range ( 1 , 1001 ))一下子被python代码的精简 与紧凑所折服,故对代码进行了简单的分析。reduce与range都是Python的内置函数。...

    前几天看到了一行求1000的阶乘的Python代码:

    print reduce ( lambda x , y : x * y , range ( 1 , 1001 ))

    一下子被python代码的精简 与紧凑所折服,故对代码进行了简单的分析。

    reduce与range都是Python的内置函数。

    range(1,1001) 表示生成1到1000的连续整数列表(List)。

    reduce(functionA,iterableB),functionA为需要两 个变量的函数,并返回一个值。iterableB为可迭代变量,如List等。reduce函数将B中的元素从左到右依次传入函数A中,再用函数A返回的 结果替代传入的参数,反复执行,则可将B reduce成一个单值。在此,是将1到1000的连续整数列表传入lambda函数并用两个数的积替换列表中的数,实际的计算过程为:(... ((1×2)×3)×4)×...×1000),最后的结果即1000的阶乘。

    下面来介绍一下lambda函数。

    lambda 函数是一种快速定义单行的最小函数,是从 Lisp 借用来的,可以用在任何需要函数的地方。下面的例子比较了传统的函数与lambda函数的定义方式:

    1 >>> def f ( x ,y):

    2 ... return x * y

    3 ... 4 >>> f ( 2,3 )

    5 6

    6 >>> g = lambda x ,y: x * y

    7 >>> g ( 2,3 )

    8 6

    可以看到,两个函数 得到的结果一样,而对于实现简单功能的函数来说,使用lambda函数来定义更加精简灵活,还可以直接把函数赋值给一个变量,用变量名来表示函数名。

    其实lambda函数在很多时候都是不需要赋值给一个变量的(如前文中求阶乘的过程)。

    使用lambda函数还有一些注意事项:

    lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值。

    lambda 函数不能包含命令,包含的表达式不能超过一个。

    下面简单演示一下如何使用lambda函数实现自定义排序。

    01 class People :

    02 age = 0

    03 gender = 'male'

    04

    05 def __init__ ( self , age , gender ): 06 self . age = age 07 self . gender = gender

    08 def toString ( self ):

    09 return 'Age:' + str ( self . age ) + ' /t Gender:' + self . gender

    10

    11 List = [ People ( 21 , 'male' ), People ( 20 , 'famale' ), People ( 34 , 'male' ), People ( 19 , 'famale' )]

    12 print 'Befor sort:'

    13 for p in List :

    14 print p . toString ()

    15

    16 List . sort ( lambda p1 , p2 : cmp ( p1 . age , p2 . age ))

    17 print ' /n After ascending sort:'

    18 for p in List :

    19 print p . toString ()

    20

    21 List . sort ( lambda p1 , p2 : - cmp ( p1 . age , p2 . age ))

    22 print ' /n After descending sort:'

    23 for p in List :

    24 print p . toString ()

    上面的代码定义了一个People类,并通过lambda函数,实现了对包含People类对象的列表按照People的年龄,进行升 序和降序排列。运行结果如下:

    Befor sort:

    Age:21 Gender:male

    Age:20 Gender:famale

    Age:34 Gender:male

    Age:19 Gender:famale

    After ascending sort:

    Age:19 Gender:famale

    Age:20 Gender:famale

    Age:21 Gender:male

    Age:34 Gender:male

    After descending sort:

    Age:34 Gender:male

    Age:21 Gender:male

    Age:20 Gender:famale

    Age:19 Gender:famale

    lambda 语句被用来创建新的函数对象,并且在运行时返回它们。

    例15.2 使用lambda形式

    #!/usr/bin/python

    # Filename: lambda.py

    defmake_repeater (n):

    return lambdas: s*n

    twice = make_repeater( 2 )

    printtwice( 'word' )

    printtwice( 5 )

    (源 文件:code/lambda.py)

    输出

    $ python lambda.py

    wordword

    10

    它如何工作

    这里,我们使用了make_repeater 函 数在运行时创建新的函数对象,并且返回它。lambda 语句用来创建函数对象。本质上,lambda 需 要一个参数,后面仅跟单个表达式作为函数体,而表达式的值被这个新建的函数返回。注意,即便是print 语句也不能用在 lambda形式中,只能使用表达式。

    展开全文
  • python列表排序

    千次阅读 2013-07-17 11:19:08
    python列表排序 简单记一下python中List的sort方法(或者sorted内建函数)的用法。 关键字: python列表排序 python字典排序 sorted List的元素可以是各种东西,字符串,字典,自己定义的类等。 sorted函数用法...

    http://wiki.python.org/moin/HowTo/Sorting?highlight=%28howto%29#The_Old_Way_Using_the_cmp_Parameter

    python列表排序

    简单记一下python中List的sort方法(或者sorted内建函数)的用法。

    关键字:
    python列表排序 python字典排序 sorted


    List的元素可以是各种东西,字符串,字典,自己定义的类等。

    sorted函数用法如下:
    Python代码  收藏代码
    1. sorted(data, cmp=None, key=None, reverse=False)  

    其中,data是待排序数据,可以使List或者iterator, cmp和key都是函数,这两个函数作用与data的元素上产生一个结果,sorted方法根据这个结果来排序。
    cmp(e1, e2) 是带两个参数的比较函数, 返回值: 负数: e1 < e2, 0: e1 == e2, 正数: e1 > e2. 默认为 None, 即用内建的比较函数.
    key 是带一个参数的函数, 用来为每个元素提取比较值. 默认为 None, 即直接比较每个元素.
    通常, key 和 reverse 比 cmp 快很多, 因为对每个元素它们只处理一次; 而 cmp 会处理多次.

    通过例子来说明sorted的用法:

    1. 对由tuple组成的List排序
    Python代码  收藏代码
    1. >>> students = [('john''A'15), ('jane''B'12), ('dave''B'10),]  


    用key函数排序(lambda的用法见 注释1)
    Python代码  收藏代码
    1. >>> sorted(students, key=lambda s : s[2])   # sort by age  
    2. [('dave''B'10), ('jane''B'12), ('john''A'15)]  


    用cmp函数排序
    Python代码  收藏代码
    1. >>> sorted(students, cmp=lambda x,y : cmp(x[2], y[2])) # sort by age  asc
    2. [('dave''B'10), ('jane''B'12), ('john''A'15)]  
    年龄倒序(详见末尾):
    1. >>> sorted(students, cmp=lambda x,y : cmp(y[2], x[2])) # sort by age desc,交换x/y的位置
    2. [('john''A'15), ('jane''B'12),('dave''B'10)

    用 operator 函数来加快速度, 上面排序等价于:(itemgetter的用法见 注释2)
    1. >>> from operator import itemgetter, attrgetter  
    2. >>> sorted(students, key=itemgetter(2))  


    用 operator 函数进行多级排序
    Python代码  收藏代码
    1. >>> sorted(students, key=itemgetter(1,2))  sort by grade then by age  
    2. [('john''A'15), ('dave''B'10), ('jane''B'12)]  



    2. 对由字典排序
    Python代码  收藏代码
    1. >>> d = {'data1':3'data2':1'data3':2'data4':4}  
    2. >>> sorted(d.iteritems(), key=itemgetter(1), reverse=True)  
    3. [('data4'4), ('data1'3), ('data3'2), ('data2'1)]  

    from operator import itemgetter,attrgetter
    d = {'data1':3,'data2':1,'data3':2,'data4':4}

    print d.items()
    print sorted(d.iteritems(),key = itemgetter(0)) #根据字典的键进行排序
    print sorted(d.iteritems(),key = itemgetter(1)) #根据字典的值进行排序


    注释1
    参考:http://jasonwu.me/2011/10/29/introduce-to-python-lambda.html

    注释2
    参考:http://ar.newsmth.net/thread-90745710c90cf1.html
    class itemgetter(__builtin__.object)
    |  itemgetter(item, ...) --> itemgetter object
    |
    |  Return a callable object that fetches the given item(s) from its operand.
    |  After, f=itemgetter(2), the call f(r) returns r[2].
    |  After, g=itemgetter(2,5,3), the call g(r) returns (r[2], r[5], r[3])

    相当于
    Python代码  收藏代码
    1. def itemgetter(i,*a):   
    2.     def func(obj):   
    3.         r = obj[i]   
    4.         if a:   
    5.             r = (r,) + tuple(obj[i] for i in a)   
    6.         return r   
    7.     return func   
    8.   
    9. >>> a = [1,2,3]   
    10. >>> b=operator.itemgetter(1)   
    11. >>> b(a)   
    12. 2   
    13. >>> b=operator.itemgetter(1,0)   
    14. >>> b(a)   
    15. (21)   
    16. >>> b=itemgetter(1)   
    17. >>> b(a)   
    18. 2   
    19. >>> b=itemgetter(1,0)   
    20. >>> b(a)   
    21. (21)  


    In Py2.x, sort allowed an optional function which can be called for doing thecomparisons. That function should take two arguments to be compared andthen return a negative value for less-than, return zero if they are equal,or return a positive value for greater-than. For example, we can do:

    >>> def numeric_compare(x, y):
            return x - y
    >>> sorted([5, 2, 4, 1, 3], cmp=numeric_compare)
    [1, 2, 3, 4, 5]

    Or you can reverse the order of comparison with:

    >>> def reverse_numeric(x, y):
            return y - x
    >>> sorted([5, 2, 4, 1, 3], cmp=reverse_numeric)
    [5, 4, 3, 2, 1]

    list.sort() method is only defined for lists. In contrast, the sorted() function accepts any iterable.

    >>> sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'})
    [1, 2, 3, 4, 5]

    展开全文
  • lambda函数是一种快速定义单行的...前几天看到了一行求1000的阶乘的Python代码Python代码print reduce(lambda x,y:x*y, range(1, 1001))一下子被python代码的精简与紧凑所折服,故对代码进行了简单的分析。reduce...

    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的连续整数列表(List)。

    reduce(functionA,iterableB),functionA为需要两个变量的函数,并返回一个值。iterableB为可迭代变量,如List等。reduce函数将B中的元素从左到右依次传入函数A中,再用函数A返回的结果替代传入的参数,反复执行,则可将B reduce成一个单值。在此,是将1到1000的连续整数列表传入lambda函数并用两个数的积替换列表中的数,实际的计算过程为:(...((1×2)×3)×4)×...×1000),最后的结果即1000的阶乘。

    下面来介绍一下lambda函数。

    lambda函数是一种快速定义单行的最小函数,是从 Lisp 借用来的,可以用在任何需要函数的地方。下面的例子比较了传统的函数与lambda函数的定义方式:

    >>> def f(x,y):

    ... return x*y

    ...

    >>> f(2,3)

    >>> g = lambda x,y: x*y

    >>> g(2,3)

    可以看到,两个函数得到的结果一样,而对于实现简单功能的函数来说,使用lambda函数来定义更加精简灵活,还可以直接把函数赋值给一个变量,用变量名来表示函数名。

    其实lambda函数在很多时候都是不需要赋值给一个变量的(如前文中求阶乘的过程)。

    使用lambda函数还有一些注意事项:

    lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值。

    lambda 函数不能包含命令,包含的表达式不能超过一个。

    下面简单演示一下如何使用lambda函数实现自定义排序。

    class People:

    age=0

    gender='male'

    def __init__(self, age, gender):

    self.age = age

    self.gender = gender

    def toString(self):

    return 'Age:'+str(self.age)+'\tGender:'+self.gender

    List=[People(21,'male'),People(20,'famale'),People(34,'male'),People(19,'famale')]

    print 'Befor sort:'

    for p in List:

    print p.toString()

    List.sort(lambda p1,p2:cmp(p1.age,p2.age))

    print '\nAfter ascending sort:'

    for p in List:

    print p.toString()

    List.sort(lambda p1,p2:-cmp(p1.age,p2.age))

    print '\nAfter descending sort:'

    for p in List:

    print p.toString()

    上面的代码定义了一个People类,并通过lambda函数,实现了对包含People类对象的列表按照People的年龄,进行升序和降序排列。运行结果如下:

    Befor sort:

    Age:21 Gender:male

    Age:20 Gender:famale

    Age:34 Gender:male

    Age:19 Gender:famale

    After ascending sort:

    Age:19 Gender:famale

    Age:20 Gender:famale

    Age:21 Gender:male

    Age:34 Gender:male

    After descending sort:

    Age:34 Gender:male

    Age:21 Gender:male

    Age:20 Gender:famale

    Age:19 Gender:famale

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

    时间: 2016-10-24

    展开全文
  • lambdaPython编程语言中使用频率较高的一个关键字。那么,什么是lambda?它有哪些用法?这里,我们通过阅读各方资料,总结了关于Python中的lambda的“一个语法,三个特性,四个用法,一个争论”。一个语法在Python...
  • # 用 lambda 表达式对列表数据排序 students = [ {'name': 'TOM', 'age': 20}, {'name': 'ROSE', 'age': 19}, {'name': 'Jack', 'age': 22} ] # 按照 name 进行升序排序 students.sort(key=lambda x : x['name']...
  • 前几天看到了一行求1000的阶乘的Python代码:printreduce(lambdax,y:x*y,range(1,1001))一下子被python代码的精简与紧凑所折服,故对代码进行了简单的分析。reduce与range都是Python的内置函数。range(1,1001)...
  • pythonlambda函数和列表排序

    千次阅读 2019-09-12 09:00:23
    1.lambda函数 1)称为匿名函数,函数的定义直接使用,不用起名 2)又称一句话函数,使用一行代码表达逻辑 3)用于简单的不会重复多次调用的场景 2.定义形式:sum = lambda x,y:x+y s = lambda x,y:x+y ...
  • 在很多时候需要对二维列表的第一个元素或者是第二个元素按照升序或者是降序进行排序python提供了lambda表达式方便我们自定义排序的规则,可以直接调用列表的sort方法进行排序(会修改当前的列表)或者是直接使用...
  • 本文实例讲述了python中的lambda表达式用法。分享给大家供大家参考,具体如下:这里来为大家介绍一下lambda函数。lambda 函数是一种快速定义单行的最小函数,是从 Lisp 借用来的,可以用在任何需要函数的地方 。下面...
  • lambdaPython编程语言中使用频率较高的一个关键字。那么,什么是lambda?它有哪些用法? 这里,我们通过阅读各方资料,总结了关于Python中的lambda的“一个语法,三个特性,四个用法,一个争论”。 一个语法 在...
  • 介绍lambdaPython用于支持将函数赋值给变量的一个操作符 默认是返回的,所以不用再加return关键字,不然会报错result = lambda x: x * xresult(2) # return 4map()/filter()/reduce()需要两个参数,第一个是一个处理...
  • Python列表排序

    2016-11-26 13:22:42
    Python 中, 当需要对一个 list 排序时, 一般可以用 list.sort() 或者 sorted(iterable[, cmp[, key[, reverse]]]). 其中: cmp(e1, e2) 是带两个参数的比较函数, 返回值: 负数: e1 , 0: e1 == e2, 正数: e1 > e2...
  • Python sorted,lambda

    2020-09-03 21:49:08
    最近一直苦恼python列表,字典等排序之后怎么返回下标,然后发现sorted函数就可以解决这个问题,结合lambda匿名函数 1、sorted(iterable, key=None, reverse=False) 注意sorted函数是对可迭代对象进行排序,key是...
  • Python递归与lambda表达式 一、递归 1.1递归的特点 函数内部自己调用自己 必须有出口 1.2示例 def numFunc(num): if num == 1: return 1 return num + numFunc(num - 1) print(numFunc(3)) # 6 图示 [外链...
  • python 列表排序输出对应的索引

    千次阅读 2020-09-02 08:46:40
    例如输入列表: [8, 2, 4] 期望输出: [1, 2, 0] 一句话可以搞定: rank = [index for index, value in sorted(list(enumerate(input_list)), key=lambda x:x[1])] 实例: input_list = [8, 2, 4] rank = [index for ...
  • 手记-- encoding=utf-8 --python3代码import operator一. 按字典值排序(默认为升序)x = {1:2, 3:4, 4:3, 2:1, 0:0}sorted_x = sorted(x.iteritems(), key=operator.itemgetter(1))print sorted_x[(0, 0), (2, 1), ...
  • 关于Python中的lambda

    2019-03-27 10:14:16
    lambdaPython编程语言中使用频率较高的一个关键字。那么,什么是lambda?它有哪些用法? 这里,我们通过阅读各方资料,总结了关于Python中的lambda的“一个语法,三个特性,四个用法,一个争论”。 一个语法 在...
  • @关于Python中的lambda(转载) lambdaPython编程语言中使用频率较高的一个关键字。那么,什么是lambda?它有哪些用法?网上的文章汗牛充栋,可是把这个讲透的文章却不多。这里,我们通过阅读各方资料,总结了关于...
  • Python匿名函数lambda的使用

    千次阅读 多人点赞 2019-06-01 16:56:38
    Python匿名函数lambda的使用 一、匿名函数介绍 在Python中,不通过def来声明函数名字,而是通过lambda关键字来定义的函数称为匿名函数。 lambda函数能接收任何数量(可以是0个)的参数,但只能返回一个表达式的值,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,097
精华内容 12,438
关键字:

python列表排序lambda

python 订阅