zoukankan      html  css  js  c++  java
  • python-map, reduce, filter, lambda

    tips:以下使用到的迭代器,可迭代对象,生成器等概念可以参见我的另一篇博客

    lambda表达式

    主要用于一行写完简单函数,简单方便,但不能使用全局变量,也不是代码块。

    >>> lambda x:x+1   # 对冒号前面的x,处理为x+1并返回
    >>> lambda *args: sum(args)  # 对输入的多个参数求和,要求参数能做加法运算
    >>> lambda **kwargs: 0  # 输入任意的键值对参数,返回0
    >>> a = lambda x:x + x
    >>> a(2)
    4
    

    lambda表达式经常配合map,reduce,filter这些函数使用,所以下面介绍这些函数,并结合应用。

    reduce()函数

    reduce(function, sequence[, initial]) -> value

    tips: python3中已经放到了functools模块里面,想要使用的话需要先导入。

    • reduce的第一个参数必须是一个函数,且该函数必须接收两个参数,每次计算的结果返回给function函数的第一个参数,第二个参数依次从可迭代对象中取,见下方例子理解;
    • reduce的第二个参数是一个可迭代对象;
    • reduce的第三个参数是初始值,没有该参数则直接使用可迭代对象的第一个值。
    >>> from functools import reduce
    >>> reduce(lambda x,y:x+y, range(1,6))
    15 # 相当于((((1+2)+3)+4)+5)
    >>> reduce(lambda x,y:x+y*2, 'qwqwqw')
    'qwwqqwwqqww'
    >>> reduce(lambda x,y:x+y, range(1,6), 6)
    21 # 相当于(((((6+1)+2)+3)+4)+5)
    >>> reduce(lambda x:x+1, range(6))
    TypeError: <lambda>() takes 1 positional argument but 2 were given
    # 这里及下面的的lambda表达式都可以换成其他更复杂的函数
    

    map()函数

    map(func, *iterables) --> map object

    一个非常好用的内建函数,将可迭代对象的每一个值依次传入func函数中进行处理,并返回一个map对象(迭代器,可以使用next()依次获取其中的值,也可以使用list进行转换。python2中返回的是一个列表)

    >>> list(map(lambda x:x+x, 'qwqw'))  # 为了方便观察,使用了list函数,将map对象直接转换成列表
    ['qq', 'ww', 'qq', 'ww']
    >>> QAQ = map(lambda x,y:x+y*2, 'qw', 'AS')
    >>> next(QAQ)
    'qAA'
    >>> list(map(lambda x,y:x+y*2, 'q', 'AS'))
    ['qAA']  # 第一个参数从第一个可迭代对象取值,第二个从第二个可迭代对象取值,不够则只完成最小满足规模
    >>> list(map(lambda x,y,z:x+y+z, 'q', 'AS', ''))
    []
    

    filter()函数

    filter(function or None, iterable) --> filter object

    正如其名——过滤:将可迭代对象的的每个值传递给function进行处理,将满足条件的值返回到一个迭代器中。如果没有function函数,则判断可迭代对象中每个是'真'的值,见下方实验

    >>> list(filter(lambda x:x>2, range(5)))
    [3, 4]
    >>> list(filter(lambda x: x != '', [1,'q', 2,'']))
    [1, 'q', 2]
    >>> list(filter(None,[-2.1, -1, 0, 1, 2]))
    [-2.1, -1, 1, 2]  # python中除0外都是‘真’
    

    作者:bitterz
    本文版权归作者和博客园所有,欢迎转载,转载请标明出处。
    如果您觉得本篇博文对您有所收获,请点击右下角的 [推荐],谢谢!
  • 相关阅读:
    IntentService源码分析
    startService过程源码分析
    洛谷P3300 城市规划
    agc033
    洛谷P3306 随机数生成器
    洛谷P3299 保护出题人
    洛谷P3298 泉
    洛谷P3296 刺客信条
    树hash
    我们都爱膜您退火!
  • 原文地址:https://www.cnblogs.com/bitterz/p/10223584.html
Copyright © 2011-2022 走看看