美文网首页
(十一)函数<4>几个特殊函数

(十一)函数<4>几个特殊函数

作者: 费云帆 | 来源:发表于2019-01-04 13:35 被阅读0次

    1.lambda()---匿名函数,可以把函数压缩在一行里搞定:

    • 平常的作法:
    def add(x):
        x+=3
        return x
    
    numbers=range(10)
    new_numbers=[]
    for i in numbers:
        new_numbers.append(add(i))
    print(new_numbers)
    >>>
    [3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
    # 或者这么做
    numbers=[i+3 for i in range(10)]
    print(numbers)
    >>>
    [3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
    
    • 使用lambda():
    lam=lambda x:x+3
    #lam=lambda x:x+=3 这种语法是错的
    numbers=range(10)
    new_numbers=[]
    for i in numbers:
        new_numbers.append(lam(i))
    print(new_numbers)
    >>>
    [3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
    
    • 或者这样:
    add=lambda x,y:x+y
    print(add(3,4))
    >>>7
    # 看样子,还是赋值给变量看起来比较舒服
    print((lambda x:x**2)(5))
    >>>25
    
    • lambda()使代码看起来更简洁:
    squares=[lambda x:x,lambda x:x**2,lambda x:x**3,lambda x:x**4]
    for i in squares:
        print(i(5))
    >>>
    5
    25
    125
    625
    

    记住,lambda是一个单行的函数.之前也有这样的单行函数:

    def function():pass
    

    2.map(func,seq)---把seq序列的值依次取出来,塞进函数func里面,再返回func计算的结果:

    def add(x):
        x+=3
        return x
    
    numbers=[1,2,3,4,5,6,7]
    #print(list(map(add,numbers)))
    print(list(map(lambda x:x+3,numbers)))
    >>>
    [4, 5, 6, 7, 8, 9, 10]
    

    在应用中,map的所能实现的,也可以用别的方式实现。比如:

    >>> items = [1,2,3,4,5]
    >>> squared = []
    >>> for i in items:
    ... squared.append(i**2)
    ...
    >>> squared
    [1, 4, 9, 16, 25]
    >>> def sqr(x): return x**2
    ...
    >>> map(sqr,items)
    [1, 4, 9, 16, 25]
    >>> map(lambda x: x**2, items)
    [1, 4, 9, 16, 25]
    >>> [ x**2 for x in items ] # 推荐这个,一般情况下速度足够快,而且可读性强
    [1, 4, 9, 16, 25]
    
    • 如果参数很多,则对那些参数并行执行function:
    >>> lst1 = [1, 2, 3, 4, 5]
    >>> lst2 = [6, 7, 8, 9, 0]
    >>> map(lambda x, y: x + y, lst1, lst2) #将两个列表中的对应项加起来,并返回一个结果列表
    [7, 9, 11, 13, 5]
    
    • 上面这个例子如果用for循环来写,还不是很难,如果扩展一下,下面的例子用for来改写,就要小心了:
    >>> lst1 = [1, 2, 3, 4, 5]
    >>> lst2 = [6, 7, 8, 9, 0]
    >>> lst3 = [7, 8, 9, 2, 1]
    >>> map(lambda x,y,z: x+y+z, lst1, lst2, lst3)
    [14, 17, 20, 15, 6]
    

    这才显示出map的简洁优雅。
    总而言之,map()---优雅处理序列和函数的映射关系
    zip()---用来处理序列和序列之间关系的
    3.reduce()---横向逐个运算,map()是上下运算:

    # reduce
    >>> from functools import reduce
    >>> reduce(lambda x,y:x+y,[1,2,3,4,5])
    15
    >>> list1=[1,2,3,4,5]
    >>> list2=[5,4,3,2,1]
    >>> list(map(lambda x,y:x+y,list1,list2))
    [6, 6, 6, 6, 6]
    

    4.filter()---过滤器:
    filter(function or None, iterable) --> filter object
    传入函数和序列,筛选出需要的数据(这里的函数当作过滤的规则)

    >>> number=range(-5,5)
    # 筛选大于0的数据
    >>> list(filter(lambda x:x>0,number))
    [1, 2, 3, 4]
    # 筛选除了"i"的所有字母
    >>> list(filter(lambda x:x!='i','qiwsir'))
    ['q', 'w', 's', 'r']
    

    相关文章

      网友评论

          本文标题:(十一)函数<4>几个特殊函数

          本文链接:https://www.haomeiwen.com/subject/dmbhrqtx.html