我们都知道程序的编写基本方法是IPO。由几个函数构成。函数的编写方法也是IPO。
I:input 输入
P:process 处理
O:output 输出
比如说一个求和函数,输入几个元素,经过函数处理运算,输出这几个元素的和。
一个复杂的程序经过拆分变成几个模块,这些模块再由几个函数来完成。像这样的分解写法是我们必须要掌握的。
python是一种面向对象的语言
在 Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量、可以作为元素添加到集合对象中、可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性就是第一类对象所特有的。
返回函数
高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。
现在实现一个可变参数的求和。
注意「*a」这个参数的意思是可变参数,就是不知道参数有几个,例如上面的例子,参数是四个。
但是如果我们不立即求和,而是在后面的代码中需要的时候在求和怎么办?
也就是说不返回求和的结果,而是返回求和的函数:
当我们调用lazy_sum()时,返回的并不是求和的结果,而是一个求和函数sum()
.sum at 0x0382BC48>
调用函数 f() 时,才返回求和结果
在这个例子里,我们在函数lazy_num中又定义了函数sum,并且内部函数sum可以引用外部函数的参数和局部变量,当lazy_num返回函数sum,相关参数和局部变量都保存在返回函数中,这种称为「闭包」(closure)的程序结构具有极大的威力,很牛逼就是了
还要注意一点,当我们调用lazy_num()函数时,每次调用都会返回一个新的函数,即使传入相同的参数:
f1()和f2()的调用结果不受影响
闭包
注意到返回函数在内部引用了局部变量a,所以,当一个函数返回了一个函数后,其内部的局部变量还可以被新函数引用,所以闭包用起来简单,可实现起来并不简单
另一个要注意的问题是,返回的函数并没有立刻执行,而是直到调用的时候才执行
总结
一个函数可以返回一个计算结果,也可以返回一个函数。
返回一个函数时,牢记该函数并未执行,返回函数中不要引用任何可能会变化的变量。
领取专属 10元无门槛券
私享最新 技术干货