在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包。闭包可以用来在一个函数与一组“私有”变量之间创建关联关系。在给定函数被多次调用的过程中,这些私有变量能够保持其持久性。—— 维基百科

就是当内部的函数被当成对象返回时,夹带了外部变量,就形成了一个闭包。闭包将捕捉内部函数执行所需的整个环境。看例子:

# coding=utf-8def make_printer(msg=None):def printer():print(msg)return printerob_printer=make_printer("Hello World!")
ob_printer()
print("闭包函数,夹带外部变量:")
print(ob_printer.__globals__)
print(ob_printer.__closure__)
print(ob_printer.__closure__[0].cell_contents)def make_printer1():def printer():print()return printer
ob_printer=make_printer1()
print("普通函数,不夹带外部变量:")
print(ob_printer.__globals__)
print(ob_printer.__closure__)
print(ob_printer.__closure__[0].cell_contents)'''
Hello World!
闭包函数,夹带外部变量:
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000000000049C2E8>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:\\Users\\li\\workspace\\temp\\e\\ttt\\try7.py', '__cached__': None, 'make_printer': <function make_printer at 0x00000000003B4E18>, 'ob_printer': <function make_printer.<locals>.printer at 0x0000000001E8F268>}
(<cell at 0x0000000000120C48: str object at 0x0000000001E8CCB0>,)
Hello World!
普通函数,不夹带外部变量:
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000000000049C2E8>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:\\Users\\li\\workspace\\temp\\e\\ttt\\try7.py', '__cached__': None, 'make_printer': <function make_printer at 0x00000000003B4E18>, 'ob_printer': <function make_printer1.<locals>.printer at 0x00000000023808C8>, 'make_printer1': <function make_printer1 at 0x0000000002380840>}
None
'''

如果需要在一系列函数调用中保持某个状态,使用闭包是一种非常高效的方式,例如,考虑下面运行了一个简单计数器的代码:

# coding=utf-8def countdown(n):def next():nonlocal nr=nn-=1return rreturn nextdef main_():fo_countdown_next=countdown(10);while True: v=fo_countdown_next();print(v);if not v:breakmain_()
'''
10
9
8
7
6
5
4
3
2
1
0
'''

Python将函数作为闭包相关推荐

  1. python高级函数,将函数作为变量、返回函数

    python中使用函数作为参数 在python中,我们可以用一个变量来存放函数.示例: a = len length = a([1,2,3,4,5]) print(length) 在上面我将len() ...

  2. 零基础入门学习Python(19)-内嵌函数和闭包

    global关键字 全局变量的作用域是整个模块,也就是代码段内所有的函数内部都可以访问到全局变量 注意,在函数内部仅仅去访问全局变量就好,不要试图去修改它,如果随意修改全局变量的值,很容易牵一发而动全 ...

  3. python命名空间和闭包_Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】...

    本文实例讲述了Python函数基础用法.分享给大家供大家参考,具体如下: 一.什么是命名关键字参数? 格式: 在*后面参数都是命名关键字参数. 特点: 1.约束函数的调用者必须按照Kye=value的 ...

  4. python值函数名的使用以及闭包,迭代器详解

    一.函数名的运用 函数名就是一个变量名,但它是一个特殊的变量名,是一个后面加括号可以执行函数的变量名. def func():print("我是一个小小的函数") a = func ...

  5. python学习-高阶函数(函数传参、返回函数(闭包)、匿名函数lambda)

    文章目录 高阶函数 函数传参 返回函数(闭包) 匿名函数lambda 高阶函数 定义: 至少满足下列一个条件: 接受一个或多个函数作为输入 输出一个函数 python里的高阶函数有 filter.ma ...

  6. python高阶函数闭包装饰器_5.初识python装饰器 高阶函数+闭包+函数嵌套=装饰器...

    一.什么是装饰器? 实际上装饰器就是个函数,这个函数可以为其他函数提供附加的功能. 装饰器在给其他函数添加功能时,不会修改原函数的源代码,不会修改原函数的调用方式. 高阶函数+函数嵌套+闭包 = 装饰 ...

  7. python闭包详解函数_详解python函数的闭包问题(内部函数与外部函数详述)

    python函数的闭包问题(内嵌函数) >>> def func1(): ... print ('func1 running...') ... def func2(): ... pr ...

  8. 初学者python笔记(装饰器、高阶函数、闭包)

    一个函数被定义完成后,甚至程序发布后,后期可能需要添加某些功能,但是我们不可能每次都去修改原函数的代码,这时候装饰器就可以上场了,本篇文章将会用一个个可实现的代码,由浅入深.循序渐进得阐述装饰器的强大 ...

  9. python装饰器与闭包_Python:函数装饰器和闭包

    摘自<流畅的python> 7.1 装饰器基础知识 装饰器是可调用的对象,其参数是另一个函数(被装饰的函数). 装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用 ...

最新文章

  1. Yeslab安全实验室CCNP Security PPT到货
  2. Response.Redirect、 Server.Transfer、Server.Execute三者区别
  3. 【Python金融量化 6- 100 】、六、蒙特卡洛预测微软股票
  4. 【H2 Database】shell
  5. 【Transformer】ACMix:On the Integration of Self-Attention and Convolution
  6. tensorflow实现反卷积
  7. EntityFramework进阶——数据变更冲突
  8. 在Linux集群上部署Spark之前准备
  9. 中国医院评审/评级标准及区别和特点
  10. 关于Sentinel-2快速查询图幅号——使用MGRS_100kmSQ_ID_File_Geodatabase快速查询
  11. miui11稳定版获取完整root_怎么获取root权限-MIUI11系统开启系统ROOT权限图文教程-支持小米红米全部机型...
  12. ttl转rs232发送十六进制_TTL和RS232之间的详细对比
  13. Excel:数据分列功能分割文本
  14. 在EXCEL表格中如何进行快速换行
  15. Win10 python双版本共存配置问题 Configuration file could not be loaded.
  16. poj 3687(拓扑排序)
  17. BIM在工程中的20种典型功能
  18. java多元_Java多元运算符-WEB资讯专栏-DMOZ中文网站分类目录-免费收录各类优秀网站的中文网站目录....
  19. MUR160RLG说明
  20. Hibernate②一(多)对多的映射配置与级联操作

热门文章

  1. 容器编排技术 -- Kubernetes kubectl create service 命令详解
  2. NodeJS使用淘宝 NPM 镜像/NPM使用国内源
  3. 全面、详细的前端组件库
  4. vue数组对象双向绑定
  5. 【服务端渲染】NuxtJs 综合案例
  6. 【Vue.js源码解析 三】-- 模板编译和组件化
  7. C#LeetCode刷题之#598-范围求和 II​​​​​​​(Range Addition II)
  8. linux安装包管理(未完待续)
  9. 使用React,TypeScript和Socket.io构建聊天应用
  10. 使用Sci-kit学习和XGBoost进行多类别分类:使用Brainwave数据的案例研究