加入收藏 | 设为首页 | 会员中心 | 我要投稿 晋中站长网 (https://www.0354zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 移动互联 > 评测 > 正文

手把手介绍函数式编程:从命令式重构到函数式

发布时间:2019-09-10 00:12:11 所属栏目:评测 来源:佚名
导读:本文是一篇手把手的函数式编程入门介绍,借助代码示例讲解细腻。但又不乏洞见,第一节中列举和点评了函数式种种让眼花缭乱的特质,给出了『理解函数式特质的指南针:函数式代码的核心特质就一条,无副作用』,相信这个指南针对于有积极学过挖过函数式的同

让我们另外再来看看这么两个函数, zero() 和 one() :

  1. def zero(s): 
  2.     if s[0] == "0": 
  3.         return s[1:] 
  4.  
  5. def one(s): 
  6.     if s[0] == "1": 
  7.         return s[1:] 

zero() 输入一个字符串 s 。如果第一个字符是 '0' ,则返回字符串的其余部分。如果不是,则返回 None , Python 函数的默认返回值。 one() 做同样的事情,但关注的是第一个字符 '1'

假设有一个叫做 rule_sequence() 的函数,输入一个字符串和规则函数的列表,比如 zero()和 one() :

  1. 调用字符串上的第一个规则。
  2. 除非 None 返回,否则它将获取返回值并在其上调用第二个规则。
  3. 除非 None 返回,否则它将获取返回值并在其上调用第三个规则。
  4. 等等。
  5. 如果任何规则返回 None ,则 rule_sequence() 停止并返回 None 。
  6. 否则,它返回最终规则的返回值。

下面是一些示例输入和输出:

  1. print rule_sequence('0101', [zero, one, zero]) 
  2. # => 1 
  3.  
  4. print rule_sequence('0101', [zero, zero]) 
  5. # => None 

这是命令式版本的 rule_sequence() 实现:

  1. def rule_sequence(s, rules): 
  2.     for rule in rules: 
  3.         s = rule(s) 
  4.         if s == None: 
  5.             break 
  6.  
  7.     return s 

练习3:上面的代码使用循环来实现。通过重写为递归来使其更具声明性。

我的实现方案:

  1. def rule_sequence(s, rules): 
  2.     if s == None or not rules: 
  3.         return s 
  4.     else: 
  5.         return rule_sequence(rules[0](s), rules[1:]) 
使用管道

在上一节中,我们重写一些命令性循环成为调用辅助函数的递归。在本节中,将使用称为管道的技术重写另一类型的命令循环。

下面的循环对乐队字典执行转换,字典包含了乐队名、错误的所属国家和活跃状态。

  1. bands = [{'name': 'sunset rubdown', 'country': 'UK', 'active': False}, 
  2.          {'name': 'women', 'country': 'Germany', 'active': False}, 
  3.          {'name': 'a silver mt. zion', 'country': 'Spain', 'active': True}] 
  4.  
  5. def format_bands(bands): 
  6.     for band in bands: 
  7.         band['country'] = 'Canada' 
  8.         band['name'] = band['name'].replace('.', '') 
  9.         band['name'] = band['name'].title() 
  10.  
  11. format_bands(bands) 
  12.  
  13. print bands 
  14. # => [{'name': 'Sunset Rubdown', 'active': False, 'country': 'Canada'}, 
  15. #     {'name': 'Women', 'active': False, 'country': 'Canada' }, 
  16. #     {'name': 'A Silver Mt Zion', 'active': True, 'country': 'Canada'}] 

(编辑:晋中站长网)

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

热点阅读