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

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

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

第一次运行 test_pluraize 时该测试可以或许通过,但往后每次运行城市失败,由于它会重复添加“s”和“es”。为了让它酿成纯函数, 可以这样写:

  1. dictionary = ['fox', 'boss', 'orange', 'toes', 'fairy', 'cup']  
  2. def puralize(words):  
  3.  result = []  
  4.  for word in words:  
  5.  word = words[i]  
  6.  if word.endswith('s') or word.endswith('x'):  
  7.  plural = word + 'es')  
  8.  if word.endswith('y'):  
  9.  plural = word[:-1] + 'ies'  
  10.  else:  
  11.  plural = + 's'  
  12.  result.append(plural)  
  13.  return result  
  14. def test_pluralize():  
  15.  result = pluralize(dictionary)  
  16.  assert result == ['foxes', 'bosses', 'oranges', 'toeses', 'fairies', 'cups'] 

留意这里并没有行使任何 FP 特有的观念,只是建设并返回了一个新的工具,而不是重用并修改已有的旧工具。这样输入的内容也会保持稳固。

固然这个例子像个玩具,但想象一下,假如你转达并改变了某个伟大的工具,可能通过数据库毗连举办了某些操纵。当编写许多许多测试用例时就会发明,你必需很是警惕地处理赏罚测试用例的次序,可能花大量价钱在每个测试用例之后破除并从头建设状态。这些事变应该是在 e2e 集成测试阶段的活儿,不该该在较量小的单位测试阶段举办。

领略(并停止)可修改性

先来个观测,你以为哪些数据布局是可修改的?

为什么这一点很重要?有些时辰列表和元组可以交流行使,因此人们常常会在代码中随机行使两者之一。于是当你试图修改一个元组(好比给个中一个元素赋值)时就会堕落。可能试图用列表作为字典的键,也会导致 TypeError,由于列表是可修改的。元组和字符串可以作为字典的键行使,由于它们不行修改,可以获得确定的哈希值,而其他数据布局都不可,由于它们的工具标识纵然保持稳固,值也会改变。

最重要的是,在转达字典、列表或集适时,它们也许会在其他上下文中被料想之外地改变。这种题目很是难以调试。可修改的默认参数就是个经典的例子:

  1. def add_bar(items=[]):  
  2.  items.append('bar')  
  3.  return items  
  4. l = add_bar() # l is ['bar']  
  5. l.append('foo')  
  6. add_bar() # returns ['bar', 'foo', 'bar'] 

字典、荟萃和列表很强盛、服从很高、很是 Python,并且很是有效。写代码时完全不行使它们是不明智的。但纵然云云,我永久会在默认参数的位置行使元组或 None(取代空字典或空列表),而且在缺乏足够的防止代码的环境下,停止将可修改的数据布局在差异的上下文中转达。

镌汰类的行使

类(及着实例)的可修改性是把双刃剑。跟着写的 Python 代码越来越多,,我开始倾向于仅在绝对须要时才行使类,并且我险些从不行使可修改的类属性。对付那些高度面向工具的说话(如 Java)的措施员来嗣魅这一点也许很难做到,但很多其他说话中在类层面完成的对象,在 Python 可以在模块层面完成。譬喻,假如必要将函数或常量或定名空间分组,那么可以把它们一路放到另一个 .py 文件中。

我常常看到一些类的目标是生涯几个定名变量的值,这种环境下 namedtuple(其范例是 typing.NamedTuple)就足够,并且照旧不行改变的。

  1. from collections import namedtuple  
  2. VerbTenses = namedtuple('VerbTenses', ['past', 'present', 'future'])  
  3. # versus  
  4. class VerbTenses(object):  
  5.  def __init__(self, past, present, future):  
  6.  self.past = past,  
  7.  self.present = present  
  8.  self.future = future 

假如确实必要状态的来历,并且多个视图都必要改变该状态,那么类是绝佳的选择。另外,与静态要领对比,我更倾向于单例纯函数,这样它们能在其他上下文中组合行使。

(编辑:湖南网)

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

热点阅读