map/reduce

1. {'a':1,'b':2}[s]是一个字典取值的写法。{'a':1,'b':2}是一个字典。[s]是key,类似于索引。此处正确取值方法是。

>>{'a':1,'b':2}['a']
>>1
在你的例子中a b应被1 2代替。注意不要漏掉引号。这一步做到了字符串类型向整数型的转变。


2.MapReduce这两个函数在你的例子中的功能我尽量表述简单。

Map:接受了两个参数。
1.一个接受一个参数并返回一个返回值的函数(Python“函数式编程”特点,一个函数的参数可以是另一个函数)。
2.一个可迭代对象(如list,tuple等,字符串可以被简单视为一个list)。
该函数会将参数1中的函数应用到参数2中可迭代对象的每一个元素上,并返回结果。


Reduce:接受了两个参数。
1.一个接受两个参数并返回一个返回值的函数。
2.一个可迭代对象。
该函数会将参数1中的函数依次用于可迭代对象的第一项和第二项,得到一个结果;再用于前一个得到的结果和第三项……以此类推,最后将一个可迭代对象通过参数1函数计算得出一个值.


例子1:

return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s] 这个语法是按照字典key 取值。你传的key 不存在,当然就报错。char2num函数用在下面map函数内。char2num(s) 问题是这个形式参数取的名字不是很好。可以换一个名字,你可能好理解,在map(char2num, x) 传的是x(是一个字符串)的元素(按索引取的元素。)。


Python内建的filter()函数用于过滤序列。
和map()类似,filter()也接收一个函数和一个序列。和map()不同的时,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。

例子2:

def not_empty(s):
return s.strip() and s
l1 = filter(not_empty, ['A', '', 'B', None, 'C', ' '])
print l1

错误提示:
Traceback (most recent call last):
File "TestLearnP.py", line 53, in <module>
l1 = filter(not_empty, ['A', '', 'B', None, 'C', ' '])
File "TestLearnP.py", line 52, in not_empty
return s.strip() and s
AttributeError: 'NoneType' object has no attribute 'strip'

【原因】

理解一下python中and的用法 ,and用于返回作用范围内第一个假值或最后一个真值(有假值直接返回假值,全为真返回最后一个真值),同一优先级从左向右执行。
第一种情况:return s.strip() and s
使用help("".strip)查看函数功能,s.strip(rm)用于移除字符串头尾指定的字符,rm为要删除的字符序列,当rm为空时,默认删除空白符(包括'\n', '\r', '\t', ' '),None的数据类型为NoneType,会因为数据类型不匹配而报错。
第二种情况:return s and s.strip()
当s为None,在and指令中其boolean值为False,直接返回None而不会继续判断下去。同理''的boolean值也为Flase直接返回''。
而' 'boolean值为1,不过因为s.strip()会删除空白符得到''为False,最后返回'',最后filter()根据返回值为True还是False决定是否保留元素

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值