引用和函数引用,函数嵌套、闭包,装饰器以及递归
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