Python学习之旅(十三)

Python基础知识(12):函数(Ⅲ)

高阶函数

1、map

map()函数接收两个参数,一个是函数,一个是Iterablemap将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。

def test(x):
    return x+2
n=map(test,[1,2,3,4,5])
list(n)

结果:

[3, 4, 5, 6, 7]

把列表中的数字转换成字符串

list(map(str,[1,2,3,4,5]))

结果:

['1', '2', '3', '4', '5']

 

2、reduce

接收两个参数,一个函数,一个序列,reduce会把结果继续和序列的下一个元素做累积计算

如对序列[1,2,3,4,5]求和

def add(x,y):
    return x+y

reduce(add,[1,2,3,4,5])

结果:15

把序列[1,2,3]转换成整数15

def test(x,y):
    return x*10+y

reduce(test,[1,2,3])

结果:123

与map函数配合使用,把str转换成int

from functools import reduce

digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}

def strint(s):
    def fn(x,y):
        return x*10+y
    def charnum(s):
        return digits[s]
    return reduce(fn,map(charnum,s))

strint("123")

结果:123

可以用lambda匿名函数进一步简化

from functools import reduce

digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
def charnum(s):
    return digits[s]

def strint(s):
    return reduce(lambda x,y:x*10+y,map(charnum,s))

strint("123")

结果:123

3、filter

filter函数用于过滤序列,它接收两个参数,一个函数一个序列

filter函数会根据函数内的条件遍历序列,判断每个元素的布尔值,如果为True则保留

filter()函数返回的是一个Iterator,所以要强迫filter()完成计算结果,需要用list()函数获得所有结果并返回list

def test(x):
    return x%2==0

list(filter(test,[1,3,6,8,10,17]))

结果:

[6, 8, 10]

删除序列中的空字符

def not_empty(n):
    return n and n.strip()

list(filter(not_empty, ['Alice', '', 'Bob', None, 'May', '  ']))

结果:

['Alice', 'Bob', 'May']

4、sorted

可以对字符串和列表中的元素进行排序

sorted([84,24,1,136,21])

  sorted(["Bob","abc","May","Alice"])

结果:

[1, 21, 24, 84, 136]

['Alice', 'Bob', 'May', 'abc']

注:字母进行排序时,大写字母排在小写字母前面

 

接收一个key函数实现自定义,如按绝对值大小排序

sorted([-32,6,10,-1,0],key=abs)

结果:

[0, -1, 6, 10, -32]

对字母进行排序时忽略大小写,即先将字母转换成大写(或小写),然后再进行排序

sorted(["Bob","abc","May","Alice"],key=str.upper)
sorted(["Bob","abc","May","Alice"],key=str.lower)

结果:

['abc', 'Alice', 'Bob', 'May']

 

如果要进行反向排序,可以使用参数reverse=True

sorted(["Bob","abc","May","Alice"],key=str.lower,reverse=True)

结果:

['May', 'Bob', 'Alice', 'abc']

posted @ 2018-11-24 16:16  finsom  阅读(366)  评论(1编辑  收藏  举报