• [Python学习笔记-002] lambda, map, filter and reduce


    1. lambda

    lambda, 即匿名函数,可以理解为跟C语言的宏类似。例如:

    >>> max = lambda x, y: x if x > y else y
    >>> max(2, 3)
    3

    而用C语言实现对应的宏就是:

    #define max(x, y) ((x) > (y) ? (x) : (y))

    注意:

    • lambda的主体必须是单个表达式而不是一些语句
    >>> print2 = lambda x: sys.stderr.write(str(x) + '
    ') # <--- YES
    >>> print2('Oops')
    Oops
    5
    >>> print2 = lambda x: print(str(x)) # <--- NO (because print() uses lambda actually)
    >>> print2('Oops')
    Oops
    >>> 
    • 为了可读性,不要使用嵌套的lambda。例如:
    >>> ((lambda x: (lambda y: x + y ** 2))(99))(3) # <--- BAD style
    108
    >>> 

    2. map

    程序对列表(list)和其他序列常常要做的一件事就是对每一个元素进行一个操作并把结果集合起来。例如:

    >>> l1 = [1, 3, 5, 7, 9]
    >>> l2 = []
    >>> for i in l:
    ...     j = i ** 2
    ...     l2.append(j)
    ... 
    >>> l2
    [1, 9, 25, 49]
    >>> 

    这时,Python提供的内置函数map()就派上用场了。map()函数会对一个序列对象中的每一个元素应用被传入的函数,并且返回一个包含了所有函数调用结果的一个列表。例如:

    >>> l1 = [1, 3, 5, 7, 9]
    >>> l2 = list(map(lambda x: x ** 2, l1))
    >>> l2
    [1, 9, 25, 49, 81]
    >>> 

    map()还支持操作多个序列,例如:

    >>> l1 = [1, 2, 3]
    >>> l2 = [4, 5, 6]
    >>> def xadd(a, b):
    ...     return (a + b) ** 2
    ... 
    >>> xadd(1, 4)
    25
    >>> xadd(2, 5)
    49
    >>> xadd(3, 6)
    81
    >>> l3 = list(map(xadd, l1, l2))
    >>> l3
    [25, 49, 81]
    >>> 
    >>> l1 = [0x1, 0x3, 0x5, 0x7, 0x9]
    >>> l2 = [0x2, 0x4, 0x6, 0x8, 0xa]
    >>> l3 = [0x5, 0x4, 0x3, 0x2, 0x1]
    >>> l4 = list(map(lambda x, y, z: x + z - y, l1, l2, l3))
    >>> l4
    [4, 3, 2, 1, 0]
    >>> 

    3. filter

    函数filter(func, list)对list的每一个元素都执行函数func(), 若结果为真,则保存那个元素。例如:

    >>> def is_odd(n):
    ...     if n % 2 == 1:
    ...         return True
    ...     else:
    ...         return False
    ... 
    >>> l1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> l2 = list(filter(is_odd, l1))
    >>> l2
    [1, 3, 5, 7, 9]
    >>> 

    4. reduce

    list = [x1, x2, x3, ...], reduce(func, list)表示把函数func()作用在list上,函数func()必须接收两个参数,reduce把结果继续和list的下一个元素做累积计算,其效果就是:

    reduce(func, [x1, x2, x3]) = func(func(x1, x2), x3)

    例如:

    >>> l = [47, 11, 42, 13]
    >>> n = reduce(lambda x, y: x + y, l)
    >>> n
    113
    >>> 

    上面的例子用图表示为:

    注意: 在Python3中,reduce()不再是一个内置函数,而是被放到了模块functools中。

    $ python3
    Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
    ...<snip>...
    >>> import functools
    >>> l = [47, 11, 42, 13]
    >>> n = functools.reduce(lambda x, y: x + y, l)
    >>> n
    113

    参考资料:

  • 相关阅读:
    练习44-继承和组合
    CF 1329B Dreamoon Likes Sequences
    CF 1362C Johnny and Another Rating Drop
    CF 1391D 505
    CF 1383B GameGame
    CF1360F Spy-string(暴力)
    Java 之 关键字与标识符
    Java 之 Java 注释与 API
    Java 之 第一个Java程序
    Java 之 Java开发环境
  • 原文地址:https://www.cnblogs.com/idorax/p/9415248.html
Copyright © 2020-2023  润新知