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)]
    
     
    

      

  • 相关阅读:
    hdu 4521 小明系列问题——小明序列(线段树 or DP)
    hdu 1115 Lifting the Stone
    hdu 5476 Explore Track of Point(2015上海网络赛)
    Codeforces 527C Glass Carving
    hdu 4414 Finding crosses
    LA 5135 Mining Your Own Business
    uva 11324 The Largest Clique
    hdu 4288 Coder
    PowerShell随笔3 ---别名
    PowerShell随笔2---初始命令
  • 原文地址:https://www.cnblogs.com/MLing/p/12849135.html
Copyright © 2011-2022 走看看