zoukankan      html  css  js  c++  java
  • 用一个简单的例子来理解python高阶函数

    ============================

    用一个简单的例子来理解python高阶函数

    ============================

    最近在用mailx发送邮件, 写法大致如下.
    echo 'body'|mailx -s 'title' 'a@corp.com,b@corp.com'
    不知什么原因, 在一台机器上只要mailTo中包含空格, 邮件就发送不出去. 所以需要对收件人做规范化处理, 即去除空格, 去除多余的逗号.

    这个处理过程使用到了map()和reduce(), 使用情形很简单, 更有助于理解这两个函数的作用.

    #原始的mailTo
    mailToStr=',a@corp.com ,, c@corp.com,e@corp.com,'
    #该字符串中, 有空邮箱地址, 还有邮箱前后带空格
    
    #step 1: 先转换成list
    mailTo=mailToStr.split(',')
    #结果为, ['', 'a@corp.com ', '', ' c@corp.com', 'e@corp.com', '']
    
    #step 2:对list中元素做trim
    mailTo=map(lambda x: x.strip(),mailTo)
    #结果为, ['', 'a@corp.com', '', 'c@corp.com', 'e@corp.com', '']
    
    
    #step 3: 去除list中的那几个空邮箱地址了
    def exceptEmpty(x,y):
        if x=='':
            return y
        elif y=='':
            return x
        else:
            return x+','+y
    
    mailToStr=reduce(exceptEmpty,mailTo)
    #mailToStr的结果是 'a@corp.com,c@corp.com,e@corp.com'



    ============================
    总结一下 map/reduce/zip/filter几个高阶函数的作用

    ============================

    map()函数, 我们需要提供2个参数, 第1个是lambda表达式或函数, 第2个参数是个list,
    map()的作用是, 将list中的每个元素, 带到lambda表达式中求值, 最后再组成一个list.
    比如,map(lambda x: x.strip(),['a@corp.com', 'c@corp.com']), 对每个元素都做了trim

    reduce()函数, 我们需要提供2个参数, 第1个是lambda表达式或函数, 第2个参数是个list,
    reduce()作用是, 将list中的相连的两个元素, 带入到lambda表达式中做"递归"求值, 最后生成一个scalar值.


    zip()的作用是, 将两个list中的元素进行编织mesh.
    zip([1,2,3],['a','b'])
    #结果为[(1, 'a'), (2, 'b')]


    filter()的作用是很直观, 对于给定的list, 按照我们设定的lambda表达式条件, 过滤掉不符合的元素.
    filter(lambda x: x>0, [-1,0,1,2])
    #结果为[1,2]

    补充一点, lambda 表达式, 冒号后为一个表达式, 不是 `return` 语句.

  • 相关阅读:
    我的Android app开发生涯
    极客学院
    区分H5和native页面
    H5之测试工具
    放最多水
    数组去重 快慢指针
    搜索插入位置 二分查找
    this指向
    JS 抖动和节流
    图片懒加载和预加载
  • 原文地址:https://www.cnblogs.com/harrychinese/p/python_map_reduce.html
Copyright © 2011-2022 走看看