Python函数⼏种调⽤⽅式总结Python函数⼏种调⽤⽅式总结
函数的嵌套调⽤
嵌套函数简单的理解可以看作是在函数的内部再定义函数,实现函数的“私有”。
特点:
1. 函数内部可以再次定义函数。
2. 只有被调⽤时才会执⾏(外部函数被调⽤后,被嵌套函数调⽤才有效)。
函数的递归调⽤
在函数内部,可以调⽤其他函数。如果⼀个函数在内部调⽤⾃⾝本⾝,这个函数就是递归函数。
特点:
1. 必须要有明确的终⽌条件
2. 每进⼊更深⼀层递归时,问题规模相⽐上次都应有所减少
3. 递归效率不⾼,层次过多会导致栈溢出
案例解析
def recur_fibo(n):
"""递归函数
输出斐波那契数列"""
if n <=1:
return n
else:
return(recur_fibo(n-1)+ recur_fibo(n-2))
def fib(n):
a, b =1,1
for i in range(n-1):
a, b = b, a+b
return a
闭包原理
在⼀些语⾔中,在函数中可以(嵌套)定义另⼀个函数时,如果内部的函数引⽤了外部的函数的变量,则可能产⽣闭包。闭包可以⽤来在⼀个函数与⼀组“私有”变量之间创建关联关系。在给定函数被多次调⽤的过程中,这些私有变量能够保持其持久性。
简⽽⾔之, 闭包的特点就是内部函数引⽤了外部函数中的变量。
在Python中,⽀持将函数当做对象使⽤,也就是可以将⼀个函数当做普通变量⼀样⽤作另⼀个函数的参数和返回值。拥有此类特性的语⾔,⼀般都⽀持闭包。
闭包中被内部函数引⽤的变量,不会因为外部函数结束⽽被释放掉,⽽是⼀直存在内存中,知道内部函数被调⽤结束。
也可以说是外部函数通过return将内部函数抛出
闭包的三个条件:
1. 在外部函数中定义内部函数
2. 外部函数有返回值
3. 返回值就是内部函数名
4. 内部函数引⽤外部函数的变量
应⽤
def func(a, b):
c =10
def inner_func():
s = a + b + c
print("相加后的结果", s)
return inner_func # 不能加括号,加括号表⽰调⽤
#其实ifunc是间接调⽤了inner_func,虽然不能直接调⽤
ifunc=func(6,9)
ifunc1=func(2,8)
ifunc2=func(1,9)
print(ifunc)
print(ifunc1)
print(ifunc2)
ifunc2()
ifunc1()
ifunc()
由上述实验可以看出,每次调⽤内部函数结束后,内存都不会释放,调⽤⼏次就会开辟⼏个内存空间,ifunc函数的地址都不⼀样就已经很好的说明了,⽽函数的返回结果则都是根据⾃⼰的内存空间中记录的数据⽽计算出来的
闭包的缺点
1. 作⽤域没有那么直观 闭包的缺点
2. 因为变量不会被垃圾回收所以有⼀定的内存 占⽤问题。
闭包作⽤:
1. 可以使⽤同级的作⽤域 闭包作⽤:
2. 读取其他元素的内部变量 闭包作⽤:
3. 延长作⽤域
闭包总结
1. 闭包似优化J变量,原来需要类对象完成的⼯作,闭包也可以完成
2. 由于闭包引⽤J外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存
3. 闭包的好处,使代码变得简洁,便于阅读代码。
4. 闭包是理解装饰器的基础
装饰器
python装饰器(fuctional decorators)就是⽤于拓展原来函数功能的⼀种函数,⽬的是在不改变原函数名(或类名)的情况下,给函数增加新的功能。
这个函数的特殊之处在于它的返回值也是⼀个函数,这个函数是内嵌“原“”函数的函数。
def decorate(func):
a =100
print('wrapper外层打印测试')
def wrapper(*args,**kwargs):
func(*args,**kwargs)
print('--------->刷漆')
print('--------->铺地板', a)
print('------->装门')
print('wrapper加载完成..')
return wrapper
#定义⼀个函数
@decorate
def func():
print("我是⽑坯房")
print(func)
func()
1. @decorate代码会加载执⾏decorate函数,所以会先输出 'wrapper外层打印测试’
2. decorate装饰器将func当做参数传⼊函数体中 ,定义内部函数,并返回内部函数的地址,这样,func函数就替换成wrapper函数,也就是上图
的第三⾏,实现了添加功能的⽬的
3. 调⽤func函数时,实际上调⽤的是wrapper函数,所以先输出‘我是⽑坯房’,⽽‘刷漆’是最后输出的
当被装饰的函数带有参数时
#定义⼀个装饰器
def decorate(func):
a =100
print('wrapper外层打印测试')
def wrapper(*args,**kwargs):
func(*args,**kwargs)
print('--------->刷漆')
print('--------->铺地板', a)
print('------->装门')
print('wrapper加载完成..')
return wrapper
@decorate
def func(n, m):
print("我是⽑坯房,需要{}⼈,{}砖".format(n, m))
print(func)
func(5,10)
1. *args,**kwargs,代表可以接受所有类型的参数
给⽬标函数添加多个功能
def zhuang1(func):
print('------>1 start')
def wrapper(*argx,**kwargs):
func()
print('刷漆')
print('------->1 end')
return wrapper
def zhuang2(func):
print('------>2 start')
def wrapper(*argx,**kwargs):
func()
print('铺地板,装门.....')
print('------->2end')
return wrapper
@zhuang2
@zhuang1
def func():
print("我是⽑坯房")
func()
1. 那个装饰器离函数最近,就优先执⾏那个装饰器
2. 多个装饰器使⽤,函数都会保留每次装饰后的状态,所以刷漆和铺地板都会输出装饰器需要传递参数
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论