| 
                         言外之意是,在实践中为了更具体直白地表达出业务,可能不需要进一步抽象成 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                        (编辑:91站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |