zoukankan      html  css  js  c++  java
  • [Python] 内置序列函数之 filter, map, reduce, zip

    filter, map, reduce, zip都是针对python中的sequence数据类型的内置方法。

      名词解释:本文中的iterable是指可迭代对象,包括sequence和iterator,及其他具有可迭代性的container。

    1. filter(function, iterable)

    filter的工作原理是使用第一个参数对象(function或者None)来对第二参数对象iterable进行运算,并根据运算结果的布尔值来过滤iterable中的元素。

    对function返回值的布尔运算,如果为True,则将当前元素存储到string, tuple或者list中并最终返回对应类型的对象;如果为False,则将当前元素过滤掉,如果function没有返回值,则视为返回None,因此所有元素都会被过滤掉。如果第一个参数不是function而是None,则返回iterable中所有为True的元素。

    # function有返回值
    >>> filter(lambda d: d != 'a', 'abcd')  # 过滤掉了字母'a''bcd' >>> def d(x):                     # 不使用lambda时,先定义一个充当过滤器的函数。      return True if x != 'a' else False >>> filter(d, 'abcd') 'bcd'
    # function没有返回值
    >>> def f(x):    if x != 'a': print x else: pass >>> foo = filter(f, 'abcd')  # 'abcd'中所有字符都被过滤掉了 b c d >>> foo ''
    # 第一个参数为None
    >>> filter(None, 'abcd') # 没有过滤任何东西 'abcd'

      >>> filter(None, [1,2,3,4,5,0])   # 过滤掉了0
      [1, 2, 3, 4, 5]

     注意:只有当iterable是一个string或者tuple的时候,filter返回的才是string或者tuple,其余都全都是返回list。而function是一个单参数的函数。

      2. map(function, iterable, ...)

    map会将iterable对象里的元素遍历到function中进行运算,并返回一个list对象来存储所有的运算结果。map支持多个iterable参数,如果多个iterable参数元素数量不同,对于数量较少的那个iterable对象,在超出部分取值时值为None。当第一个参数不为function为None时,返回一个由tuple组成的列表,每个tuple中的元素分别来自各个iterable对象。

    >>> map(lambda a: a+1, [1,2,3,4])
    [2, 3, 4, 5]
    >>> map(lambda a, b: a+b, [1,2,3,4], (2,3,4,5))
    [3, 5, 7, 9]
    >>> map(lambda a, b: a + b if b else a + 10, [1,2,3,4,5], (2,3,4,5))   # 第2个iterable对象少了一个元素
    [3, 5, 7, 9, 15]
    >>> map(None, [1,2,3,4,5], [1,2,3])
    [(1, 1), (2, 2), (3, 3), (4, None), (5, None)]

    注意:function中的参数数量与map中的iterable参数个数相同。

     

    3. reduce(function, iterable, start_value)

    reduce函数第一次会在iterable对象中取前两个值传入function中进行运算,然后运算返回值作为第一个参数,再在iterable对象中取第三个值传入function中进行运算,依次类推,直至iterable对象中所有元素被取值完毕。如果设定了start_value值,那么start_value将作为第一次执行function函数时的一个参数,并在iterable中取第一个元素作为function的另一个参数。

    >>> reduce(lambda x, y: x+y, range(0,10))
    45
    >>> reduce(lambda x, y: x+y, range(0,10), 10)
    55

      注意:function是一个双参数的函数,如果没有返回值,则返回None到下一次运算中。

    >>> reduce(d, range(0,10))
    01
    None2
    None3
    None4
    None5
    None6
    None7
    None8
    None9

    4. zip(seq[, seq, ...])

    zip函数会对每个sequence对象依次取相同索引的值到一个tuple中,然后返回一个由这些tuple组成的列表。tuple的数量由所有sequence中具有最少索引的那个sequence决定,该sequence取值完毕后便不再继续对剩余的sequence取值。

    >>> zip([1,2,3,4],[2,3,4,5])
    [(1, 2), (2, 3), (3, 4), (4, 5)]
    >>> zip([1,2,3,4], (2,3,4,5,6,7))
    [(1, 2), (2, 3), (3, 4), (4, 5)]
    >>> zip([1,2,3,4], [[2,3,4],[2,3]])
    [(1, [2, 3, 4]), (2, [2, 3])]
  • 相关阅读:
    将aspx页面编译成dll
    Jquery 验证数字
    c#反编译生成DLL过程
    c#进制转换
    Spring Mvc 实例
    wamp phpMyAdmin error #1045
    Tomcat相关知识点总结(jsp)
    Java ---学习笔记(泛型)
    Java IO ---学习笔记(文件操作与随机访问文件)
    Java IO ---学习笔记(字符流)
  • 原文地址:https://www.cnblogs.com/ifantastic/p/3059679.html
Copyright © 2011-2022 走看看