这篇文章是介绍Python 的高阶函数
大家可参照我的另一篇博客,是有关python函数的基本知识介绍:Python 入门 之 函数
高阶函数简介
高阶函数的概念:
把函数作为参数传入的函数即称之为高阶函数,
高阶函数是函数式编程的体现。
编写高阶函数,就是让函数的参数能够接收别的函数。
变量可以指向函数
内置函数:
ads():对数字求绝对值
调用该函数:abs(-10)
round():数字的四舍五入
调用该函数:round(6.66666)
什么是函数?
函数本身也可以赋值给变量,
即:变量可以指向函数,函数名其实就是指向函数的变量
print(abs(-1))
print(abs)
x = abs(-1)
print x
f = abs
print(f)
print(f(-1))
# 结果:
1
<built-in function abs>
1
<built-in function abs>
1
print(abs(-1))
abs = 2
print(abs(-1))
# 结果:
1
TypeError: 'int' object is not callable
什么是高阶函数?
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
def fun(x, y, f):
print(f(x), f(y))
fun(1, -2, abs)
# 结果:
1 2
内置高阶函数
内置高阶函数
-
map 函数
map(func,lst) 函数接收两个参数,一个是函数,一个是序列
map 将传入的 函数func 依次作用到 序列lst 的每个元素,并把结果作为新的 列表(Python2)/迭代器(Python3) 返回。
def fun(x): return x * x print(map(fun, range(5))) # 结果: [0, 1, 4, 9, 16] ------------------------------------- print(map(str, [1, 2, 3])) # 结果: ['1', '2', '3']
-
reduce 函数
reduce(func,lst) 把一个 函数func 作用在一个序列x1, x2, x3…上,这个函数必须接收两个参数,reduce 每次把func计算结果继续和序列的下一个元素做累积计算。
注意:在使用reduce() 函数之前,必须导入模块 functools
def add(x, y): return x + y print(reduce(add, range(5))) # 结果: 10
运行过程为 : add(add(add(add(0+1)+2)+3)+4)=10
综合编程 : 写出把 str 转换为 int 的函数(eg:’12345’–12345)
def fun(N): return {"0": 0, "1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9}[N] def fun1(x, y): return x * 10 + y print(reduce(fun1,map(fun,"12345"))) # 结果: 12345
- filter 函数
filter(func,lst) 也接收一个函数和一个序列,用于过滤序列,过滤掉不符合条件的元素,返回一个filter对象,可将其转换成list
和 map( ) 不同的时,filter( ) 把传入的函数依次作用于每个元素,然后根据返回值是 True还是 False 决定保留还是丢弃该元素
在一个 list 中,删掉偶数,只保留奇数:
def fun(n):
return n % 2 == 1
print(filter(fun,range(5)))
# 结果:
[1, 3]
sorted 函数
sorted 函数
排序也是在程序中经常用到的算法。无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。
通常规定如下:
x < y, return -1
x == y, return 0
x > y, return 1
----------------------------
print(sorted([3, 1, 2]))
print(sorted([3, 1, 2], reverse=True))
# 结果:
[1, 2, 3]
[3, 2, 1]
排序数字字符
li = ['2', '1', '4', '3']
print(sorted(li, key=int))
# 结果:
['1', '2', '3', '4']
匿名函数
匿名函数
• 当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。
• 关键字 lambda 表示匿名函数,冒号前面的 x 表示函数参数。
print(map(lambda x: x * x, [1, 2, 3, 4]))
def fun(x):
return x * x
print(map(fun, [1, 2, 3, 4]))
# 结果:
[1, 4, 9, 16]
[1, 4, 9, 16]
• 匿名函数有只能有一个表达式,不用写 return ,返回值就是该表达式的结果。
• 因为匿名函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数;
f = lambda x: x * x
print(f)
print(f(3))
# 结果:
<function <lambda> at 0x7fde80eb7938>
9
• 把匿名函数作为返回值返回。
def fun(x, y):
return lambda: x * x + y * y
print(fun(1, 2))
f = fun(1, 2)
print(f())
# 结果:
<function <lambda> at 0x7f5c2942a9b0>
5
传入多个参数
f = lambda x,y =1,*args,**kwargs :(x*y,args,kwargs)
print(f(2,4,5,a=1,b=5))
# 结果:
(8, (5,), {'a': 1, 'b': 5})