引用和函数引用,函数嵌套、闭包,装饰器以及递归
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!