函数引用传递,闭包的使用及特点和思路过程
大家好,今天来和大家主要讲讲闭包的使用。
先和大家讲一下基础知识,这样方便看懂接下来的代码。
函数引用传递
def test1():
print("--- in test1 func----")
# 调用函数
test1()
# 引用函数
ret = test1
print(id(ret))
print(id(test1))
#通过引用调用函数
ret()
运行结果为:
--- in test1 func----
140212571149040
140212571149040
--- in test1 func----
由上述代码可以知道,函数名只是函数代码空间的一个引用,当函数名赋值给另一个对象的时候,就是引用传递。
闭包
# 外层函数
def func_out(funcout):
print("---调用外层函数---")
# 内层函数,在函数内部再定义一个函数,而且内部函数还用到了外部函数的变量,那么将这个函数以及用到的一些外部变量称之为闭包
def func_in(funcin):
print("---调用内层函数---")
return funcout * funcin
# 返回func_in() 也就是返回闭包结果
return func_in
# 给func_out()函数中的 funcout 赋值 10
func_out = func_out(10)
# 注意,这里的20,其实是给 func_in()函数的 funcin 赋值
print(func_out(20))
运行结果为:
---调用外层函数---
---调用内层函数---
200
闭包的执行过程:
闭包的特点:
1.嵌套函数
2.外层函数的返回值是内层函数的函数名
3.外层函数要有参数能够被内层函数使用
闭包的优缺点:
优点:节省电脑的资源,提高代码的复用率
缺点:由于闭包引用了外部函数的参数,所以导致外部函数的参数没有及时释放,导致消耗内存。
总结:
函数名只是函数代码的引用,当函数名赋值给一个变量的时候,其实就是引用传递。
闭包就是一个嵌套的函数,在外层函数运行的时候,内层函数才开始被定义,然后将内层函数的引用,传递给函数外的对象
内部函数和使用的外部函数提供的变量构成的整体称为闭包。