zoukankan      html  css  js  c++  java
  • 高阶函数-map/filter/reduce

    什么样的函数叫高阶函数:
      条件:1.函数接受函数作为参数
         2.函数的返回值中包含函数

    高阶函数之----map函数 map(func, *iterables) --> map object
    num_l = [1,2,3,4,5,6]
    b = map(lambda x:x**2,num_l)
    print(b)
    for i in b:
      print(i)
    >>> <map object at 0x0000023023782358> #返回map对象,是迭代器
      1
      4
      9
      16
      25
      36
    num_l = [1,2,3,4,5,6]
    def add_one(x):#也可以将lambda函数作为参数,等价于lambda x:x+1
    return x+1
    def reduce_one(x):
    return x-1
    def map_number(func,array):#传函数作为参数,将处理的功能封装
    ret = []
    for i in num_l:
    res = func(i) #add_one或者reduce_one
    ret.append(res)
    return ret

    print(map_number(add_one,num_l))#map_number((lambda x:x+1),num_l)

    >>>[2, 3, 4, 5, 6, 7]

    上述的代码其实就是map()函数!无意中完成了map内置函数!等价map((lambda x:x+1),num_l)

    高阶函数之-filter filter(function or None, iterable) --> filter object
      
    例子:
    all_starts = ['kobe','kg','ai','jorden','jamse','sb_zhouqi','sb_guoailun']
    def filter_test(array):
    ret = []
    for i in array:
    if not i.startswith('sb'):
    ret.append(i)
    return ret
    res = filter_test(all_starts)
    print(res)
    >>>['kobe', 'kg', 'ai', 'jorden', 'jamse']
    上面的例子可以看出,处理的逻辑还是通过for循环来实现的,但是如果处理的不是以sb开头怎么办?处理以XX为中间的怎么办?
    所以此时处理的逻辑可以单独写成函数,就会很好用,如同上面的map函数,你给我处理逻辑的函数和要处理的可迭代对象,我就给你处理!
    唯一的不同是此时的逻辑是判断bool,通过True或者False来过滤,除去函数逻辑中的元素,此时filter函数应运而生!而filter是保留
    满足函数逻辑的元素!
    all_starts = ['kobe','kg','ai','jorden','jamse','sb_zhouqi_sb','sb_guoailun_sb']
    def sb_show(n):
    return n.endswith('sb')
    def filter_test(func,array):
    ret = []
    for i in array:
    if not func(i):
    ret.append(i)
    return ret

    res = filter_test(sb_show,all_starts)
    print(res)
    无意中把filter函数构造出来了!说白了就是将可迭代对象array中的每个元素拿出来给前面的函数处理,处理结果是True的保留
    处理结果是False的舍弃。
    终极版本:ret = filter(lambda x:not x.startswith('sb'),array)
         print(list(ret))
       >>>['kobe', 'kg', 'ai', 'jorden', 'jamse']

    高阶函数之---reduce
    from functools import reduce

    num = [1,2,3,4]
    def reduce_test(array):
    res = 0
    for i in array:
    res+=i
    return res
    print(reduce_test(num))
    >>>10-------逻辑写死了,只能完成自增,如果想完成自乘怎么办?
    num = [1,2,3,4]
    lambda x,y:x*y
    def reduce_test(func,array):
    res = array.pop(0)
    for i in array:
    res = func(res,i)
    return res
    print(reduce_test(lambda x,y:x*y,num))
    >>>24
    可以进一步优化,指定初始的基数,比如reduce_test(func,array,init=10)指定初始化的init基数是10

    num = [1,2,3,4]
    lambda x,y:x*y
    def reduce_test(func,array,init=None):
    if init is None:
    res = array.pop(0)
    else:
    res = init
    for i in array:
    res = func(res,i)
    return res
    print(reduce_test(lambda x,y:x*y,num,100))
    reduce将完整的序列压缩成一个值!map-reduce就是大数据的概念,将获取的数据加工,然后整合成一个最终结果

    from functools import reduce
    num = [1,2,3,4]
    res = reduce(lambda x,y:x+y,num,100)--->这个直接返回一个值给你,而map,filter是返回一个对象!!!
    print(res)
    >>>110

    小结:
       map:处理序列中的每个元素,得到一个map对象的结果,结果中的每一个元素都和原来的位置一样
       filter:遍历序列中的每个元素,判断元素得到bool值秒如果是True则保留
       reduce:处理一个序列,整合合并操作










  • 相关阅读:
    spring的APO
    设计系统测试计划需要参考的项目文档有
    系统测试的策略
    软件测试包括
    简述你在以前的工作中做过哪些事情,比较熟悉什么
    在C/C++中static有什么用途?(请至少说明两种)
    引用与指针有什么区别?
    说说你对集成测试中自顶向下集成和自底向上集成两个策略的理解,要谈出它们各自的优缺点和主要适应于哪种类型测试;
    系统测试的策略
    通过画因果图来写测试用例的步骤为___、___、___、___及把因果图转换为状态图共五个步骤。 利用因果图生成测试用例的基本步骤是:
  • 原文地址:https://www.cnblogs.com/qyan-blog/p/11718375.html
Copyright © 2011-2022 走看看