加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

在Python中使用函数式编程的最佳实践!

发布时间:2019-01-31 23:21:34 所属栏目:建站 来源:菜鸟带你学编程
导读:简介 Python 是一种成果富厚的高级编程说话。它有通用的尺度库,支持多种编程说话范式,尚有很多内部的透明度。假如你乐意,还可以查察 Python 的底层并修改,乃至能在措施运行的时辰直接修改运行时。 我最近留意到一个有履历的 Python 措施员行使 Python
副问题[/!--empirenews.page--]

简介

Python 是一种成果富厚的高级编程说话。它有通用的尺度库,支持多种编程说话范式,尚有很多内部的透明度。假如你乐意,还可以查察 Python 的底层并修改,乃至能在措施运行的时辰直接修改运行时。

我最近留意到一个有履历的 Python 措施员行使 Python 的新要领。就像很多 Python 新手一样,我在第一次看到 Python 时喜好它的简朴易懂的根基轮回、函数和类界说的语法。在把握了基本语法之后,我开始对高级成果感乐趣,如担任、天生器、元编程等。可是,我不太清晰它们的行使要领,常常会在不适当的处所行使。有一段时刻里我写的代码伟大又难领略。其后我重复修改,出格是必要恒久在统一段代码上事变时,最终会将大部门代码逐步改回行使根基的函数、轮回、单例类。

尽量云云,那些高级成果必然有其存在的来由,它们也必然长短常重要的器材。很明明,“奈何编写优越的代码”是个很是普及的话题,乃至没有独一的正确谜底!相反,这篇文章的方针是一个特定的话题:Python 中函数式编程的应用。我将接头函数式是什么,奈何在 Python 中行使,并按照我的履历先容最佳行使要领。

什么是函数式编程?

函数式编程(简称 FP)是一种编程范式,个中最根基的元素是不行修改的值,以及不与其他函数共享状态的“纯函数”。纯函数对付给定的输入永久返回同样的输出,并且不会修改任何数据,也不会造成副浸染。因此,纯函数常常与数学运算较量。譬喻,3+4 永久便是 7,不管同时举办了其他任何数学运算,也不管之前举办了几多次加法运算。

有了纯函数和不行修改的值,措施员就可以建设逻辑布局了。迭代可以用递归取代,由于递归才是让统一个举措多次执行的“函数式”做法。函数行使新的输入挪用本身,直到参数满意某个终止前提。另外,尚有高阶函数,它的输入是其他函数,返回另一个函数。我稍后会先容这个观念。

尽量函数式编程从上世纪五十年月就呈现了,并且很多说话也都实现了它,但它并没有完全地描写一门说话。Clojure、Common Lisp、Haskell 和 OCaml 都是以函数式为主的说话,也都融合了其他差异的编程说话观念,如范例体系、严酷或懒惰求值等。大大都说话还用某种要领支持副浸染,如写入文件、读取文件等,凡是这些副浸染都被细心地标志为“不纯净”。

人们凡是都以为函数式很深奥,并且与可实践性对比,它更垂青优雅和简捷。大公司很少会在大局限项目上依靠于函数式为主的说话,纵然要用也是在较小的范畴内,远远不如其他 C++、Java、Python 等说话风行。可是,FP 现实上只是一种框架,一种思量逻辑流的方法,它自己也有利益和弱点,并且也能与其他编程范式共同行使。

Python 支持什么?

尽量Python并不是以函数式为主的说话,但对它来说支持函数式编程也相比拟力轻易,由于Python中的统统都是工具。这意味着函数界说也可以赋给变量并转达。

  1. def add(a, b):  
  2.  return a + b  
  3. plus = add  
  4. plus(3, 4) # returns 7 

Lambda

通过 Lambda 表达式的语法,可以用声明式的方法建设函数。要害字 lambda 来自希腊字母,常常在正式的数学逻辑顶用来描写函数和变量的假造绑定,即“lambda 演算”,它的汗青比函数式编程还要长远。这一观念的另一个术语叫做“匿名函数”,由于 lambda 函数可以直接嵌入到行内行使,不必要事先指命名称。将匿名函数赋值给变量后,它的举动与正常函数完全一样。

  1. (lambda a, b: a + b)(3, 4) # returns 7  
  2. addition = lambda a, b: a + b  
  3. addition(3, 4) # returns 7 

lambda 函数最常见的用法就是提供应那些接管可挪用工具作为参数的函数。“可挪用工具”是任何可以或许通过括号挪用的对象,详细来说有类、函数和要领。个中最常见的用法就是在对数据布局举办排序时,通过参数的键指定排序的相对次序。

  1. authors = ['Octavia Butler', 'Isaac Asimov', 'Neal Stephenson', 'Margaret Atwood', 'Usula K Le Guin', 'Ray Bradbury']  
  2. sorted(authors, key=len) # Returns list ordered by length of author name  
  3. sorted(authors, key=lambda name: name.split()[-1]) # Returns list ordered alphabetically by last name. 

行内嵌入式 lambda 函数的弱点在于它不会在栈跟踪中表现名称,也许会给调试带来贫困。

Functools

高阶函数是函数式编程的英华,部门由 Python 直接提供,部门通过 functools 函数库提供。你也许在大局限漫衍式数据说明方面传闻过 map 和 reduce,但现实上它们也是最重要的两个高阶函数。map 在给定序列的每个元素上执行函数,然后返回功效的序列;reduce 行使一个函数网络序列中的每个元素,然后返回单个值。

  1. val = [1, 2, 3, 4, 5, 6]  
  2. # Multiply every item by two  
  3. list(map(lambda x: x * 2, val)) # [2, 4, 6, 8, 10, 12]  
  4. # Take the factorial by multiplying the value so far to the next item  
  5. reduce(lambda: x, y: x * y, val, 1) # 1 * 1 * 2 * 3 * 4 * 5 * 6 

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读