美文网首页
map,filter,lambda

map,filter,lambda

作者: whenitsallover | 来源:发表于2018-06-02 16:43 被阅读0次

    lambda

    lambda操作符(或lambda函数)通常用来创建一次性的匿名函数对象。它的基本语法如下

    lambda arguments : expression
    

    lambda操作符可以有任意数量的参数,但是它只能有一个表达式,且不能包含任何语句,返回一个可以赋值给任何变量的函数对象。

    下面通过一个例子来理解一下。首先看看一个Python函数:

    def add(x, y):    
    return x+y
    
    # call the function
    add(1, 2)  # Output: 3
    

    上述函数名为add, 它需要两个参数x和y,并返回它们的和。接下来,我们把上面的函数变成一个lambda函数:

    add = lambda x, y : x + y
    print(add(1,2))  # Output: 3
    

    在lambda x, y : x + y中,x和y是函数的参数,x+y是表达式,它被执行并返回结果。

    lambda x, y: x + y返回的是一个函数对象,它可以被赋值给任何变量。在本例中函数对象被赋值给了add变量。如果我们查看add的type,可以看到它是一个Function。

    type(add)  # Output: function
    

    绝大多数lambda函数作为一个参数传给一个需要函数对象为参数的函数,比如map,reduce,filter等函数。

    map

    map的基本语法如下:
    map(function_object, iterable1, iterable2, ...)
    

    map函数需要一个函数对象和任意数量的iterables,如list、dictionary等。它为序列中的每个元素执行function_object,并返回由函数对象修改的元素组成的列表。

    def add2(x):    
    return x+2
    
    map(add2, [1,2,3,4])  
    # Output: [3,4,5,6]
    

    在上面的例子中,map对list中的每个元素1,2,3,4执行add2函数并返回[3,4,5,6]。接着看看,如何用map和lambda重写上面的代码:

    map(lambda x: x+2, [1,2,3,4])  
    #Output: [3,4,5,6]
    

    使用map和lambda迭代dictionary:

    dict_a = [
        {'name': 'python', 'points': 10}, 
        {'name': 'java', 'points': 8}
    ]  
    
    map(lambda x : x['name'], dict_a)
    # Output: ['python', 'java']
    
    map(lambda x : x['points']*10,  dict_a) 
    # Output: [100, 80]
    
    map(lambda x : x['name'] == "python", dict_a) 
    #Output: [True, False]
    

    以上代码中,dict_a中的每个dict作为参数传递给lambda函数。lambda函数表达式作用于每个dict的结果作为输出。

    map函数作用于多个iterables:

    list_a = [1, 2, 3]
    list_b = [10, 20, 30]
    
    map(lambda x, y: x + y, list_a, list_b) 
    # Output: [11, 22, 33]
    

    这里,list_a和list_b的第i个元素作为参数传递给lambda函数。

    在Python3中,map函数返回一个惰性计算(lazily evaluated)的迭代器(Iterator)或map对象。就像zip函数是惰性计算那样。

    我们不能通过index访问map对象的元素,也不能使用Len()得到它的长度。
    但我们可以强制转换map对象为list:

    map_output = map(lambda x: x*2, [1, 2, 3, 4])
    print(map_output) 
    # Output: map object
    

    filter

    filter的基本语法如下:

    filter(function_object, iterable)
    

    filter函数需要两个参数,function_object返回一个布尔值(boolean),对iterable的每一个元素调用function_object,filter只返回满足function_object为True的元素。

    和map函数一样,filter函数也返回一个list,但与map函数不同的是,filter函数只能有一个iterable作为输入。
    示例:
    返回偶数:

    a = [1, 2, 3, 4, 5, 6]
    filter(lambda x : x % 2 == 0, a) 
    # Output: [2, 4, 6]
    

    过滤dicts的list

    dict_a = [
        {'name': 'python', 'points': 10}, 
        {'name': 'java', 'points': 8}
    ]
    
    filter(lambda x : x['name'] == 'python', dict_a)
    # Output: [{'name': 'python', 'points': 10}]
    

    和map一样,filter函数在Python3中返回一个惰性计算的filter对象或迭代器。我们不能通过index访问filter对象的元素,也不能使用Len()得到它的长度。

    list_a = [1, 2, 3, 4, 5]
    
    filter_obj = filter(lambda x: x % 2 == 0, list_a) 
    # filter object 
    
    even_num = list(filter_obj) 
    # Converts the filer obj to a list
    
    print(even_num) # Output: [2, 4]
    

    相关文章

      网友评论

          本文标题:map,filter,lambda

          本文链接:https://www.haomeiwen.com/subject/xbmrsftx.html