设为首页 收藏本站
查看: 1006|回复: 0

[经验分享] 2015/9/18 Python基础(14):函数式编程

[复制链接]

尚未签到

发表于 2015-12-1 12:08:42 | 显示全部楼层 |阅读模式
  这篇写了忘发。现在补上。
  

  
  Python不是也不大可能成为一种函数式的编程语言,但是它支持许多有价值的函数式编程语言构建。
也有些表现的像函数式编程机制但是从传统上也不能认为是函数式编程语言的构建。Python提供的以四中内建函数和lambda表达式的形式出现。
  匿名函数与lambda



lambda [arg1, [arg2, ... argN]]:expression
  Python允许用lambda关键字创造匿名函数。匿名是因为不需要以标准的方式来声明。然而,作为函数,它们也能有参数。一个完整的lambda“语句”代表了一个表达式,这个表达式的定义体必须和声明放在同一行。参数是可选的,如果用参数的话,参数通常也是表达式的一部分。
下例将展示单行语句和lambda语句的相似之处:



>>> def true():    return True
>>> true()
True
>>> lambda :True
<function <lambda> at 0x02BDA430>
>>> fun = lambda :True
>>> fun()
True
  下面是表达式的一些使用区别



def add(x, y): return x + y
lambda x, y :x + y
def usuallyAdd2(x, y=2): return x + y #有默认参数
lambda x, y=2: x + y
def showAllAsTuple (*z): return z
lambda *z: z
  lambda表达式运作起来就如一个函数,当被调用时,创造一个框架对象。将它赋值给一个对象后,该对象就是相应的函数。
  
  
  内建函数
filter()
这个函数在给定一个对象序列和一个过滤函数后,每个序列元素通过这个过滤器进行筛选,保留返回为真的对象。
如果我们想自己编写filter(),它大概是这样的:



def filter(bool_func, seq):
  filtered_seq = []
  for eachItem in seq:
    if bool_func(eachItem):
      filtered_seq.append(eachItem)
  return filtered_seq
  
map()
map()内建函数和filter()相似,因为它也能通过函数来处理序列。然而,不像filter(),map()将函数调用“映射”到每个序列的元素上,并返回一个含有所有返回值的列表。
如果我们想自己编写map(),它大概是这样的:



def map(func, seq):
  mapped_seq = []
  for eachItem in seq:
    mapped_seq.append(func(eachItem))
  return mapped_seq
  
  reduce()
reduce()使用了一个二元函数,一个序列,和一个可选的初始化器,卓有成效地将那个列表的内容“减少”为一个单一的值,如同它的名字一样。在其他语言中,这种概念称为折叠。
它通过取出序列的头两个元素,将他们传入二元函数来获得一个单一的值来实现,然后又用这个值和序列的下一个元素来获得又一个值,然后直到整个序列都遍历完毕以及最后的值会被计算出来为止。
如果我们想自己编写reduce(),它大概是这样:



def reduce(bin_func, seq, init=None):
  Iseq = list(seq) # convert to list
  if init is None: # initializer?
    res = lseq.pop(0) # no
  else:
    res = init # yes
  for item in lseq: # reduce sequence
    res = bin_func(res, item) # apply function
  return res # return result
  
  
偏函数应用
偏函数应用(partial function application, PFA),这种函数将任意数量(顺序)的参数的函数转化成另一个带剩余参数的函数对象。
这个概念和currying的概念有相关,currying也就是科里化,是指把原本接受多个参数的函数变换为接受一个单一参数的函数,并且返回接受余下参数且返回结果的新函数的技术。
这讲起来有些抽象,可以认为这个不提供参数就会使用默认参数的情形相似。在PFA的例子中,参数不需要调用函数的默认值,只需明确调用集合。
如下例子:



>>> from operator import add,mul
>>> from functools import partial
>>> add1 = partial(add,1)
>>> add1(10)
11
>>> mul100 = partial(mul, 100)
>>> mul100(5)
500
  上述的这种偏函数调用很无聊,并没有显现出偏函数的威力,但是这能让我们知道如何使用它。当调用带许多参数的函数的时候,PFA是最好的方法。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-145845-1-1.html 上篇帖子: python-redis 入门 下篇帖子: Python学习三---序列、列表、元组
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表