引用和函数引用,函数嵌套闭包,装饰器以及递归
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了引用和函数引用,函数嵌套闭包,装饰器以及递归相关的知识,希望对你有一定的参考价值。
1.引用:其实就是地址引用
可以使用id()函数来查看变量的地址
a = 10
print(id(a))结果为1534531351
getrefcount()函数查看引用次数
print(getrefcount(a))#结果为2次,第一次是创建赋值,第二次是调用getrefcount()函数
2.函数引用
1)不可变类型引用
def test_1(n1):
for i in range(n1):
print(i)
n1 += 1
test(5)结果为1 2 3 4 5#外面的n不会因为函数里面的改变而改变
2)可变类型
def test_1(l):
for i in range(l):
print(i)
l.append(0,8)
list = [1,2,3]
test(list)结果为8 1 2 3
3.函数嵌套
1)函数嵌套就是一个函数里面嵌套另外一个函数
def outer():
a = 10
def inner():
b = 20
print(我是内部函数,b)
inner()
outer()#结果为我是内部函数 20
2)在内部函数里面引用外部函数参数
def outer():
a = 10
def inner():
b = 20
b += a
print(我是内部函数,b)
inner()
outer()#结果为我是内部函数 30
3)在内部函数修改外部函数的值
def outer():
a = 10
def inner():
nonlocals a #通过声明nonlocals关键字来修饰
b = 20
a += b
print(我是内部函数,a)
inner()
outer()#结果为我是内部函数 30
4.闭包
要求:
1)函数嵌套
2)内部函数引用外部函数变量
3)返回内部函数
def outer(n):
a = 10
def inner():#函数嵌套
a += n#内部函数引用外部函数变量
print(我是内部函数,a)
return inner#返回内部函数
r = outer(5)
r()#相当于传递了参数给函数内部之后的inner
5.装饰器,循环开放封闭原则,也就是在不改变原来函数代码情况下,扩大函数功能
1)不带参数的装饰器
def decorator(func):#传入需要扩展功能的函数形参
def wrapper():
func()
print(粉刷)
print(铺地板)
print(精修)
return wrapper()
@decorator#装饰要装饰的函数
def house():#house就是wrapper
print(草胚房...)
2)带参数的装饰器
def decorator(func):#传入需要扩展功能的函数形参
def wrapper(addres):#传入普通参数
func(address)#这里也需要传入,这里就是实际的house
print(粉刷)
print(铺地板)
print(精修)
return wrapper()
@decorator#装饰要装饰的函数
def house(address):#house就是wrapper
print(的草胚房....format(address))
house(北京三环)#结果为北京三环的草胚房
3)多个参数的装饰器
def decorator(func):#传入需要扩展功能的函数形参
def wrapper(*args,**kwargs):#传入普通参数
func(*args,**kwargs)#这里也需要传入,这里就是实际的house
print(粉刷)
print(铺地板)
print(精修)
return wrapper()
@decorator#装饰要装饰的函数
def house(address,name,area =40 ):#house就是wrapper
print(的酒店,面积是平方米.format(address,name,area )
house(湖北,希岸area = 20)#关键字参数
#结果为湖北的希岸酒店,面积是20平方米
4)返回值的装饰器
当被装饰函数中有返回值的时候,wrapper中也应该有返回值
def decorator(func):
def wrapper(*args,**kwargs):
r = func(*args,**kwargs)
print(房子预估价格为.format(r))
print(粉刷)
print(贴地板)
print(精修)
return 60000
return wrapper
@decorator
def house():
return 50000
结果为房子预估价格为50000
粉刷
贴地板
精修
60000
6.递归函数
1)要有个出口
2)每次递归需要向出口更进一步
3)打印1-10
def test_1(i):
if i == 10:
print(i)
else:
print(i)
i += 1
test(i)
test(10)结果为1 2 3 4 5 6 7 8 9 10
4)打印1-5累加
def test_1(n):
if n == 10:
return 10
else:
return n +test(n+1)
test(5)结果为15
5)打印1-5阶乘
def test_1(n):
if n == 10:
return 10
else:
return n *test(n+1)
test(5)结果为120
以上是关于引用和函数引用,函数嵌套闭包,装饰器以及递归的主要内容,如果未能解决你的问题,请参考以下文章