这篇我们讲讲python的高阶函数
在讲高阶函数前面,我们先看一个实例:
-
#!/usr/bin/env python
-
# -*- coding:utf-8 -*-
-
# Author :Alvin.xie
-
# @Time :2017-11-02 12:03
-
# @file :gaojiefunc.py
-
-
-
def f(x):
-
return x * x
-
-
def h(func, x):
-
return func(x) * func(x)
-
-
print(h(f, 2))
运行结果是:16
这段代码中函数h
就是一个高阶函数,因为它的第一个参数是一个函数(即接受一个函数作为输入,满足高阶函数的第一个条件)。
再来看一个:
-
#!/usr/bin/env python
-
# -*- coding:utf-8 -*-
-
# Author :Alvin.xie
-
# @Time :2017-11-02 12:58
-
# @file :func.py
-
-
-
def m(x):
-
def n():
-
return x * x
-
return n
-
-
print(m(2)())
运行结果是:4
在函数m
内部定义了一个子函数n
,并且将该函数作为返回值返回。
当我们调用m(2)
时,返回值是函数n
,那么m(2)()
就是对函数n
的调用。
map() 函数
map(func,lst),将传入的函数变量func作用到lst变量的每个元素中,并将结果组成新的列表返回。
实例如下:
-
#!/usr/bin/env python
-
# -*- coding:utf-8 -*-
-
# Author :Alvin.xie
-
# @Time :2017-11-02 12:03
-
# @file :gaojiefunc.py
-
import math
-
-
x_2 = [x**2 for x in xrange(9)]
-
print x_2
-
-
x_sqrt_lst = map(math.sqrt,x_2)
-
print x_sqrt_lst
-
-
x_2_str_lst = map(str,x_2)
-
print x_2_str_lst
运行结果:
[0, 1, 4, 9, 16, 25, 36, 49, 64]
[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]
['0', '1', '4', '9', '16', '25', '36', '49', '64']
由此可见:
:map函数有两个参数,一个是函数,另一个是列表,返回值为对传入的列表每一个元素执行传入的函数操作得到的列表
reduce()函数
reduce(func(x,y), lst) ,其中func必须有两个参数,每次func计算的结果继续和序列的下一个元素做累积计算。
lst = [a1,a2,a3,...,an]
reduce(func(x,y),lst) = func(func(func(a1,a2),a3),......,an)
实例一:
-
#!/usr/bin/env python
-
# -*- coding:utf-8 -*-
-
# Author :Alvin.xie
-
# @Time :2017-11-02 13:15
-
# @file :reducefun.py
-
-
-
str_lst = map(str,range(5))
-
print str_lst
-
-
def make_num(str1, str2):
-
return int(str1) + int(str2)
-
-
result = reduce(make_num, str_lst)
-
print result
运行结果如下:
['0', '1', '2', '3', '4']
10
实例二:
-
#!/usr/bin/env python
-
# -*- coding:utf-8 -*-
-
# Author :Alvin.xie
-
# @Time :2017-11-02 13:15
-
# @file :reducefun.py
-
-
-
def prod(x, y):
-
return x*y;
-
-
result = reduce(prod, [2, 4, 5, 7, 12])
-
-
print result
运行结果如下:
3360
由此可见:reduce函数也有两个参数,一个是函数,另一个是列表,返回值为对list的每一个元素反复调用函数f,得到最终结果。
filter()函数
filter函数接受函数参数f和列表参数lst,f对lst元素进行判断,返回lst的元素中调用f函数结果为true的元素组成的列表(将不满足f函数条件的元素过滤掉)
实例如下:
-
#!/usr/bin/env python
-
# -*- coding:utf-8 -*-
-
# Author :Alvin.xie
-
# @Time :2017-11-02 13:30
-
# @file :filterfun.py
-
-
-
number_lst = range(-10,10)
-
-
def is_negative(x):
-
return x < 0
-
-
filtered_lst = filter(is_negative,number_lst)
-
print number_lst
-
print filtered_lst
运行结果如下:
[-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[-10, -9, -8, -7, -6, -5, -4, -3, -2, -1]
sorted()函数
sorted函数接受一个列表lst和一个函数参数f,f为自定义的比较lst元素大小的函数,返回值为lst中元素按f函数排列的列表
实例一:
-
#!/usr/bin/env python
-
# -*- coding:utf-8 -*-
-
# Author :Alvin.xie
-
# @Time :2017-11-02 13:36
-
# @file :sortedfunc.py
-
-
-
L = [('b',2),('a',1),('c',3),('d',4)]
-
# 利用cmp函数
-
print sorted(L, cmp=lambda x,y:cmp(x[1],y[1]))
-
# 利用key
-
print sorted(L, key=lambda x:x[1])
-
-
-
students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
-
# 按年龄排序
-
print sorted(students, key=lambda s: s[2])
-
# 按降序
-
print sorted(students, key=lambda s: s[2], reverse=True)
运行结果:
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
实例二:
-
#!/usr/bin/env python
-
# -*- coding:utf-8 -*-
-
# Author :Alvin.xie
-
# @Time :2017-11-02 13:36
-
# @file :sortedfunc.py
-
-
# 列表排序
-
result = sorted([35, 8, 12, 9, 23])
-
print result
-
-
# 自定义排序
-
def reversed_cmp(x,y):
-
if x>y:
-
return -1
-
if x<y:
-
return 1
-
return 0
-
-
alist = [35, 8, 12, 9, 23,8,15]
-
-
result1 = sorted(alist,reversed_cmp)
-
result2 = sorted(alist,reversed_cmp,reverse=False)
-
result3 = sorted(alist,reversed_cmp,reverse=True)
-
-
print result1
-
print result2
-
print result3
-
-
def cmp_ignore_case(s1, s2):
-
return cmp(s1.lower(),s2.lower())
-
-
print sorted(['bob', 'about', 'Zoo', 'Credit'], cmp_ignore_case)
[8, 9, 12, 23, 35]
[35, 23, 15, 12, 9, 8, 8]
[35, 23, 15, 12, 9, 8, 8]
[8, 8, 9, 12, 15, 23, 35]
['about', 'bob', 'Credit', 'Zoo']
匿名函数 lambda
lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数
匿名函数有个限制,就是只能有一个表达式,不用写return返回值就是该表达式的结果。
用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数:
先来看个简单 lambda 函数
>>>lambda x,y : x+y
x和y是函数的两个参数,冒号后面的表达式是函数的返回值,这个函数就是在求2个变量的和,但是作为一个函数,没有名字如何使用?我们暂时给它
绑定一个名字,看看如何调用
更流行的应用如下
# 将一个 list 里的每个元素都平方:
阅读(1275) | 评论(0) | 转发(0) |