Pyhton 【函数式编程】
高阶函数,①参数是函数的函数 、②返回值的函数的函数。
(1)参数是函数的函数
[前提] 变量可以指向函数,指向后变量名就覆盖了函数名,就可以用变量名来调用函数。如:
print("abs:",abs) #abs: <built-in function abs>
a=abs
print("a:",a) #a: <built-in function abs>
print(a(-5)) #5
def square(n):
return n*100
def add(x,y,f):
return f(x)+f(y)
print(add(-1,-99,abs))
print(add(-1,-2,square))
几个系统内置高阶函数
map
(1)格式:map(f,lnterator) map(f,[1,2,3,4,5,6,])。map函数有两个参数,一个是函数,一个是lterator(迭代器)。
(2)函数功能:让lnterator中的每一个元素作为f函数的参数传入,并将处理后的结果作为新的lterator返回。
(3)lterator是惰性序列,需要用list()函数让它把整个list计算出来并返回一个list。
def f(x):
return x*100
t=map(f,[1,2,3,4,5,6])
print(list(t))
k=map(f,(1,2,3,4,5,6))
print(list(k))
reduce
(1)格式:reduce(f,order) reduce(xc,[1,6,7,20])有两个参数,一个是函数,一个是序列
exa01:将数字字符串转换为数
....
exa02:将str转换为int
......
filter
返回值是一个Interator,惰性序列——>需要list()方法转换
sorted 排序,返回值是排序好的一组新序列。
格式:sorted(一组序列,key=....,reverse=....) key关键字、reverse反转逆序为可选项。
t=sorted( [12,6,444,0,5,3])
print(t) #[0, 3, 5, 6, 12, 444]
k=sorted( (-12,6,-444,0,5,-3) ,key=abs)
print(k) #[0, -3, 5, 6, -12, -444]
(2)函数作为返回值的函数,这种函数的结构是函数内部又定义一个函数。外部函数的返回值是内部函数名。为什么要这样做?想保留对传入数据的算法,但不想在现在得到运算后的结果。在想得到运算结果的时候,通过调用接受返回值的变量,来得到。
例:
def lazy_sum(*args): #args:局部变量
def sum():
ax=0
for n in args: #内部函数可以访问外部函数的局部变量
ax=ax+n
return ax
return sum
s1=lazy_sum(2,2) #s1只是保留了求和的“运算方法”,~=一条指令,这条指令在需要时调用。
print(s1()) #调用保留了运算方法的‘指令’
s2=lazy_sum(1,1)
print(s2())
print("s1==s2",s1==s2) #每次调用的函数不一样
闭包函数
在一个函数内部定义一个函数,分别称为外部函数、内部函数。内部函数只能在外部函数内部使用,无法在外部函数外部使用。如:
1 def fun1():
2 print("fun1 is using")
3 def onfun1():
4 print("onfun1 is using")
5 onfun1()
6
7 fun1()
8 #onfun1() 输出错误
9
10 #输出
11 fun1 is using
12 onfun1 is using
内部函数可以使用外部变量,该类变量称为“自由变量”。使用自由变量的内部函数就称为闭包函数。
1 def count():
2 m=0
3 def counter():
4 nonlocal m #内部函数使用外部参数的声明
5 m+=1
6 return m
7 return counter
8
9 c=count() #c=count函数+外部环境信息[全局变量(对co unter而言)m]
10
11 print(c())
12 print(c())
13 print(c())
14 print(c())
匿名函数,指在需要提供函数名的地方,用 “ lambda 传入的参数 :对参数的运算 ”代替函数名。
|“对函数的运算”只能是一个表达式,相当于一般函数中的return语句。|
例:①map(lambda i : i*i,[1,3,5,7])代替了map(fun,[1,3,5,7])
②匿名函数作为返回值
1 def SquareSum():
2 return lambda x,y : x*x+y*y
3
4 t=SquareSum()
5 print(t(2,6))