言外之意是,在实践中为了更具体直白地表达出业务,可能不需要进一步抽象成 pluck() 。
- print pipeline_each(bands, [call(lambda x: 'Canada', 'country'),
- call(lambda x: x.replace('.', ''), 'name'),
- call(str.title, 'name'),
- pluck(['name', 'country'])])
练习5: pluck() 输入是要从每条记录中提取键的列表。试着实现一下。它会是一个高阶函数。
我的实现方案:
- def pluck(keys):
- def pluck_fn(record):
- return reduce(lambda a, x: assoc(a, x, record[x]),
- keys,
- {})
- return pluck_fn
现在开始我们可以做什么?
函数式代码与其他风格的代码可以很好地共存。本文中的转换实现可以应用于任何语言的任何代码库。试着应用到你自己的代码中。
想想特工玛丽、伊丝拉和山姆。转换列表迭代为 map 和 reduce 。
想想车赛。将代码分解为函数。将这些函数转成函数式的。将重复过程的循环转成递归。
想想乐队。将一系列操作转为管道。
注:
- 不可变数据是无法更改的。某些语言(如
Clojure )默认就是所有值都不可变。任何『变更』操作都会复制该值,更改副本然后返回更改后的副本。这消除了不完整模型下程序可能进入状态所带来的 Bug 。
- 支持一等公民函数的语言允许像任何其他值一样对待函数。这意味着函数可以创建,传递给函数,从函数返回,以及存储在数据结构中。
- 尾调用优化是一个编程语言特性。函数递归调用时,会创建一个新的栈帧(
stack frame )。栈帧用于存储当前函数调用的参数和本地值。如果函数递归很多次,解释器或编译器可能会耗尽内存。支持尾调用优化的语言为其整个递归调用序列重用相同的栈帧。像 Python 这样没有尾调用优化的语言通常会限制函数递归的次数(如数千次)。对于上面例子中 race() 函数,因为只有5个时间段,所以是安全的。
- 柯里化(
currying )是指将一个带有多个参数的函数转换成另一个函数,这个函数接受第一个参数,并返回一个接受下一个参数的函数,依此类推所有参数。
- 并行化(
parallelization )是指,在没有同步的情况下,相同的代码可以并发运行。这些并发处理通常运行在多个处理器上。
- 惰性求值(
lazy evaluation )是一种编译器技术,可以避免在需要结果之前运行代码。
- 如果每次重复执行都产生相同的结果,则过程就是确定性的。
【编辑推荐】 - PYPL 9 月编程语言排行榜发布,Python 一枝独秀
- 用 Rust 开发 Linux 驱动?内核维护者表示愿意接受
- 为什么谷歌的开发人员认为敏捷开发是无稽之谈?
- 苹果可能以人民币美元 1:1 的兑换率给中国开发者汇款
- 编程语言Nim 中文官网现已上线
【责任编辑:张燕妮 TEL:(010)68476606】
点赞 0 (编辑:好传媒网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|