闭包

闭包函数

为君一笑 提交于 2019-12-04 11:58:51
闭包函数 函数对象:可以将定义在函数内的函数返回到全局使用,从而打破函数的层级限制。 名称空间与作用域:作用域关系在函数定义阶段时就已经固定死了,与调用位置无关,即在任意位置调用函数都需要跑到定义函数时找到作用域关系。 def f1(): x = 1 def inner(): print(x) return inner func = f1() x = 2 def f2(): x = 3 func() f2() 1 一、什么是闭包? 闭包:闭是封闭(函数内部函数),包是包含(该内部函数对外部作用域而非全局作用域的变量的引用)。闭包指的是函数内部函数对外部作用域而非全局作用域的引用。 提示:之前我们都是通过参数将外部的值传给函数,闭包提供了另外一种思路,包起来喽,包起呦,包起来哇。 def outter(): x = 1 def inner(): print(x) return inner f = outter() def f2(): x = 2 f() f2() 1 1.1 两种为函数传参的方式 为函数传参的方式一:使用参数的形式 def func(x): print(x) func(1) func(1) func(1) 1 1 1 为函数传参的方式二:包给函数 def outter(x): x = 1 def inner(): print(x) return inner f =

python闭包

亡梦爱人 提交于 2019-12-04 11:08:30
'''闭包:闭包:1.闭 :内部的函数   2.包 :包含了对外部函数作用域中变量的引用 '''def func(): name = 'li' def inner(): return name print(inner.__closure__) return innerprint(func()())from urllib.request import urlopendef index(url): def inner(): return urlopen(url).read() return inneru='http://www.cnblogs.com/Eva-J/articles/7156261.html#_label1'get = index(u)print(get()) 来源: https://www.cnblogs.com/a19960101/p/11856701.html

python基础篇04 闭包、装饰器

帅比萌擦擦* 提交于 2019-12-04 08:25:46
D11 闭包、装饰器 1、闭包   参考 http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html 阮一峰网络日志   闭包概念:   闭包就是能够从外部读取目标函数内部变量的函数。在一些编程语言中,只有函数内部的子函数才能读取局部变量,   因此可以把闭包简单理解成"定义在一个函数(目标函数)内部的函数(闭包函数)"。   所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。   关于判断是否是闭包:   如果此函数拥有自由变量,那么就可以侧面证明其是否是闭包函数了。 def wrapper(): a = 1 def inner(): b = 2 print('使用函数内部变量a:',a) return inner ret = wrapper() ret() # 函数名.__code__.co_freevars 查看函数的自由变量 print(ret.__code__.co_freevars) # 函数名.__code__.co_varnames 查看函数的局部变量 print(ret.__code__.co_varnames) # 函数名.__closure__ 获取具体的自由变量对象,也就是cell对象。 print(ret.__closure__) # cell

python中的闭包

妖精的绣舞 提交于 2019-12-04 08:16:56
------------恢复内容开始------------ 什么是闭包? 简单说,闭包就是根据不同的配置信息得到不同的结果。 再来看看专业的解释:闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。 这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。 所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。 python实例 看概念总是让人摸不着头脑,看几个python小例子就会了。 例1 def make_adder(addend): def adder(augend): return augend + addend return adder p = make_adder(23) q = make_adder(44) print p(100) print q(100) 运行结果: 123 144 分析一下: 我们发现, make_adder 是一个函数,包括一个参数 addend ,比较特殊的地方是这个函数里面又定义了一个新函数,这个新函数里面的一个变量正好是外部 make_adder 的参数. 也就是说,外部传递过来的 addend 参数已经和 adder 函数绑定到一起了,形成了一个新函数, 我们可以把 addend 看做新函数的一个配置信息,配置信息不同,函数的功能就不一样了

闭包函数、装饰器以及语法糖

假装没事ソ 提交于 2019-12-04 07:03:58
闭包函数:        1.闭包函数必须在函数内部定义        2.闭包函数可以引用外层函数的名字     闭包函数是 函数嵌套、函数对象、名称空间与作用域 结合体。 # 直接传参 def func(x): print(x) func(1000) # 通过闭包函数传参 def outer(number): # number = 100 # inner就是闭包函数 def inner(): print(number) return inner func = outer(1000) # ---》 inner地址 ---》 func变量名 func() # func ---> inner地址() 闭包函数的应用 # 方式一: 直接传参 def spider_func(url): # 往url地址发送请求,获取响应数据 response = requests.get(url) # 必须接受url # 状态码: 200 if response.status_code == 200: # 获取当前url地址中所有的文本 print(len(response.text)) print(response.text) url = 'https://www.cnblogs.com/xiaoyuanqujing/' spider_func(url) ———————————————————————

Javascript闭包

China☆狼群 提交于 2019-12-04 06:57:01
     javascript的作用域分两种:全局和局部 ,基于我们所学的作用域及预编译相关知识,js作用域环境中访问变了的权利是由内到外的内部作用域可以获得父级作用域的变量和参数,反之则不能。也就是说外层作用域无法获取内层作用域下的变量和参数,同样在不同的函数作用域中也是不能相互访问到彼此的变量和参数的 那么想在函数内部想访问另一个函数内部的变量和参数就得用到闭包来解决这一需求。 闭包的本质就是在一个函数内部创建另一个函数!!! 在函数外面是无法读取到函数内的局部变量 函数内部声明变量时一定要加var,否则就声明了一个全局变量。 闭包有三个特性:           1.函数嵌套函数;         2.函数内部可以引用函数外部的参数和变量;         3.参数和变量不会被垃圾回收机制回收掉; 例子如下: 这段代码中fun函数嵌套了一个fun2函数,return fun2 这一步把内层函数fun2返回给fun 也就等于 fun = functon fun2(){a++;console.log(a);}  然后在又把fun赋值给了num  又执行了num() 此时执行的是fun2  函数fun2里并没有a这个变量 但是他的父级函数里有 所以他可以获取fun函数里的 变量a的值 num();  //112 一般情况下,函数fn执行完后

浅谈闭包

人盡茶涼 提交于 2019-12-04 06:49:09
浅谈闭包 首先闭包是处于函数以内,闭包可 以理解为在一个函数内部的函数,并且可以 访问外部函数,相当于函数内部和外部联系 的桥梁。 闭包是为了重复使用变量,但是又 不变量不被污染。闭包在正式的项目中还是 很常用的。闭包会在它父函数的外部,改变父 函数内部的值,所以在使用过程中不要随便 改变父函数内部变量的值;闭包的形成会占 用大量内存,而且使用不当会造成内存泄漏 。 在操作闭包的时候,要注意闭包的 封闭性。闭包可以实现公有化变量,就是可 以被多个函数调用,但是这种操作需要搭配 立即执行函数 的相关操作来使用,这样就能 达到想要的效果, 立即执行函数的特征就是 用完就销毁,()括号就是立即执行的意思 ,例:1.(function (){ console.log ('520'); })() 2.(function(){ console.log ('520'); }()); 立即执行函数还可以被var定义: var test = function(){ console.log ('520'); }(); (function(){ ... })() 内部定义的变量不会和外部的变量发生冲突。 这里要注意, 使用立即执行函数的时候要注 意两点一是函数体后面要有小括号(),二是 函数体必须是函数表达式而不能是函数声明 。 除了()可以立即执行外,+ - ! = 都可以 起到立即执行的左右

函数之闭包函数和装饰器

。_饼干妹妹 提交于 2019-12-04 06:48:06
闭包函数和装饰器 一、闭包函数 1.什么是闭包函数? 字面意思:闭:封闭,包:包裹;闭包函数就是函数嵌套,函数对象,名称空间与作用域的结合体 闭包函数必须在函数内部定义 闭包函数可以引用外层函数的名字 2.闭包函数怎么用 闭包函数是为了装饰器做准备 def outer(num2): num2 = 100 def inner(): # inner就是闭包函数 print(num2) # 如果局部找不到变量名,再从全局找 return inner # 返回inner​func = outer("num2") # 本质是将inner函数名(函数地址)赋值给funcfunc() # 调用inner函数 举例:# 直接传值​import requests​​# 调用爬虫包def spider_func(url): response = requests.get(url) # 接受网址的返回值 if response.status_code == 200: # 判断http的状态码是不是200 print(len(response.text)) # print(response.text)​​url = 'https://www.taobao.com/'spider_func(url)​# 通过闭包函数传值​import requests​​def spider_outer(url): def

闭包函数+装饰器

混江龙づ霸主 提交于 2019-12-04 06:47:00
目录 闭包函数 装饰器: 闭包函数 1.闭包函数必须在函数内部定义 2.闭包函数可以引用外层函数的名字 闭包函数是 函数嵌套、函数对象、名称空间与作用域 结合体。 直接调用 # def func(x): # print(x) # func(1010) 通过闭包函数传参 # def outer(number): # print(number) # def inner(): # print(number) # return inner # # func = outer(100) # func() 直接传入地址,爬取小哥哥的博客 # import requests # def spider_func(url): # response = requests.get(url) # if response.status_code == 200: # print(len(response.text)) # print(response.text) # url = 'https://www.cnblogs.com/zhulipeng-1998/' # spider_func(url) 通过闭包传入地址,爬取小哥哥博客 # import time # import requests # def spider_outer(url): # def spider_inner(): # start_time

闭包函数和装饰器

蹲街弑〆低调 提交于 2019-12-04 06:46:57
闭包函数和装饰器 一-什么是闭包函数? 闭:封闭 ​ 包:包裹 ​ 比如手机的举例 ​ 1.闭包函数必须在函数内部定义 ​ 2.闭包函数可以引用外层函数的名字 ​ -闭包函数是:函数的嵌套、函数的对象、名称空间和作用域 结合体。 ​ ****闭合函数是为了装饰器做准备 def func(y): x = 100 #inner 是一个闭包函数 def inner(): print(x) print(y) return inner inner = func(1) inner() >>>>>> 100 1 二、装饰器 ​ -什么是装饰器? ​ 装饰:装饰 ,修饰。 ​ 器:工具 ​ ********开放封闭***** 装饰器必须遵循“开放封闭“的原则 ​ -开放: ​ 对函数的功能添加是开放的; ​ -封闭: ​ 对函数的功能修改是封闭的。 ​ -装饰器的作用? ​ -在不修改被装饰对象的源代码和调用方式前提下,添加新的功能。 ​ ##装饰器的定义必须遵顼: ​ -不修改被装饰对象的源代码 ​ -不修改被装饰对象的调用方式 ​ -为什么要使用装饰器? ​ 可以解决代码冗余问题,提高代码的可扩展性 ​ -怎么使用装饰器? ​ -装饰器的应用: ​ -登录时间 ​ -登录认证 ​ -编写装饰器 ​ 通过闭包函数来实现装饰器 #爬虫的获取技术 import requests # 爬虫请求工具