20 闭包、nonlocal
闭包的概念
闭包就是能够读取其他函数内部变量的函数。
从模块级别调用函数内部的局部变量。
闭包 = 函数+环境变量(函数外部的变量)
闭包存在的条件
- 闭包必须返回一个函数
- 被返回的函数必须调用环境变量(上一层方法中的局部变量)
python里一切皆对象,你甚至可以返回一个函数,把函数赋值给一个变量等。。。
来看看这个闭包
例子:
def curve_pre():
a = 25 # 此为环境变量,它在被返回的函数的外面
def cureve(x):
return a*x
return cureve
f = curve_pre() # 此时调用curve_pre返回的是一个闭包(函数+环境变量)
print(f(2))
结果:
50
闭包的相关方法
__closure__闭包方法:返回当前对象的函数的闭包对象:
print(curve_pre().__closure__)或print(f.__closure__)
结果:
(<cell at 0x0000000000A73078: int object at 0x000000005273D1F0>,)
打印闭包中的环境变量(外层函数的局部变量):
print(f.__closure__[0].cell_contents)
结果:
25
只有内部函数才能调用此方法,外层函数调用会报错
闭包的意义
闭包保存的是一个函数现场,它返回的不止是函数,还返回了该函数使用需要的环境变量。
使用闭包可以尽可能少的不适用全局变量,使得功能的独立性得到保证。
闭包中的nonlocal关键字
nonlocal关键字声明的变量,它的值为环境变量的值(上一层函数的同名局部变量),但它并不是环境变量。
改变它也不会改变环境变量。
但它也区别于局部变量:它拥有记忆功能,它的值不会自动清零。
20 闭包、nonlocal的更多相关文章
- Javascript设计模式之匿名函数与闭包
匿名函数 (function () { var foo = 10; var bar = 2; console.log(foo*bar); })(); // 20 带参数的匿名函数 (function ...
- python中对变量的作用域LEGB、闭包、装饰器基本理解
一.作用域 在Python程序中创建.改变.查找变量名时,都是在一个保存变量名的空间中进行,我们称之为命名空间,也被称之为作用域.python的作用域是静态的,在源代码中变量名被赋值的位置决定了该变量 ...
- Javascript 闭包(Closures)
本文内容 闭包 闭包和引用 参考资料 闭包是 JavaScript 的重要特性,非常强大,可用于执行复杂的计算,可并不容易理解,尤其是对之前从事面向对象编程的人来说,对 JavaScript 认识和编 ...
- javascript中的闭包closure详解
目录 简介 函数中的函数 Closure闭包 使用闭包实现private方法 闭包的Scope Chain 闭包常见的问题 闭包性能的问题 总结 简介 闭包closure是javascript中一个非 ...
- python函数名称
一.第一类对象, 函数名的使用 函数名就是变量名, 函数名存储的是函数的内存地址 变量的命名规范: 由数字, 字母, 下划线组成 不能是数字开头, 更不能是纯数字 不能用关键字 不要太长 要有意义 不 ...
- 巨蟒python全栈开发-第10天 函数进阶
一.今日主要内容总览(重点) 1.动态传参(重点) *,** *: 形参:聚合 位置参数*=>元组 关键字**=>字典 实参:打散 列表,字符串,元组=>* 字典=>** 形参 ...
- Python 函数定义和使用
# 函数的概念 # 概念 # 写了一段代码实现了某个小功能; 然后把这些代码集中到一块, 起一个名字; 下一次就可以根据这个名字再次使用这个代码块, 这就是函数 # 作用 # 方便代码的重用 # 分解 ...
- 前端知识杂烩(Javascript篇)
1. JavaScript是一门什么样的语言,它有什么特点?2.JavaScript的数据类型都有什么?3.请描述一下 cookies,sessionStorage 和 localStorage 的区 ...
- python面试大全
问题一:以下的代码的输出将是什么? 说出你的答案并解释. class Parent(object): x = 1 class Child1(Parent): pass class Child2(Par ...
随机推荐
- 用sublime3编写运行16位汇编程序_详细教程
最近需要学8086汇编,课堂教学竟然是PPT看代码,然而不运行程序是没法学编程的.网上的教程有很多坑点,摸索出了正确的步骤. 1.安装sublime3.安装MASM32.64位系统安装DOSBOX(因 ...
- 第十一周助教工作总结——NWNU李泓毅
助教博客链接:https://www.cnblogs.com/NWNU-LHY/ 本次作业的要求:原型设计:https://www.cnblogs.com/nwnu-daizh/p/10761596. ...
- arcpy显示指定表的索引属性
import arcpy feature_class = "c:/data/well.shp" # Create a list of indexes using the ListI ...
- VS2017打包注册IE插件及修改IE安全选项设置【转】
前言 最近项目需要在浏览器环境下读取员工身份证信息,要实现网页与硬件设备通信,考虑了几种实现方式: 1.借助ActiveX插件,通过程序库直接与设备通信. 优点:厂家提供了IE插件,开发简单 缺点:只 ...
- Java项目登录报Session Error
在web.xml文件添加下面红色代码即可,注意:添加代码后,格式化一下代码. <servlet> <servlet-name>dwr-invoker</se ...
- JVM 修改类加载器启动类加载器
1.类加载器加载路径 public class MyTest18 { public static void main(String[] args) { //系统类加载器加载路径 System.out. ...
- Java TreeSet,Collections使用
一.创建TreeSet实例 public static void main(String[] args) { TreeSet set = new TreeSet(); set.add("C& ...
- CMU Advanced DB System - Query Optimizer
Overview Optimizer模块所处在的位置如图, 那么做optimize的目的是, 找出所有‘correct’执行计划中‘cost’最低的 那么这里首先要明确的概念,‘correct’,关系 ...
- Tosca:键盘输入字符串
这是方法之一
- Andorid SQLite数据库开发基础教程(2)
Andorid SQLite数据库开发基础教程(2) 数据库生成方式 数据库的生成有两种方式,一种是使用数据库管理工具生成的数据库,我们将此类数据库称为预设数据库,另一种是使用代码生成的数据库.