一range与xrange的比较在Python中range和xrange均可以用来做迭代的范围不过range返回的是list而xrange则返回一个xrangeobject如下typerange10typexrange10xrange比range效率更高因为range返回的是一个list对象然后再对list对象进行遍历而xrange返回的是xrange对象每次迭代才返回本次迭代的结果比如forxinrange10000willgeneratealistoftenthousandelementsandwillthenloopthrougheachoftheminturnforxinxrange10000willgenaratetenthousandintegersonebyonepassingeachtothevariablexinturn二内置函数ord与chr可以实现一个字符与ascii之间的转换比如orda97chr97a例如将英文字母放入列表中listforiinxrangeordaordz11listextendchri注意chr与str的区别例如以下代码chr97astr9797将一个字符串转换为对应的ascii码值map比如mapordabcde979899100101反过来比如mapchrrange97101abcd在将列表中的字符连接起来joinmapchrrange97101abcd三os模块1getcwd返回一个表示当前工作目录的字符串比如osgetcwdFfilmstypeosgetcwd2listdir返回一个参数所指定目录的所有文件名字符串的列表比如typeoslistdirosgetcwdoslistdirosgetcwdmetadataprojectpydevprojectsrc四内置数据类型1list注意使用extend添加元素时注意参数时list比如listlistextendasdasdsalistasdasdsalistextendadasdsadalistasdasdsaadasdsadalistextend213121TracebackmostrecentcalllastFileline1inTypeErrorintobjectisnotiterablelistextend12121listasdasdsaadasdsada12121在python中字符串就是一个序列看成一个列表类型五模块python的模块4545最高级的程序组织单位1模块中的语句比如print语句2模块的属性内置属性每个模块中都有内置模块比如dirbuiltinsdocnamepackage自定义属性就是在模块中定义的属性比如count0striloveyoudirbuiltinsdocnamepackagecountstr3模块中的函数内置函数可以在模块中直接调用一些常用内置函数比如range与xrange以下常用内置函数helpobj在线帮助obj可是任何类型callableobj查看一个obj是不是可以像函数一样调用reprobj得到obj的表示字符串可以利用这个字符串eval重建该对象的一个拷贝evalrstr表示合法的python表达式返回这个表达式dirobj查看obj的namespace中可见的namehasattrobjname查看一个obj的namespace中是否有namegetattrobjname得到一个obj的namespace中的一个namesetattrobjnamevalue为一个obj的namespace中的一个name指向vale这个objectdelattrobjname从obj的namespace中删除一个namevarsobj返回一个object的namespace用dictionary表示locals返回一个局部namespace用dictionary表示globals返回一个全局namespace用dictionary表示typeobj查看一个obj的类型isinstanceobjcls查看obj是不是cls的instanceissubclasssubclssupcls查看subcls是不是supcls的子类类型转换函数chri把一个ASCII数值变成字符ordi把一个字符或者unicode字符变成ASCII数值octx把整数x变成八进制表示的字符串hexx把整数x变成十六进制表示的字符串strobj得到obj的字符串描述listseq把一个sequence转换成一个listtupleseq把一个sequence转换成一个tupledictdictlist转换成一个dictionaryintx转换成一个integerlongx转换成一个longintergerfloatx转换成一个浮点数complexx转换成复数max求最大值min求最小值自定义函数自己定义的函数使用关键字def定义的不需要定义返回类型Python能返回任何类型比如deffuncprinthelloworldfunchelloworldlambda函数格式如下lambdaarg1arg2表达式比如glambdaxyxyprintg1212144printgat0x00DEE930表示lambda语句构建的其实是一个函数对象比如以下的一些应用foo1245678910printfilterlambdaxx20foo246810printmaplambdaxx10foo111214151617181920printreducelambdaxyxyfoo52generator函数该函数的定义域普通函数的定义没有什么区别只是在函数体内使用yield生成数据项即可与yield关键字的使用defgeneforiinrange10yieldi使用了yield关键字printgene表示是generator函数对象使用for循环对generator进行遍历如下foriingeneprinti0123456789使用generator函数对象中next方法遍历如下generatorgeneprintgeneratornext0printgeneratornext1printgeneratornext2printgeneratornextprintgeneratornextTracebackmostrecentcalllastFileline1inStopIterationYield与return的区别如下代码deffuncforiinrange5returniprintfunc0而yielddeffuncforiinrange5returniprintfunc0yield关键字包含yield语句的函数会被特地编译成生成器当函数被调用时他们返回一个生成器对象这个对象支持迭代器接口函数也许会有个return语句但它的作用是用来yield产生值的六python中的变量和常量常量Python中不像java使用关键字staticfinal来声明一个常量python中没有提供关键字可以自己定义个常量类来存放常量局部变量通常是在函数或者类的方法中直接使用在该函数或者类方法之外不能引用该变量全局变量在程序文件中任何地方都可以引用包括函数和类的内部但是如果在函数和类中对全局变量赋值必须在该函数或者类中声明该变量为全局变量否则经过赋值操作后变量为本地变量重点如果在函数或类中对全局变量进行了赋值则该全局变量就变成了局部变量无论是在引用该变量之前还是在引用该变量之后如果在函数或类中未对全局变量进行赋值操作那么对于该函数来说此变量是一个全局变量所以这时有一个问题怎样才能在函数或类中对全局变量进行重新赋值呢这时就要使用到global关键字global的作用是声明为全局变量那么无论是否对其进行了赋值操作该变量都将作为全局变量在函数或类中使用global声明的变量就为全局变量比如deffuncglobalaaaaaaaa12321312321printaaaafunc12321312321printaaaa12321312321七python中的面向对象1self关键字类中的方法必须有一个self参数2属性和方法访问权限python中的私有属性和私有方法不像java中的私有属性使用private修饰符而是在属性或方法的名字前面使用两个下划线表示私有性比如pricegrow分别表示的是私有属性和私有方法类的外部不能访问私有属性怎样访问类中的私有属性格式Instanceclassnameattribute比如appleFruitcolor通常不采用以上做法来访问私有属性而是与java一样通过setter与getter实现属法类属性可以被类访问也可以被实例对象访问但是实例属性只能被实例访问与java不同的是java中使用static关键字修饰类属性而python中不使用任何修饰符只要声明一下就可以但是实例属性要使用self关键字作为前缀的实例属性以self作为前缀的属性类属性直接声明的变量python中类属性都能被类和对象访问类的内置属性用于管理内的内部关系比如dictbasedoc方法类中的方法至少要有一个参数调用时不必给该参数赋值该参数就是self相当于java中的this关键字Self用于区分函数和类的方法注意函数要与方法区分开来静态方法Python使用函数staticmethod或staticmethod把普通的函数转换为静态方法比如staticmethoddefgetPriceprintFruitpricedefgetPriceFruitpriceFruitprice10printFruitpricecountstaticmethodgetPrice注意python的静态方法没有和类的实例进行名称绑定python的静态方法相当于全局函数类方法Python使用函数classmethod或classmethod把方法转换为静态方法这时的方法必须要有参数比如classmethoddefgetPriceselfprintFruitpricedefgetPriceselfFruitpriceFruitprice10printFruitpricecountclassmethodgetPrice3类中的构造函数init4析构函数del显示释放对象占用的资源是一种释放资源的方法默认自动执行如果程序中不提供析构函数会在后台提供默认的析构函数5垃圾回收机制Python使用gc模块6类的内置方法initself初始化对象在创建新对象时调用new在init之前被调用用于生产实例对象getitemselfkey把类中的属性定义为序列str使用print语句时被调用打印对象的信息类似于java中object中的toString方法该方法中必须使用return语句7方法的动态特性将一个已经定义好的函数添加到类中还可以对已经定义好的方法进行修改语法如下ClassnamemethodnamefunctionnameClassname类名Methodname新的方法名Functionname已经定义好的函数添加与修改的语法一样只是methodname表示的含义不一样添加表示新的名称修改表示已存在的方法名修改的时候原来的类中方法的名字不变只是将方法中的内容改变比如classFruit4passdefaddselfprintgrowifnamemainFruit4growaddfruit4Fruit4fruit4grow8继承在类名后使用一对括号表示继承关系如果在父类中定义了init方法子类在自己的init方法中必须显示调用父类中的init方法如果子类要扩展父类中的行为可以添加init方法的参数比如classAppleFruitdefinitselfcolorFruitinitself调用父类中的init方法类似于java中的super关键字在java中首先实例化父类再实例化子类这就是为什么要在子类的init中显示调用父类的init了在java中使用super关键字来调用父类中的构造方法在子类的无参构造方法中通常都隐藏了super那么在python中还可以使用super类的super调用父类的init方法在使用super时父类要继承object因为super类的实现代码继承了object所以父类必须继承objectSuper的语法supertypeobjtype某个类obj通常是type类的实例化对象通常使用self关键字表示例子classFruitobjectdefinitselfargsprintparentsargsclassAppleFruitdefinitselfargssuperAppleselfinitargsprintchildifnamemainApple如果在子类中没写init方法时当子类在实例化时会调用父类中的init方法所以在使用时就应该在子类中写上init方法在python中是支持多继承的语法classnameparentclass1parentclass2在多重继承中子类只会调用第一个被继承的类的init即parentclass1类中的init方法比如以下代码classFruitobjectdefinitselfprintinitializeFruitdefgrowselfprintgrowclassVegetableobjectdefinitselfprintinitializeVegetabledefplantselfprintplantclassWatermelonFruitVegetablepassifnamemainwWatermelonwgrowwplant9抽象类抽象类有抽象方法组成Java中抽象类不可以实例化通过子类实例化Python也是在java中可以使用abstract修饰符来声明抽象类而python中只能用一个普通类来表示怎样来声明一个抽象类呢可以通过python的NotImplementedError类来模拟抽象类NotImplementError类继承自Python运行时错误类RuntimeError在python中实现抽象类是这样的如果对该类进行实例化时就抛出异常比如代码抽象类classFruitdefinitselfifselfclassisFruit如果实例化的类是Fruit则抛出异常tryabstractexceptprint抽象类不能实例化returnclassAppleFruitdefinitselfFruitinitself调用父类的initprintappleifnamemainappleApplefFruit10多态性通过子类为父类实例化向上转型这时的对象只能调用父类中的属性和方法在python中有这样一个方法判断某个实例是不是属于某个类该方法是isinstanceobjectclassortypeortuple如下代码classFruitdefinitselfcolorNoneselfcolorcolorclassAppleFruitdefinitselfcolorredFruitinitselfcolorclassBananaFruitdefinitselfcoloryellowFruitinitselfcolorclassFruitShopdefsellFruitselffruitifisinstancefruitApple判断参数fruit的类型printsellappleifisinstancefruitBananaprintsellbananaifisinstancefruitFruitprintsellFruitifnamemainshopFruitShopappleAppleredbananaBananayellowshopsellFruitappleshopsellFruitbanana11运算符的重载八异常tryexceptfinally使用raise抛出异常使用raise语句后后面的语句将不能执行九File