接上文,我们定义了判断某行是否file copy,或者file overwrite的两个函数,事实上我们如果使用

startswith函数代替slice,会更稳定。从函数式编程角度,我们给出下面几个表达式:
      isRegDBRoot = lambda line: line[:11]=='RegDB Root:'
      isRegDBKey = lambda line: line[:10]=='RegDB Key:'
      isRegDBVal = lambda line: line[:10]=='RegDB Val:'
有了这三个更加紧凑的函数,我们给出之前方法的函数式编程写法;
      lines = open(r'd:\python22\install.log').readlines()
      regroot_lines = filter(isRegDBRoot, lines)
如果,你想通过多个选择标准来选择相应的行,那么函数式的写法就会显得笨拙。
我们可以根据相似的思路写出一个给定要求对应的过滤函数如下:
 #*--------------- Find the RegDB lines ------------------#
      def isAnyRegDB(line):
          if   line[:11]=='RegDB Root:': return 1
          elif line[:10]=='RegDB Key:':  return 1
          elif line[:10]=='RegDB Val:':  return 1
          else:                          return 0

但是,如果需求变成了其他的组合呢?显然依据这个思路,我们必须为另外的组合写更多的组合,这种组合是爆炸性的增长的。。。另外的思路是通过嵌套过滤函数来达到:
 #*------------- Filter on two line predicates -----------#
      shortline = lambda line: len(line) < 25
      short_regvals = filter(shortline, filter(isRegDBVal, lines))
这样的思路写出的程序比较容易排错,该函数使用了两个已有的函数来生成新的程序。但是一个显而易见的问题是:这样的程序很难阅读。同样的问题也出现在map函数上。通常解决这样问题的方法是多增加一些循环和中间变量。。
根据函授式编程的思路,我们可以在不增加代码量的情况下解决上面描述的问题。
这里的关键点是:选择的生成一些高级别的组合函数:这里的高级别函数是指:那些接受函数作为输入,返回函数作为输出的函数。一级函数接受数据,返回数据。相对应的一个高级函数的输入和输出都是函数对象。这些函数对象将在未来被其他地方使用:高级函数的一个例子是;函数工厂,它返回一个或者一组函数对象。下面是一个加法函数工厂;

>>> def adder_factory(n):
      ...    return lambda m, n=n: m+n
      ...
      >>> add10 = adder_factory(10)
      >>> add10
      <function <lambda> at 0x00FB0020>
      >>> add10(4)
      14
      >>> add10(20)
      30
      >>> add5 = adder_factory(5)
      >>> add5(4)
      9
回到正题,我们提到用高级组合函数来解决前面提到的问题,这些高级函数通过接受一些函数,对这些函数对象进行操作从而合成其他的函数。下面是一个组合高级函数库:
#------------------- combinatorial.py -------------------#
      from operator import mul, add, truth
      apply_each = lambda fns, args=[]: map(apply, fns, [args]*len(fns))
      bools = lambda lst: map(truth, lst)
      bool_each = lambda fns, args=[]: bools(apply_each(fns, args))
      conjoin = lambda fns, args=[]: reduce(mul, bool_each(fns, args))
      all = lambda fns: lambda arg, fns=fns: conjoin(fns, (arg,))
      both = lambda f,g: all((f,g))
      all3 = lambda f,g,h: all((f,g,h))
      and_ = lambda f,g: lambda x, f=f, g=g: f(x) and g(x)
      disjoin = lambda fns, args=[]: reduce(add, bool_each(fns, args))
      some = lambda fns: lambda arg, fns=fns: disjoin(fns, (arg,))
      either = lambda f,g: some((f,g))
      anyof3 = lambda f,g,h: some((f,g,h))
      compose = lambda f,g: lambda x, f=f, g=g: f(g(x))
      compose3 = lambda f,g,h: lambda x, f=f, g=g, h=h: f(g(h(x)))
      ident = lambda x: x
这样通过使用这些高级组合函数:我们可以这样解决之前遇到的问题:

#----- Some examples using higher-order functions -----#
      # Don't nest filters, just produce func that does both
      short_regvals = filter(both(shortline, isRegVal), lines)

# Don't multiply ad hoc functions, just describe need
      regroot_lines = \
          filter(some([isRegDBRoot, isRegDBKey, isRegDBVal]), lines)

# Don't nest transformations, make one combined transform
      capFlipNorm = compose3(upper, flip, normalize)
      cap_flip_norms = map(capFlipNorm, lines)
可以看出通过函数式编程方法,我们可以不仅获得更加精炼的代码,以及更好的可读性.
任何嵌套的filter 和map函数都可以通过高级组合函数进行化简,总的来说,函数式编程方法得到的代码量应该在常规方法代码量的一半。
这种高级组合函数的另外一个好处是;他们可以提供一整套的函数的布尔表达式。
  #*---------- Simple Boolean algebra of values ----------#
      satisfied = (this or that) and (foo or bar)
在文本处理环境下,这样的操作经常是一些predic函数的结果。如下:
  #*---------- Boolean algebra of return values ----------#
      satisfied = (thisP(s) or thatP(s)) and (fooP(s) or barP(s))
通过之前的高级组合函数,我们可以得到如下代码:
 #*------ Boolean algebra of composed functions ------#
      satisfiedP = both(either(thisP,thatP), either(fooP,barP))
精简如斯啊。
一些问题下次再翻译,睡了。

转载于:https://www.cnblogs.com/zhangsong/archive/2012/07/10/2585412.html

python 文本处理2相关推荐

  1. python中文编辑器推荐-python文本编辑器是什么

    Python是一种计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的.大型项目的开发. pytho ...

  2. python 文本处理模块_Python文本处理几种方法

    Python文本处理几种方法 方法一:readline函数#-*- coding: UTF-8 -*- f = open("D:\pythontest\splm_ugslmd.log&quo ...

  3. python文本分类_教你用python做文本分类

    什么是文本分类 一个文本分类问题就是将一篇文档归入预先定义的几个类别中的一个或几个.通俗点说,就是拿一篇文章,问计算机这文章要说的究竟是体育,经济还是教育.文本分类是一个监督学习的过程,常见的应用就是 ...

  4. python 文本向量化_Python文本特征抽取与向量化算法学习

    本文为大家共享了Python文本特征抽取与向量化的详细代码,供大家参考,详细内容如下 假设我们刚看完诺兰的大片<星际穿越>,设想怎么让机器来自动分析各位观众对电影的评价到底是"赞 ...

  5. Python文本处理几种方法

    Python文本处理几种方法 方法一:readline函数 #-*- coding: UTF-8 -*- f = open("D:\pythontest\splm_ugslmd.log&qu ...

  6. python文本结构化处理_在Python中标记非结构化文本数据

    python文本结构化处理 Labelled data has been a crucial demand for supervised machine learning leading to a n ...

  7. python文本进度条94页_Python学习笔记 | 实例4:文本进度条

    本文为中国大学MOOC<Python语言程序设计>课程学习笔记,课程主讲:嵩天老师,练习平台:Python123,参考教材:<Python语言程序设计基础> 文本进度条-简单的 ...

  8. python 文本框位置_「每日一练」Python文本框的显示和插入

    Python强大之处在于对于数据的处理,而处理数据就离不开文本框,那么你知道Python中文本框是如何显示和插入吗? 案例 python文本框的显示和插入 先上代码~ 运行效果 题目详述 第一行: i ...

  9. Python文本转化语音模块大比拼,看看青铜与王者的差别!

    文本转语音 如果把Python比喻成游戏中的一个英雄,你觉得它是谁?对于Dota老玩家来说,我会想到钢琴手卡尔!感觉Python和卡尔一样,除了生孩子什么都可以做的角色.日常生活中,我们会涉及到很多语 ...

  10. python 文本相似度现状_python文本相似度分析

    如何用python计算文本的相似度 同学欢迎来到CSS布局HTML~文本的相似度计算是NLP(自然语言处理)方向的范畴,感兴趣可以找相关的书籍详细学习研究.同学问的这个问题,可以搜索:python文本 ...

最新文章

  1. equal与hashcode的区别
  2. python教程笔记(详细)
  3. shell字符串处理
  4. 企业核心员工的长期激励计划
  5. python 学习DAY03
  6. Tomcat配置及原理文章
  7. oidc_使用Java EE和OIDC构建Java REST API
  8. 对于刚开始使用该软件,应该在熟悉基本的markdown语法的基础上,再进行快捷键的使用!...
  9. 两个变量实现查找坏环c语言,C/C++编程笔记:C语言编程知识要点总结!大一C语言知识点(全)...
  10. unity中Animation与Animator的区别
  11. 使用python下载文件_利用python web框架做文件流下载
  12. 【rmzt:suika动漫美女可爱主题】
  13. 机器学习8-误差逆传播算法BP的认识
  14. 《Machine Learning in Action》—— 白话贝叶斯,“恰瓜群众”应该恰好瓜还是恰坏瓜
  15. 别在直接背3500个英语单词了,支你一招,看过来
  16. 信用卡智能还款是什么,靠不靠谱?
  17. 特征图谱字典_空间数据图谱为特征
  18. 解决 WIDOWS 2003 SERVER 玩不了3D游戏
  19. 测试总结:如何进行弱网测试
  20. Sun ONE 白皮书

热门文章

  1. 利用posix_fadvise清理系统中的文件缓存
  2. 《Python Cookbook 3rd》笔记(2.2):字符串开头或结尾匹配
  3. 将结构体数据存储到一段字符串string中
  4. 英语口语小组PPT--袁隆平
  5. SpringBoot —— Bean的注入方式
  6. 解决 Idea 卡在 Resolving Maven dependencies ...
  7. 解决: bash: unzip: command not found、linux 安装 zip 命令
  8. JDK8下载|JDK1.8下载可选择window版和linux版
  9. 写给大数据开发初学者的话2
  10. 解决 Unable to translate SQLException with Error code ‘17059‘, will now try the fallback translator