zoukankan      html  css  js  c++  java
  • Python匿名函数(lambda函数)

    匿名函数 —— 一行函数

    lambda —— 关键字

    x是普通函数的形参(位置,关键字...)可以不接收参数(x可以不写)
    :x是普通函数的函数值(只能返回一个数据类型)(:x返回值必须写)
    1)此函数不是没有名字,他是有名字的,他的名字就叫做lambda
    2)lambda 是定义匿名函数的关键字,相当于函数的def.
    3)lambda 后面直接加形参,形参加多少都可以,只要用逗号隔开就行。

    func = lambda a, b, *args, sex='alex', c, **kwargs: kwargs
    print(func(3, 4, c=666, name='alex')) 
    

    结果:{'name': 'alex'}

    所有类型的形参都可以加,但是一般使用匿名函数只是加位置参数,其他的用不到。
    把匿名函数拆开写,如下:

    def func(a, b, *args, sex='alex', c, **kwargs):
        return kwargs
    
    
    a = func(3, 4, c=666, name='alex')
    print(a)
    

    结果:{'name': 'alex'}
    4)返回值在冒号之后设置,返回值和正常的函数一样,可以是任意数据类型。(但是想要返回多个元素要以容器的形式返回)
    5)匿名函数不管多复杂.只能写一行.且逻辑结束后直接返回数据
    格式:lambda x:x
    print((lambda x: x + 6)(5))
    结果:11

    def func(x):
    return x + 6
    print(func(5))
    结果:11
    此处使用列表推导式,返回值是地址
    lst = [lambda :i for i in range(5)]
    print(lst)

    拆解成函数:

    lis = []
    for i in range(5):
        def func():
    
                return i
    
        a = func
        lis.append(a)
    print(lis)
    

    结果:[<function func at 0x0000029E97472378>, <function func at 0x0000029E97472400>, <function func at 0x0000029E97472488>, <function func at 0x0000029E97472510>, <function func at 0x0000029E97472598>]

    lambda表达式是可以嵌套的

    action = (lambdax : (lambda y : x + y))
    a = action(10)
    a(5)
    

    结果:15
    这就是一个用lambda实现的闭包,与普通闭包一样,内嵌lambda表达式可以获得上层lambda函数的变量。

    匿名函数的使用

    匿名函数通常被用作高阶函数(higher-order function,参数为函数的函数)的参数。比如,几个内置函数:filter(),map(),reduce()。下面我们分别看看这几个函数的用法及达到相同效果的python另一种特征的用法

    filter函数

    lis = [1, 2, 3, 4]
    re = filter(lambda x: x % 2 == 0, lis)
    print(list(re))
    
    result1 = [x for x in lis if x % 2 == 0]
    print(result1)
    

    结果:[2,4]
    [2,4]

    map函数

    lis = [1, 2, 3]
    result = map(lambda x: x*2, lis)	# 使用lambda函数
    print(list(result))		
    
    result1 = [x*2 for x in lis]	#使用列表推导式
    print(result1)
    

    结果:[2, 4, 6]
    [2, 4, 6]

    reduce函数

    from functools import reduce
    
    lis = [1, 2, 3, 4]
    result = reduce(lambda x, y: x+y, lis)
    print(result)
    

    结果:10

    在Python2.x版本中recude是直接 import就可以的, Python3.x版本中需要从functools这个包中导入

    除reduce函数的替代用法比较特殊外,map和filter函数都可以使用列表推导式代替。据说,龟叔本打算将 lambda 和 reduce 都从全局名字空间都移除, 舆论说龟叔不喜lambda 和 reduce最后lambda没删除是因为和一个人给龟叔写了好多封,进行交流然后把lambda保住了

    转自:https://www.cnblogs.com/shenhongbo/p/11566976.html

  • 相关阅读:
    POJ 3114 Tarjan+Dijkstra
    278. First Bad Version
    209. Minimum Size Subarray Sum
    154. Find Minimum in Rotated Sorted Array II
    153. Find Minimum in Rotated Sorted Array
    710. Random Pick with Blacklist
    767. Reorganize String
    524. Longest Word in Dictionary through Deleting
    349. Intersection of Two Arrays
    350. Intersection of Two Arrays II
  • 原文地址:https://www.cnblogs.com/Uni-Hoang/p/13127653.html
Copyright © 2011-2022 走看看