引用和函数引用,函数嵌套闭包,装饰器以及递归

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

 

以上是关于引用和函数引用,函数嵌套闭包,装饰器以及递归的主要内容,如果未能解决你的问题,请参考以下文章

闭包函数装饰器以及语法糖

闭包函数和装饰器

闭包和装饰器

装饰器

闭包和装饰器

python中闭包和装饰器