Anders Wang


我所认识的每个人都是榜样,都有值得我去尊敬和学习的地方。


Python常用高阶函数

高阶函数是在Python中一个非常有用的功能函数,所谓高阶函数就是一个函数可以用来接收另一个函数作为参数,这样的函数叫做高阶函数。

为了便于理解,我们从实际例子来看看函数当做参数被传递到另个函数是什么样的。我们把abs()函数赋值给了f变量,接下来你就可以像使用abs()函数本身那样使用f变量了,区别只是换了个名字而已。

# 将求绝对值的abs函数赋值给f变量
f = abs  
# f变量等同于abs函数的功能和性质,区别只是换了个别名
f(-123)

# 输出内容:
# 123

我们来查看下这个f变量的类型,显示为内置函数,因为它的真身就是内置abs()函数。

type(f)

# 输出内容:
# builtin_function_or_method

这说明变量可以指向函数,既然变量可以指向函数,而我们知道函数的参数可以接收变量。也就是说一个函数可以接收另一个函数作为参数,一起来看看下面这个例子。

def add_number(a, b, func_abs):  
# 在本例中,等同于执行的是 return abs(a) + abs(b)
    return func_abs(a) + func_abs(b)

result = add_number(-10, -20, abs)  
print(result)

# 输出内容:
# 30

如上,我们定义了一个addnumber函数,然后定义了3个函数参数变量分别为a,b,funcabs。通过函数内部语句我们可以发现funcabs其实是另一个函数体内的函数,所以funcabs变量由于被调用的时候传值为abs函数,它的实际真身就是abs函数了。

好了,彻底明白高阶函数了,来看看Python中常用的几个高阶函数。

map()

map()是 Python 内置的高阶函数,它接收一个函数function 和一个 list,并通过把函数 function 依次作用在 list 的每个元素上,得到一个新的 list 并返回。

这个例子中,假设用户输入的英文名字不规范,没有按照首字母大写,后续字母小写的规则,可以利用map()函数把一个list(包含若干不规范的英文名字)变成一个包含规范英文名字的list。

def format_name(s):  
    return s.capitalize()

result = map(format_name, ['adam', 'LISA', 'barT'])  
print(list(result))

# 输出内容:
# ['Adam', 'Lisa', 'Bart']

如上要注意的一点是,由于结果result是一个Iterator,Iterator是惰性可迭代序列,因此通过list()函数让它把整个序列都计算出来并返回一个list。

filter()

filter()接收一个函数function 和一个list,这个function 的作用是对list的每个元素进行判断,返回True或False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。

下面的示例中,我们做的是把列表中包含字符E的元素取出来。

def is_contain_s(s):  
    if 'E' in s:
        return True
    else:
        return False

result = filter(is_contain_s, ['sTEst', 'abc', 'str', ' ', 'END'])  
print(list(result))

# 输出内容:
# ['sTEst', 'END']

reduce()

reduce()函数也接收一个函数function, 和一个list。但reduce()传入的函数必须接收两个参数,reduce()对list的每个元素反复调用函数function, 并返回最终结果值。

在Python 3里,reduce()函数已经被从全局名字空间里移除了,它现在被放置在fucntools模块里, 要使用的话要 先引入from functools import reduce

from functools import reduce

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

result = reduce(f, [1, 3, 5, 7, 9])  
print(result)

# 输出内容:
# 25

reduce()函数使用起来比较特殊,为了更好的理解上面这个例子,来详细拆解下,当调用reduce(f,[1,3,5,7,9])时,reduce函数将做如下计算:

由于f这个函数的功能是计算两个元素的值,所以先计算头两个元素:f(1,3),结果为4;

再把结果和第3个元素计算:f(4,5),结果为9;

再把结果和第4个元素计算:f(9,7),结果为16;

再把结果和第5个元素计算:f(16,9),结果为25;

由于没有更多的元素了,计算结束,返回结果25。

reduce()还可以接收第3个可选参数,作为计算的初始值。如果把初始值设为100,如计算:

reduce(f, [1, 3, 5, 7, 9], 100)

结果将变为125,因为第一轮计算是:计算初始值和第一个元素:f(100, 1),结果为101

最近的文章

@classmethod与@staticmethod区别

在Python中有3种方式定义类方法分别是常规方式、@classmethod修饰方式、@staticmethod修饰方式。 接下来分别对3种不同方式的定义举例说明。 普通方法: 其实就是需要操作一些实…

Python, 技术博文详细阅读
更早的文章

理解Python中is 与 == 的区别

在Python中,有一个问题会被经常问到,那就是运算符is与==有什么区别? 很多人都知道他们都是比较两个对象是否相等,说起来都是比较对象,但是分不清什么时候用哪个,其实非常容易区分只要记住一点。…

Python, 技术博文详细阅读
comments powered by Disqus