zoukankan      html  css  js  c++  java
  • python中的匿名函数以及在内置函数中的使用

    一. 匿名函数

    Python使用 lambda 来创建匿名函数。所谓匿名函数,它与用 def 关键字定义的函数相比,没有函数名称。

    语法:

    lambda [para1, para2, ...]: expression

    从匿名函数的定义格式可以看出:

    复制代码
    1. lambda后没有跟函数名,这就是匿名函数名称的由来.
    
    2. [para1, para2, ...]是一个参数列表,它是可选的,而且是任何类型的.
    
    3. expression表达式实现匿名函数功能的过程,并返回操作结果, 具有通常函数return的功能.
    
    4. 整个匿名函数要在一行内实现所有定义.
    复制代码

    1.2 代码示例

    >>> lambda x, y: x+y    # 在一行定义匿名函数
    <function <lambda> at 0x00000217D39E1F28>    # 打印上面
    
    >>> a = lambda x, y: x + y    # 定义匿名函数并赋值给a
    >>> a(2, 3)                   # a具有匿名函数的功能, 通过参数传值
    5                             # 输出结果

    说明:

    lambda的冒号前面表示的是参数,冒号后面的是表达式. 注意, lambda 可以接受任意多个参数, 但只能有一个表达式.

    1.3 匿名函数的优点

    1 使用Python写一些脚本时,使用lambda可以省去定义函数的过程,让代码更加精简.
    2 对于一些抽象的,不会被别的地方再重复使用的函数,有时候函数起个名字也是个难题,使用lambda不需要考虑命名的问题.
    3 使用lambda在某些时候能使代码更容易理解.

    二. 匿名函数在内置函数中的使用

    匿名函数一般不单独使用,经常与一些内置函数一块使用.

    能使用匿名函数的内置函数为:

    map,filter,sorted ,max,min

    记住上面这五个!!!

    2.1 在 map 函数中的使用

    map()函数接受两个参数.一个是函数, 一个是 Iterable(可迭代).

    map 将传入的函数依次作用到序列的每个元素上., 并把结果作为新的 Iterator 返回,注意返回结果需要转为list.

    举个例子:

    复制代码
    def f(x):
        return x * x
    
    
    lis = [1, 2, 3, 4, 5]
    res = map(f, lis)        # 求列表中每个数的平方
    print(res)                  # 此时返回的是一个对象
    <map object at 0x00000254573B0B38>
    
    print(list(res))           # 可以直接用list()求结果
    [1, 4, 9, 16, 25]
    复制代码

    用 lambda 表示就是这样:

    复制代码
    lis = [1, 2, 3, 4, 5]
    res = map(lambda x: x*x, lis)    # 求列表中每个数的平方
    
    print(res)                                  # 同上面的例子一样,返回的是一个对象
    <map object at 0x000001D102040B38>
    
    print(list(res))                           # 用list()获取结果
    [1, 4, 9, 16, 25]
    复制代码
    L1 = [12, 3, 12, 2, 1, 2, 35]
    result1 = map(lambda x: str(x).strip().zfill(3), L1) #map方式实现
    print(list(result1))
    ['012', '003', '012', '002', '001', '002', '035']
    res=map(lambda x:x*x,[1,2,3,4,5,6])
    print(list(res)) #按照条件,循环后面传入的参数的
    [1, 4, 9, 16, 25, 36]

    2.2 在 filter 函数中的使用

    和map()类似, filter()也接受一个函数,一个序列.

    与map()不同的是,filter()把传入的函数依次作用于每个元素, 然后根据返回值是True还是False来决定保留还是丢弃该元素. 

    filter() 会根据判断结果自动过滤掉不符合条件的元素, 只返回由符合条件的元素组成的新列表(需要list一下).

    举个例子:

    复制代码
    # 在一个列表中, 删除偶数, 保留奇数
    def is_odd(x):
        return x%2 == 1
    
    
    lis = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    res = filter(is_odd, lis)
    print(res)                               # 注意, 这里依旧返回的是对象
    <filter object at 0x0000022832D00C18>
    
    print(list(res))                         # 这样返回的才是我们想要的结果
    [1, 3, 5, 7, 9]
    复制代码

    用 lambda 表示就是这样:

    复制代码
    # 在一个列表中, 删除偶数, 保留奇数
    
    lis = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    res = filter(lambda x: x % 2 == 1, lis)
    print(res)                               # 同上例子,返回的是对象.
    <filter object at 0x0000020A8F240B38>
    
    print(list(res))                         # 这样就是我们想要的结果
    [1, 3, 5, 7, 9]
    复制代码
    def filter_test(x):
    return x>5
    result = filter(filter_test, [12, 3, 12, 2, 1, 2, 35])
    print(list(result))
    [12, 12, 35]
    用 lambda 表示就是这样:
    result = filter(lambda x: x > 5, [12, 3, 12, 2, 1, 2, 35])
    print(list(result))
    [12, 12, 35]

    2.3 在 max 函数中的使用

    max() 函数返回给定参数的最大值.

    举个例子:

    复制代码
    # 找出字典中值最大的那个key
    prices = {
        'A': 123,
        'B': 450.1,
        'C': 12,
        'E': 444,
    }
    res = max(prices, key=lambda x: prices[x])    按照值取最大,返回key
    print(res)
    
    B
    复制代码

    2.4 在 min 函数中的使用

     min() 函数返回给定参数的最小值.

    用法和 max() 一样

    2.5 在 sorted 函数中的使用

    排序是在程序中经常用到的算法, 如果是数字, 我们可以直接比较. 而如果是字符串或者是dict, 我们就可以用 sorted() 来进行排序.

    sorted() 语法:

    sorted(Iterable,key = None,reverse = False)

    - Iterable: 可迭代的.

    - key:排序规则(排序函数). 在sorted内部将可迭代对象的每一个元素传递给这个函数的参考值,根据函数运算的结果进行排序.

    - reverse:排序规则. reverse = True 降序 , reverse = False 升序(默认).

    举个例子:

    # 按绝对值大小排序
    >>>sorted([2, 1, -3, 8, -5], key = abs)
    [1, 2, -3, -5, 8]

    用 lambda 表示就是这样:

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

    再来个例子:

    # 按照字母长度排序, 如果长度一样, 则按照字母顺序(ASCII)排序.
    ret = sorted(['cat', 'bird', 'dog', 'bira', 'animal'], key=lambda x: len(x))
    print(ret)
    -> 
    ['cat', 'dog', 'bird', 'bira', 'animal']

     可以根据可迭代的对象中的元素进行排序:

    # sort和sorted的区别,sorted有返回值 sort没有
    # key传一个函数名:可以循环的都可以排序,字符串、字典、列表、元组

    多维数组排序

    name = [
        ('小名',5,['xx',11]),
        ['xiaohei',19,['xx',13]],
        ['xiaobai',20,['xx',18]],
        ['xiaolan',10,['xx',20]]
    ]
    def use_key(x):
        return x[1]
    
    l4 = sorted(name,reverse=True,key=lambda x:x[-1][-1])
    print(l4)
    [['xiaolan', 10, ['xx', 20]], ['xiaobai', 20, ['xx', 18]], ['xiaohei', 19, ['xx', 13]], ('小名', 5, ['xx', 11])]
    

      


    列表排序
    print(sorted([2, 31, 34, 6, 1, 23, 4]))  # 排序
    [1, 2, 4, 6, 23, 31, 34]
    

      



    字典排序:
    d={'a':1,'b':2}
    print(d.items())
    l2 = sorted(d.items(),reverse=True,key=lambda x:x[0])
    print(l2)
    l3 = sorted(d.items(),reverse=True,key=lambda x:x[1])
    print(l3)
    dict_items([('b', 2), ('a', 1)])
    [('b', 2), ('a', 1)]
    [('b', 2), ('a', 1)]
    
     
    

      

  • 相关阅读:
    ssh登录很慢的问题
    Y480&Y580 刷slic2.1全自动教程
    re正则表达式5_*
    linux下查看内存使用情况
    检查linux网络的状况
    Linux Load average负载详细解释
    查看Linux磁盘空间大小
    Linux 批量重命名文件
    Linux 网卡丢包严重
    linux 下vi /vim 中文汉字乱码解决
  • 原文地址:https://www.cnblogs.com/MLing/p/12849135.html
Copyright © 2011-2022 走看看