1、Python入门导学
Python的特性、优点、缺点、前景以及python能做些什么?
2、Python环境安装
一键安装Python的编译环境,写出第一段Python代码
3、理解什么是写代码与Python的基本类型
Python的基本类型,包括整形、浮点型;10、8、2、16进制数的意义和转换关系;布尔类型;字符串与字符串常见运算 *** 作
4、Python中表示“组”的概念与定义
了解“组”的概念,以及在Python中用来表示“组”的一些类型,包括:元组、列表、集合和字典。
5、变量与运算符
了解变量的意义与七种运算符,并对每一种运算符的扩展做出详细的讲解
6、分支、循环、条件与枚举
代码的基本逻辑结构,包括条件控制(ifelse)、循环控制(forin、while)、表达式与运算符的优先级。此外,还有Python的枚举类型以及Python编码的规范。
7、包、模块、函数与变量作用域
了解Python代码的组织结构核心:包、模块与函数。需要对Python代码的组织结构有一个非常清晰的认识。重点是函数,除了了解函数的基本概念外,还需要了解Python灵活的函数参数机制(默认参数、关键字参数与列表参数)。
8、Python函数
函数是所有语言中都具备的基本代码组织结构。函数的重要性不言而喻。而对于Python来说,函数的用法及其灵活,远比其他语言要强大很多。了解Python函数的定义、调用、序列解包、必须参数、关键字参数、默认参数等诸多内容。
9、高级部分:面向对象
了解面向对象的概念。包括面向对象的三大特性(继承、封装、多态)、类的基本构成元素、python的内置类属性、方法重写、运算符重载、静态方法等
10、正则表达式与JSON
正则表达式也是文本解析中非常重要的知识点。了解如何在Python中编写正则表达式与常见的正则表达式。此外,重点了解包括JSON对象,JSON字符串,Python类型与JSON的转换。
11、Python的高级语法与用法
了解Python进阶部分的高级特性,如枚举、闭包
12、函数式编程:匿名函数、高阶函数、装饰器
进一步了解函数式编程的lambda、mapece、filter以及装饰器
13、实战:原生爬虫
学习如何访问网络数据、获取与解析网络数据、爬虫的基本原理解释。并用最基础语法不使用爬虫框架的原生爬虫项目。
14、Pythonic与Python杂记
了解扩展Python的优秀写法,学会如何写出优质的Pythonic风格的代码。包括:如何让字典保持有序、lmbda表达式的应用等高级Python知识
可以使用闭包的方法:functionaa(){vara='hello';returnfunction(){returna;}}然后在外面接收:varfn=aa();//返回一个匿名函数vara=fn();//获取到匿名函数中的返回值根据作用域链的原理内部的函数可以访问到外部函数的变量,然后将获取的变量返回即可。
1闭包与变量
JavaScript中的作用域链的机制引出了一个副作用,即闭包只能取得包含函数中任何变量的最后一个值。闭包所保存的是整个变量对象,而不是某个特殊的值。
function createFunctions(){
var result=new Array();
for (var i=0;i<10;i++){
result[i]=function(){
return i;
};
}
return result;
}
var funcs = createFunctions();
for (var i=0; i < funcslength; i++){
documentwrite(funcs[i]() + "<br />");
}
createFunction()函数返回一个数组。表面上看,似乎每个函数都应该返回自己的索引值,但事实并非如此,事实上每个函数的返回值都是10因为每个函数的作用域链中都包含着createFunctions()函数的活动对象,所以它们引用的都是同一个变量i。当createFunctions()函数返回后,变量i的值就是10,此时每个函数都引用着保存变量i的同一个变量对象,所以每个函数返回后都是10
当然我们可以使用匿名函数强制使闭包的行为符合预期。
function createFunctions(){
var result=new Array();
for (var i=0;i<10;i++){
result[i]=function(num){
return function(){
return num;
};
}(i);
}
return result;
}
var funcs = createFunctions();
for (var i=0; i < funcslength; i++){
documentwrite(funcs[i]() + "<br />");
}
在重写了前面的createFunctions()函数后,每个函数就好返回各自不同的索引值了。在这里,我们没有直接把闭包赋值给数值,而是定义了一个匿名函数,并将立即执行该函数的结果赋值给数组。这里的匿名函数有一个参数num,也就是最终的函数要返回的值。在调用每个匿名函数时,我们传入了变量i。由于函数参数按值传递的,所以就会将变量i的当前值复制给参数num。而在这个匿名函数内部,有创建并返回了一个访问num的闭包。这样依赖,result数组中的每个函数都有自己num变量的一个副本,因此就可以返回各自不同的数值了。
12关于this对象
在闭包中使用this对象会出现一些问题,this对象是运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被当作某个对象的方法调用时,this等于那个对象。不过,匿名函数的执行环境具有全局性,因此其this对象通常指向window(当然,在通过call()和apply()改变函数执行环境时,this指向其他对象)。
var name="The Window";
var object={
name:"My object",
getNameFunc:function(){
return function(){
return thisname;
};
}
};
alert(objectgetNameFunc()()); //"The Window"(在非严格模式下)
以上代码创建了一个全局变量name,有创建了一个包含那么属性的对象,这个对象还包括一个方法——getNameFunc(),它返回一个匿名函数,而匿名函数又返回thisname由于getNameFunc()返会一个函数。因此调用objectgetNameFunc()()就会立即返回调用它的函数,结果就返回一个字符串。然而,这个例子返回的字符串是“The Window”,即全局name变量的值。
但是,为什么匿名函数没有取得其包含作用域(或外部作用域)的this对象呢?
每个函数在调用时,其活动对象都会自动获取两个特殊的变量:this和arguments。内部函数在搜索这两个变量时,只会搜到其活动对象为止,因此永远不肯能访问到外部函数中的这两个变量。不过,把外部作用域中的this对象保存在一个闭包能够访问的变量里,就可以放闭包访问该对象了。
var name="The Window";
var object={
name:"My object",
getNameFunc:function(){
var that=this;
return function(){
return thatname;
};
}
};
alert(objectgetNameFunc()()); //"My object"
以上代码中,我们在定义匿名函数之前,把this对象赋值给了that变量,而在定义闭包之后,闭包也可以访问这个变量,因为它们是我们在外部函数中特意声明的一个变量。即使在函数返回之后,this也仍然引用的object,所以调用objectgetName()()就返回“My object”
13内存泄漏
由于IE9之前的版本对JS对象和COM对象使用不同的垃圾回收历程,因此闭包在IE中会导致一些特殊的问题。具体来说,如果闭包的作用域链中保存着一个HTML元素,那么就意味着该元素将无法被销毁。
function assignHandler(){
var element=documentgetElementById("someElement");
elementonclick=function(){
alert(elementid);
};
}
以上代码创建了一个作为element元素事件处理程序的闭包,而这个闭包则有创建了一个循环引用。由于匿名函数保存了对assignHandler()的活动对象的引用,因此就会导致无法减少element的引用数,也就无法回收该对象。
不过可以通过一下代码来解决。
function assignHandler(){
var element=documentgetElementById("someElement");
var id=elementid;
elementonclick=function(){
alert(id);
};
element=null;
}
闭包是:指有有访问另一个函数作用域中的变量的函数。
创建闭包的常用方式:在一个函数内部创建一个函数。例子:
functioncreateFunction(name){return function(obj1, obj2){
var value1 = obj1[name];
var value2 = obj2[name];
return value1 + ", " +value2;
}
}
了解创建作用域以及作用域有什么作用的细节,对彻底理解闭包到头重要。当某个函数被调用时,会创建一个执行环境及相应的作用域链。然后,使用arguments和其他参数的值来初始化函数的活动对象。
一、闭包
1、createFunction()创建时,它(compare)的作用域包含createFunction()函数的活动对象和全局对象。
//创建函数var compare = createFunction("name");
consolelog(typeofcompare); //function
2、匿名函数被执行时,创建自己的活动对象和可以访问createFunction()的执行环境。
//调用函数var result =compare({name: "jjaiy"}, {name:"ascy"}); //jjaiyy, ascy
3、createFunction()函数执行完后,其执行环境的作用域不会被销毁。原因在于它的活动对象还在内存中,直到匿名函数被销毁。
//解除对匿名函数的引用(以便释放内存)compare = null;
原因在于:
浏览器的垃圾收集方式有:
标记清除(主要针对变量)
引用计数(跟踪记录每个值被引用的次数)
二、实例运行
封装功能
var route = {routes: {},
for: function(path, handler){ //闭包
thisroutes[path] = handler; //引用回调函数
}
};
//执行二个匿名函数
routefor("/start",function(request, response){
responsewriteHead(200,{"Content-Type": "text/plain"});
responsewrite("Hello");
responseend();
});
routefor("/finish",function(request, response){
responsewriteHead(200,{"Content-Type": "text/plain"});
responsewrite("Goodbye");
responseend();
});
//先判断argument中的path变量是否一致,能否调用其函数中的回调函数。
if(typeof routeroutes["/finish"] === 'function'){
routeroutes["/finish"](request, response);
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)