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决定是否保留元素