当前位置: 首页 > news >正文

Python入门学习(九)Python的高级语法与用法(二)闭包

闭包:特定环境下的函数,即函数+环境变量

#闭包:特定环境下的函数,即函数+环境变量
#对于下面的函数中定义的curve()函数,其中a的取值是由其外部函数curve_pre提供的
def curve_pre():a = 5def curve(x):return a*x*xreturn curvea = 10     #不影响curve()的运算,取的a是curve_pre中定义的a
f = curve_pre()    #把返回值赋值给f,返回值是函数名
#闭包的环境变量是保存在__closure__中的
print(f.__closure__)
print(f.__closure__[0].cell_contents)print(f(10))

 

#此不算闭包,因其内部f2不依赖外部环境,使用的a为f2内部定义
def f1():a = 10def f2():a = 20print(a)print(a)f2()print(a)return f2f = f1()
print(f.__closure__)   #输出为None,不存在外部环境,不属于闭包#下例f3中的f4使用了其外部f3定义的m,即其外部环境变量,则属于闭包
def f3():m = 12def f4(b):x = m + bprint(x)return f4f = f3()
print(f(5))
print(f.__closure__)

 

 

"""
计算一个旅行者旅游路径的长度
x=0 代表起点
行走3步即result = 0+3= 3
再行走5步即result = 0+3 +5= 8
再走10步后result = 0+3+5 + 10= 18
"""
#如果不用闭包方式实现
origin = 0
def go(step):global originnew_pos = origin + steporigin = new_posreturn new_posprint(origin)
print(go(3))
print(origin)
print(go(5))
print(origin)
print(go(10))

 

"""
计算一个旅行者旅游路径的长度
x=0 代表起点
行走3步即result = 0+3= 3
再行走5步即result = 0+3 +5= 8
再走10步后result = 0+3+5 + 10= 18
"""#用闭包方式实现
origin = 0def factory(pos):def go(step):nonlocal posnew_pos = pos +steppos = new_posreturn new_posreturn gotourist = factory(origin)
print(tourist(3))  #第一次调用使用非全局变量pos即factory实参即origin,为0
print(tourist(5))   #第二次调用使用非全局变量pos时已被第一次调用修改更新
print(tourist(10))
#并不影响全局变量origin的值
#同时每次调用又可以获取更新值,即pos
print(origin)

 

http://www.sczhlp.com/news/9829/

相关文章:

  • 工程师团队如何打造4K流媒体设备的创新技术
  • 【题解】P4063 [JXOI2017] 数列
  • mount: /mnt/hgfs/vm_share: unknown filesystem type vmhgfs - hbg
  • 8月11日总结
  • OpenCV-鱼眼相机图像处理
  • 新高一暑假二期集训 Week 1
  • ZR 25 summer D6T1 题解 | 思维、数学(计算几何)
  • 线程安全的集合类 ConcurrentQueue、ConcurrentStack、BlockingCollection、ConcurrentBag、ConcurrentDictionary
  • 【自学嵌入式:stm32单片机】对射式红外传感器记次
  • Rime-weasel 中州韻輸入法-小狼毫 输入法候选框不显示拼音的解决办法
  • 从美世《中国员工敬业度员工体验白皮书》看AI如何改善员工体验
  • 线程安全的集合类 ConcurrentQueue、BlockingCollection、ConcurrentBag
  • 通达信指标泰乐1号战法指标分享(无偿分享全套指标)
  • 差分约束
  • 从管理工具到组织进化:Tita 与飞书如何激活企业人才引擎
  • CMake的简单示例
  • 《乐毅报燕王书》
  • 浅谈C++ const
  • NextJS 02 - 服务端渲染
  • Supervisor安装与使用
  • 深入解析:【JavaEE】多线程之Thread类(下)
  • proxmox云镜像安装过程
  • 为什么Moka能留住核心人才?智能继任计划+离职风险预测
  • 文件访问被拒绝。
  • ArcgisPro ArcPy (还未)实现缩放至图层
  • Linux环境 RocketMQ 5.X 三主三从集群部署
  • 从嘉手札2025-8-11
  • android开发将项目升级到target35的解决方法
  • 常见光照范围
  • 无监督训练在NLP中的价值体现