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

  • 相关阅读:
    FreeModbus TCP
    C#之用户自定义控件
    使用C库制作DLL
    C# Unable to load DLL 'WzCanDll.dll':找不到指定的模块
    C#之改变窗体icon图标、新建类文件、调用dll库
    sim800c GPRS模块的透传模式
    STM32上使用JSON
    STM32之串口IAP更新升级
    Fortran语言的REWIND和BACKSPACE 函数
    Code blocks 编译Fortran(转载)
  • 原文地址:https://www.cnblogs.com/Uni-Hoang/p/13127653.html
Copyright © 2011-2022 走看看