让我们另外再来看看这么两个函数, zero() 和 one() :
- def zero(s):
- if s[0] == "0":
- return s[1:]
-
- def one(s):
- if s[0] == "1":
- return s[1:]
zero() 输入一个字符串 s 。如果第一个字符是 '0' ,则返回字符串的其余部分。如果不是,则返回 None , Python 函数的默认返回值。 one() 做同样的事情,但关注的是第一个字符 '1' 。
假设有一个叫做 rule_sequence() 的函数,输入一个字符串和规则函数的列表,比如 zero() 和 one() :
- 调用字符串上的第一个规则。
- 除非
None 返回,否则它将获取返回值并在其上调用第二个规则。
- 除非
None 返回,否则它将获取返回值并在其上调用第三个规则。
- 等等。
- 如果任何规则返回
None ,则 rule_sequence() 停止并返回 None 。
- 否则,它返回最终规则的返回值。
下面是一些示例输入和输出:
- print rule_sequence('0101', [zero, one, zero])
- # => 1
-
- print rule_sequence('0101', [zero, zero])
- # => None
这是命令式版本的 rule_sequence() 实现:
- def rule_sequence(s, rules):
- for rule in rules:
- s = rule(s)
- if s == None:
- break
-
- return s
练习3:上面的代码使用循环来实现。通过重写为递归来使其更具声明性。
我的实现方案:
- def rule_sequence(s, rules):
- if s == None or not rules:
- return s
- else:
- return rule_sequence(rules[0](s), rules[1:])
使用管道
在上一节中,我们重写一些命令性循环成为调用辅助函数的递归。在本节中,将使用称为管道的技术重写另一类型的命令循环。
下面的循环对乐队字典执行转换,字典包含了乐队名、错误的所属国家和活跃状态。
- bands = [{'name': 'sunset rubdown', 'country': 'UK', 'active': False},
- {'name': 'women', 'country': 'Germany', 'active': False},
- {'name': 'a silver mt. zion', 'country': 'Spain', 'active': True}]
-
- def format_bands(bands):
- for band in bands:
- band['country'] = 'Canada'
- band['name'] = band['name'].replace('.', '')
- band['name'] = band['name'].title()
-
- format_bands(bands)
-
- print bands
- # => [{'name': 'Sunset Rubdown', 'active': False, 'country': 'Canada'},
- # {'name': 'Women', 'active': False, 'country': 'Canada' },
- # {'name': 'A Silver Mt Zion', 'active': True, 'country': 'Canada'}]
(编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|