函数是包含有输入、处理、输出三大部分的可复用结构,在一般的计算机语言中通过变量和运算符构建起最为灵活的算法表达(接近于数学逻辑),而经过计算机语言的发展和实际需要出现了对可复用结构的封装,这便是算法思想的抽象化。函数式编程就是把函数当成变量一样当成构建逻辑表达的一个元素,可以进行参数传递以及返回。(如之前文章中Python中的高阶函数,其便是接收函数充当参数并在函数内部进行操作)python不仅提供变量的算法设计也可以用函数充当其元素,是一种非纯的函数式编程语言(Lisp是典型的函数式编程语言)
1.函数作为实参输入
在之前的文章Python中的高阶函数中介绍了map、reduce、filter、sorted函数,其便是在调用函数时将函数作为实参传入调用函数。
传入函数常常是一次性调用的函数,并不需要复用因此常常用匿名函数来构建,匿名函数也称为lambda,构造形式为lambda 参数:操作
返回函数句柄
print(list(filter(lambda x:x % 2 == 1,[1,2,3,4,5,6,7,8])))
>[1, 3, 5, 7]
2. 函数作为返回值返回
函数可以充当返回值返回,返回函数并没有执行而是被具体创建,利用变量储存该返回函数句柄,利用变量()
的方式便可以执行返回函数。
以下例子中涉及到闭包的概念,闭包是指能够读取其他函数内部变量的函数,而由于编程语言变量作用域的限制,一般来说只有函数内部的子函数才能调用函数内部的变量,因此python中的闭包是指定义在一个函数内部的子函数。
def adding(*args):
def execution():
sum = 0
for i in args:
sum += i
return sum
return execution
sumA = adding(1,2,3,4)
print(sumA())
`注意返回函数并没有被即刻执行,而是在后期被调用时执行,所以在返回函数内部要避免调用了随调用次数可变的变量,否则在执行时都会调用最后的变量来进行计算。
def count():
fs = []
for i in range(1, 4):
def f():
return i*i
fs.append(f)
return fs
f1, f2, f3 = count()
由于子函数并没有即刻执行内部的操作,而是在调用时才执行,此时的i已经变成了3,故返回的都是9
3.偏函数
偏函数是指对某个函数的部分参数的值进行限定,产生一个类似设定了固定参数值的新函数,python中的functools模块中的partial函数提供了该功能。
import functools
pow2 = functools.partial(pow,exp=2)
print(pow2(3))
网友评论