GuoLi
10/28/2017 - 8:04 AM

Python中的列表推导式、lambda表达式和闭包

Python中的列表推导式、lambda表达式和闭包

List Comprehension列表推导式

>>> [(x,y) for x in range(4) if x>1 for y in range(6) if y>3]
[(2, 4), (2, 5), (3, 4), (3, 5)]

以上列表推导式等价于

l = []                                                                                                                  
for x in range(4):
    if(x > 1):
        for y in range(6):
            if(y > 3):
                l.append((x, y))

lambda表达式和闭包

简单来说,编程中提到的lambda表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数

>>> lambda x, y: x+y

x, y是匿名函数的两个参数,x+y是返回值

那么lamdba函数的正确使用场景在哪呢?

1、函数式编程

尽管Python算不上是一门纯函数式编程语言,但它本身提供了很多函数式编程的特性,像map、reduce、filter、sorted这些函数都支持函数作为参数,lambda 函数就可以应用在函数式编程中。
比如:一个整数列表,要求按照列表中元素的绝对值大小升序排列

>>> ls = [5, 3, -1, 8, -3, 0, 1]                            
>>> sorted(ls, key = lambda x: abs(x))                      
[0, -1, 1, 3, -3, 5, 8] 

排序函数sorted支持接收一个函数作为参数,该参数作为sorted的排序依据。

2、闭包

简单理解,闭包就是一个定义在函数内部的函数。闭包使得变量即使脱离了该函数的作用域也依然可以被访问。具体来说,闭包是指将当前作用域中的变量通过值或者引用的方式封装到lambda表达式当中,成为表达式的一部分,它使你的lambda表达式从一个普通的函数变成了一个带隐藏参数的函数。

>>> def add_n(n):             
...     return lambda x: x+n  
...                           
>>> add_5 = add_n(5)          
>>> add_5(3)                  
8   

这里的lambda表达式就是个闭包。函数add_n接收参数n,返回一个匿名函数。参数n的值在闭包的作用下,成为lambda表达式的一部分,使得它在全局作用域依然可以被访问到。