PYTHON从入门到精通.docx
《PYTHON从入门到精通.docx》由会员分享,可在线阅读,更多相关《PYTHON从入门到精通.docx(231页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、目录Python解释器5第一个 Python 程序6使用文本编辑器7输入和输出9Python基石出11数据类型和变量12字符串和编码18使用 list 和 tuple24条件判断和循环29使用 diet 和 set33函数38调用函数39定义函数41函数的参数44递归函数52高级特性55切片55迭代58列表生成式60生成器63函数式编程68高阶函数69匿名函数74装饰器75偏函数79模块81使用模块82安装第三方模块86使用_future_89面向对象编程91类和实例92访问限制96继承和多态99获取对象信息103面向对象高级编程110使用 _slots_112使用 property113多重
2、继承115定制类120使用元类129非数学公式,Python把它视为字符串,请自行解释上述打印结果。输入现在,你已经可以用print输出你想要的结果了。但是,如果要让用户从电脑输入一些字符 怎么办? Python提供了一个raw_input,可以让用户输入字符串,并存放到一个变量里。比 如输入用户的名字: name = raw_input()Michael当你输入name二rawjnput。并按下回车后,Python交互式命令行就在等待你的输入了。这 时,你可以输入任意字符,然后按回车后完成输入。输入完成后,不会有任何提示,Python交互式命令行又回到”状态了。那我们刚才输入的 内容到哪去了
3、?答案是存放到name变量里了。可以直接输入name查看变量内容: nameMichael什么是变量?请回忆初中数学所学的代数基础知识:设正方形的边长为a,则正方形的面积为ax a。把边长a看做一个变量,我们就可以根据a 的值计算正方形的面积,比如:若a=2,则面积为axa = 2x2 = 4;若a=3.5,贝IJ面积为axa = 3.5x3.5 = 1225。在计算机程序中,变量不仅可以为整数或浮点数,还可以是字符串,因此,name作为一个 变量就是一个字符串。要打印出name变量的内容,除了直接写name然后按回车外,还可以用print语句: print nameMichael有了输入和输
4、出,我们就可以把上次打印hello, world的程序改成有点意义的程序了:name = raw_input()print hello/, name运行上面的程序,第一行代码会让用户输入任意字符作为自己的名字,然后存入name变量 中;第二行代码会根据用户的名字向用户说hello,比如输入Michael:C:Workspace python hello.pyMichaelhello, Michael但是程序运行的时候,没有任何提示信息告诉用户:“嘿,赶紧输入你的名字,这样显得很Animal is running.Animal is running.当然,也可以对子类增加一些方法,比如Dog类:
5、class Dog(Animal):def run(self):print Dog is running.,def eat(self):print Eating meat .,继承的第二个好处需要我们对代码做一点改进。你看到了,无论是Dog还是Cat,它们run() 的时候,显示的都是Animal is running.,符合逻辑的做法是分别显示Dog is running. 和Cat is running.,因此,对Dog和Cat类改进如下:class Dog(Animal):def run(self):print Dog is running.class Cat(Animal):def r
6、un(self):print Cat is running.再次运行,结果如下:Dog is running.Cat is running.当子类和父类都存在相同的run。方法时,我们说,子类的run()覆盖了父类的run(),在代 码运行的时候,总是会调用子类的run()。这样,我们就获得了继承的另一个好处:多态。要理解什么是多态,我们首先要对数据类型再作一点说明。当我们定义一个class的时候, 我们实际上就定义了一种数据类型。我们定义的数据类型和Python自带的数据类型,比如 str、list、diet没什么两样:a = list() # a 是 list 类型b = Animal()
7、 # b 是 Animal 类型c = Dog() # c 是 Dog 类型判断一个变量是否是某个类型可以用isinstance()判断: isinstance(a, list)True isinstance(b Animal)True isinstance(c? Dog)True看来a、b、c确实对应着list、AnimaK Dog这3种类型。但是等等,试试: isinstance(cJ Animal)True看来c不仅仅是Dog, c还是Animal!不过仔细想想,这是有道理的,因为Dog是从Animal继承下来的,当我们创建了一个Dog 的实例c时,我们认为c的数据类型是Dog没错,但c
8、同时也是Animal也没错,Dog本来 就是Animal的一种!所以,在继承关系中,如果一个实例的数据类型是某个子类,那它的数据类型也可以被看做 是父类。但是,反过来就不行: b = Animal() isinstance(bJ Dog)FalseDog可以看成Animal,但Animal不可以看成Dog。要理解多态的好处,我们还需要再编写一个函数,这个函数接受一个Animal类型的变量:def run_twice(animal):animal.run()animal.run()当我们传入Animal的实例时,run_twice()就打印出: run_twice(Animal()Animal
9、is running.Animal is running.当我们传入Dog的实例时,run_twice()就打印出: run_twice(Dog()Dog is running.Dog is running.当我们传入Cat的实例时,run_twice()就打印出: run_twice(Cat()Cat is running.Cat is running.看上去没啥意思,但是仔细想想,现在,如果我们再定义一个Tortoise类型,也从Animal 派生:class Tortoise(Animal):def run(self):print Tortoise is running slowly.1
10、当我们调用run_twice()时,传入Tortoise的实例: run_twice(Tortoise()Tortoise is running slowly.Tortoise is running slowly.你会发现,新增一个Animal的子类,不必对run_twice()做任何修改,实际上,任何依赖 Animal作为参数的函数或者方法都可以不加修改地正常运行,原因就在于多态。多态的好处就是,当我们需要传入Dog、Cat、Tortoise时,我们只需要接收Animal类型就可以了,因为Dog、Cat Tortoise都是Animal类型,然后,按照Animal类型进行操作即可。由于Ani
11、mal类型有run()方法,因此,传入的任意类型,只要是Animal类 或者子类,就会自动调用实际类型的run()方法,这就是多态的意思: 对于一个变量,我们只需要知道它是Animal类型,无需确切地知道它的子类型,就可以放 心地调用run()方法,而具体调用的run()方法是作用在Animal、Dog、Cat还是Tortoise 对象上,由运行时该对象的确切类型决定,这就是多态真正的威力:调用方只管调用,不管 细节,而当我们新增一种Animal的子类时,只要确保un()方法编写正确,不用管原来的 代码是如何调用的。这就是著名的“开闭”原则:对扩展开放:允许新增Animal子类; 对修改封闭:
12、不需要修改依赖Animal类型的run_twice()等函数。继承还可以一级一级地继承下来,就好比从爷爷到爸爸、再到儿子这样的关系。而任何类, 最终都可以追溯到根类object,这些继承关系看上去就像一颗倒着的树。比如如下的继承树:继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有 的方法,也可以把父类不适合的方法覆盖重写; 有了继承,才能有多态。在调用类实例方法的时候,尽量把变量视作父类类型,这样,所有 子类类型都可以正常被接收; 旧的方式定义Python类允许不从object类继承,但这种编程方式已经严重不推荐使用。任 何时候,如果没有合适的类可以继承,就继承
13、自。bject类。获取对象信息259次阅读当我们拿到一个对象的引用时,如何知道这个对象是什么类型、有哪些方法呢?使用type()首先,我们来判断对象类型,使用type。函数:基本类型都可以用type。判断: type(123) type(str*) type(None)如果一个变量指向函数或者类,也可以用type。判断: type(abs) type(a)但是type()函数返回的是什么类型呢?它返回type类型。如果我们要在if语句中判断,就 需要比较两个变量的type类型是否相同: type(123)=type(456)True type(abc)=type(123)True type(a
14、bc)=type(123)False但是这种写法太麻烦,Python把每种type类型都定义好了常量,放在types模块里,使用 之前,需要先导入: import types type(abc)=types.StringTypeTrue type(uabc)=types.UnicodeTypeTrue type()=types.ListTypeTrue type(str)=types.TypeTypeTrue最后注意到有一种类型就叫TypeType,所有类型本身的类型就是TypeType,比如: type(int)=type(str)=types.TypeTypeTrue使用 isinstan
15、ce()对于class的继承关系来说,使用type。就很不方便。我们要判断class的类型,可以使用 isinstance()函数。我们回顾上次的例子,如果继承关系是:object - Animal - Dog - Husky那么,isinstance。就可以告诉我们,一个对象是否是某种类型。先创建3种类型的对象: a = Animal() d = Dog() h = Husky()然后,判断: isinstance(hJ Husky)True没有问题,因为h变量指向的就是Husky对象。再判断: isinstance(hJ Dog)Trueh虽然自身是Husky类型,但由于Husky是从Do
16、g继承下来的,所以,h也还是Dog类型。 换句话说,isinstance()判断的是一个对象是否是该类型本身,或者位于该类型的父继承链 上。因此,我们可以确信,h还是Animal类型: isinstance(hJ Animal)True同理,实际类型是Dog的d也是Animal类型: isinstance(d? Dog) and isinstance(dJ Animal)True但是,d不是Husky类型: isinstance(d? Husky)False能用type。判断的基本类型也可以用isinstance。判断: isinstance(a, str)True isinstance(ua
17、unicode)True isinstance(a1, unicode)False并且还可以判断一个变量是否是某些类型中的一种,比如下面的代码就可以判断是否是str或者 unicode: isinstance(a , (str, unicode)True isinstance(u a (str, unicode)True由于str和unicode都是从basestring继承下来的,所以,还可以把上面的代码简化为: isinstance(uabasestring)True使用dir()如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list, 比如,获得一个s
18、tr对象的所有属性和方法: dir(1 ABC) add class contains delattr doc eq form at_ge_getattribute_getitem_getnewargs_getslice_ ,- hash init le len It mod mu 1 ne new reduce reduce ex repr rmod ,rmul setattr sizeof str subclasshook : formatter fi eld_name_split, _formatter_parser, capitalize, centercount, decodeen
19、codeendswith, expandtabsfind, format1index, isalnumisalpha , i sdigit1, ,islower, isspace, istitle, isupper, join, ,ljust, 1 lower, Istr ip, partition replace rfincT, rindexrjustpartition, split rs trip, split1, plitlines, 1startswith, strip, ,swapcase, title, translate upper1, zfill类似_xxx_的属性和方法在Py
20、thon中都是有特殊用途的,比如_len_方法返回长度。在 Python中,如果你调用len()函数试图获取一个对象的长度,实际上,在len()函数内部, 它自动去调用该对象的_len_()方法,所以,下面的代码是等价的: lenCABC)我们自己写的类,如果也想用len(myObj)的话,就自己写一个_len_()方法: class MyObject(object): def _len_(self):return 100 obj = MyObject() len(obj)100剩下的都是普通属性或方法,比如lower。返回小写的字符串: ABC.lower()abc仅仅把属性和方法列出来是不
21、够的,配合getattr()、setattr()以及hasattr。,我们可以 直接操作一个对象的状态: class MyObject(object): def _init_(self): ,self.x = 9def power(self): return self.x * self.x obj = MyObject()紧接着,可以测试该对象的属性: hasattr(obj x) # 有属性x吗?True obj.x 9 hasattr(obj, y) False setattr(obj, y, hasattr(obj, y) True#有属性吗?19) #设置一个属性y#有属性y吗? ge
22、tattr(obj, y) # 获取属性,y19 obj .y #获取属性,y19如果试图获取不存在的属性,会抛出AttributeError的错误: getattr(obj, z) # 获取属性,z1Traceback (most recent call last):File ”, line 1, in AttributeError: MyObject object has no attribute z可以传入一个default参数,如果属性不存在,就返回默认值: getattr(obj, z, 404) #获取属性z如果不存在,返回默认值404 404也可以获得对象的方法: hasattr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PYTHON 入门 精通
限制150内