闭包结构的本质

闭包定义:

如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包;

闭包的概念:闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,闭包是由函数和与其相关的引用环境组合而成的实体。

采用比较说法就是,通常一个函数运行结束之后,内部变量就会被销毁释放,C就是这样;然而在闭包这种结构中,外部函数的局部变量在该函数运行之后,其内部变量值在竟然在其返回的内部函数中得到了保持,这是比较本质的内容!!

函数可以嵌套定义,即在一个函数内部可以定义另一个函数,有了嵌套函数这种结构,便会产生闭包问题。

这会产生一些好的操作!

偏函数,装饰器 是否采用了闭包机制 延迟了一个函数部分执行?

常用高阶函数接收函数作为参数,很有可能返回一个闭包。

Short answer: closure is the mechanism, while functools.partial and decorators are typical uses of that mechanism.

The key difference between a closure and more typical namespaces is that the names and values in the "closed-over" namespace don‘t vanish when control flow leaves the top-level function. They‘re preserved in a mini-namespace associated with one instance of the inner function, and which survives as long as that instance does.

functools.partial uses that ability to "remember" some arguments to a pre-existing function. Decorators also typically use that ability for the same reasons.

Note that a decorator is more flexible than that. Any callable that takes one parameter and returns something can serve as a decorator. It doesn‘t have to make use of Python closures, or even return a function. Many decorators return a callable object instead. (As an aside, a closure and inner function can be simulated using an object for the namespace and a method for the inner function.)

Whatever the decorator returns is assigned to the name the decorated function would have had. (Decorators with parentheses after them, like @decorator(‘args‘) ... are slightly more complicated.) The typical decorator syntax:

@decorator

def function():

pass

...is just a shorthand for "define, then decorate and reassign":

def function():

pass

function = decorator(function)

For an extreme (and mostly useless) example:

def decorator5(__):

return 5

@decorator5

def square(x):

return x * x

print(square) # Prints 5 --- the function is gone.

square(10) # TypeError: ‘int‘ object is not callable

原文地址:https://www.cnblogs.com/wdmx/p/9955700.html

时间: 2024-10-12 09:40:22

闭包结构的本质的相关文章

Swift(下) 函数 闭包 结构体

// 定义函数时 需要加一个 func关键字 sayHello 为函数名 括号里的为参数(参数名: 参数类型) -> 指的是返回值  {}大括号里面的表示函数体 func sayHello(name:String, number:Int)->String { return name } sayHello("dt", 99) // 我们可以给函数参数加一个标签 (外部参数) 用于提示我们需要输入一个什么样的参数 或者说是干什么用的 func sayGoodBye(peronN

浅析闭包和内存泄露的问题

JavaScript使用一种称为垃圾收集的技术来管理分配给它的内存.这与C这样的底层语言不同,C要求使用多少借多少,用完再释放回去.其他语言,比如 Objective-C,实现了一个引用计数系统来辅助完成这些工作,我们能够了解到有多少个程序块使用了一个特定的内存段,因而可以在不需要时清除这些内存段. JavaScript是一种高级语言,它一般是通过后台来维护这种计数系统. 当JavaScript代码生成一个新的内存驻留项时(比如一个对象或函数),系统就会为这个项留出一块内存空间.因为这个对象可能

PHP中的闭包小谈

接触PHP一段时间以来,我一直以为这是一种基于函数式编程的语言是没有闭包这种东西的,但事实上却颠覆了我的想法,PHP竟然有闭包,下面我们一起来接触一下PHP的所谓的闭包. 根据PHP官网的定义来看,闭包(closure)又可以叫做匿名函数(Anonymous function),其实我们知道在JS中,闭包和匿名函数有着一定的区别,但是在PHP中却等同了,那么这肯定有一些区别的,那么我们和JS当中的闭包对比的来看看. 1.语句结构 在JS中,闭包和普通的函数定义没有什么区别,但是在PHP中,由于存

PHP中的闭包

在PHP中,由于存在函数内部不能访问全局作用的,所以就需要一种可以引入上一级作用域的语法结构,这种就是 闭包. 语法   function () use () {} 例子: <?php $a = 1; $closure = function () use ($a) { echo $a; }; $closure(); ?> 输出为:1 这次就实现了闭包的功能了,可以和上级作用域产生了联系. 2.变量执行的时候是运行时赋值还是函数声明的时候赋的值? 学过JS的到这里一定认为这个$a变量当变化的时候

javascript之闭包理解以及应用场景

之前读了js权威指南,也写了篇博文,但是实话实说当初看闭包确实还是一头雾水.现在时隔一个多月(当然这一段时间还是一直有在看闭包的相关知识)理解就更深入了一点,下面说说我的理解. 1 function fn(){ 2 var a = 0; 3 return function (){ 4 return ++a; 5 } 6 } 如上所示,上面第一个return返回的就是一个闭包,那么本质上说闭包就是一个函数.那么返回这个函数有什么用呢? 那是因为这个函数可以调用到它外部的a这个变量.其实也就是说,r

探秘堆结构

一.概述 此处所说的堆为数据结构中的堆,而非内存分区中的堆.堆通常可以被看做是树结构,满足两个性质:1)堆中任意节点的值总是不大于(不小于)其子节点的值:2)堆是一棵完全树.正是由于这样的性质,堆又被称为优先队列.根据性质一,将任意节点不大于其子节点的堆称为最小堆或最小优先队列,反之称为最大堆或最大优先队列.优先队列在操作系统作业调度的设计中有着举足轻重的作用.之前写了一篇优先队列的文章,详见算法导论第六章优先队列. 常见的堆结构,有二叉堆.左倾堆.斜堆.二项堆.斐波那契堆等.斐波那契堆在前文算

Swift函数和闭包

函数 Swift 使用func关键字声明函数: 1 func greet (name: String, day: String) -> String { 2 return "Hello \(name), today is \(day)." 3 } 4 greet ("Bob", "Tuesday") 通过元组(Tuple)返回多个值: 1 func getGasPrices () -> (Double, Double, Double)

Swift学习2---函数和闭包

函数 Swift使用func关键字声明函数: func greet(name: String, day: String) -> String { return "Hello \(name), today is \(day)." } greet("Bob", "Tuesday") 通过元组(Tuple)返回多个值: func getGasPrices() -> (Double, Double, Double) { return (3.5

通用列表数据转化为树形结构

近期做项目用的是JQuery  easyUI 控件, 尽管非常强大,可是高级控件对于数据的格式要求比較严格遇到 例如以下问题 1.使用comboTree 控件   绑定树形的组织结构   可是 数据库查到的数据格式是 列表形式,并不符合  combotree的数据结构 以下是我的数据和  combotree 数据个对照 通用的数据结构   命名A "[{"UnitID":"7cf57594a7074c46b94dcd6c985b0ced","Un