map函数是python的内置的高阶函数,接受两个参数,第一个就是函数f,另一个就是列表list,作用就是f函数作用于list的每一个元素,这里需要注意的一点是map()函数作用于一个list时,会返回一个新的list,并不会改变原有的list
在做课后习题时
题目:
假设用户输入的英文名字不规范,没有按照首字母大写,后续字母小写的规则,请利用map()函数,把一个list(包含若干不规范的英文名字)变成一个包含规范英文名字的list:
输入:[‘adam’, ‘LISA’, ‘barT’]
输出:[‘Adam’, ‘Lisa’, ‘Bart’]
出现一个问题:
def f(s):
... s[0]=s[0].upper()
... return s
...
>>> f('xuanxuan')
Traceback (most recent call last):
File "" , line 1, in
File "" , line 2, in f
TypeError: 'str' object does not support item assignment
原因就是,字符串是不可变对象,不要试图通过下标索引赋值的方式去改变原来字符串的值!
解决办法:
def format_name(s):
s1=s[0].upper()+s[1:].lower()
return s1
print map(format_name, ['adam', 'LISA', 'barT'])
也就是说map()函数的返回值是一个新的list,该返回值是由函数f作用于list的每一个元素得到的
reduce()函数也是python内置的高阶函数,和map函数一样,也是需要接收两个参数,第一个参数就是要作用的函数f,另一个参数就是list,只不过和map函数不同的是,该函数f必须的接收两个参数!其实reduce函数有点类似于对每一个元素反复的使用f,前后相关,且有累计效应~
题目:
Python内置了求和函数sum(),但没有求积的函数,请利用recude()来求积:
输入:[2, 4, 5, 7, 12]
输出:2*4*5*7*12的结果
def prod(x, y):
return x*y
print reduce(prod, [2, 4, 5, 7, 12])
filter函数也是python内置的高阶函数,也是接收两个参数,第一个参数是函数f,另一个参数是list,参数中的filter函数返回的是一个Ture 或者False类型的,当把该
函数作用于list中的每一个元素时,保留值为True的元素,去掉不满足条件的,将满足条件的元素,以一个新的list返回~
该filter函数可以用于返回一个数组中字符串为空,或者元素为None的元素:
这时候filter中参数f的功能就是得写一个函数,他可以判断该元素不是None且不是空的字符
>>> def is_not_empty(s):
... return s and len(s.strip())>0
...
>>>
接下来就可以使用filter函数去掉数组中不满足条件的元素,返回一个新的list
>>> print(filter(is_not_empty,['','as',' ha',' ',None]))
结果为:
['as', ' ha'] #输出的结果
这里需要补充一个知识点strip()函数
s.strip(rm) 可以用于去除s字符串中开头和结尾的rm序列(如果有的话),rm为空时,默认删除空白符,包括‘\n’,’\r’,’\t’, 例如:
>>> s=' 0sd1 '
>>> s.strip()
'0sd1'
>>>
题目:
请利用filter()过滤出1~100中平方根是整数的数,即结果应该是:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
解法一(我自己写的):
import math
def is_sqr(x):
return math.sqrt(x) in range(1,51)
print filter(is_sqr, range(1, 101))
解法二(别人的解法,更好):
import math
def is_sqr(x):
r=int(math.sqrt(x))
return r*r==x
print(filter(is_sqr,range(1,101)))
看到了一篇讲map,reduce filter函数最形象的博客:
https://blog.csdn.net/u011197534/article/details/53747316