21、比较
(1)list.sort()与全局sorted()
list.sort(key = None,reverse = False)是列表内置排序方法。但其返回值为None(x.sort()的结果、print(x.sort())、x = x.sort()后x的结果都是None),只有当文字说“执行语句x.sort(),x的值为”,x.sort()作用的结果,需要通过打印被作用的列表才可以查看结果。true是倒序,false是正序。
sorted():Python内置方法。返回新的列表。
(2)list.reverse()和reversed()
list.reverse()返回的是None,其作用的结果,需要通过打印被作用的列表才可以查看结果。
reversed():内置方法。经过reversed()作用之后,返回的是一个吧序列值经过倒序的迭代器,所以,需要通过遍历或list、tuple或next()方法,才能获得作用后的值。
(3)字符串的查找:find和index
str.find(s):从左至右查找str中是否含s,有则返回第一次出现s的索引位置,否则返回-1
str.index(x):从左至右查找是否含有x,有则返回第一次出现的索引位置,没有则抛出ValueError
str.rfind()和str.rindex()就是从右至左查找。
22、函数变量的作用域
(1)局部变量、全局变量、global
global:用于在函数中直接修改全局变量的值。
(2)内嵌函数
内嵌函数的作用域仅限其所在的函数体内。如果要在内部函数中修改外部函数中的局部变量的值,使用nonlocal关键字。
23、datetime库——处理时间
其中的一个类:datetime类。引用方式:from datetime import datetime
24、面向对象编程
(1)首先定义一个“类”:class 类名(object):
类名要求:每个单词首字母大写其余小写(如:SomeClass)
(2)在类中定义实例方法:
实例方法只有实例对象才可以调用。
调用方式:1、类对象内部(其他实例方法中):self.方法名(实参);2、类对象外部:实例对象.方法名(实参)。
第一种:普通方法:def 方法名(self,其他形参):
。self是用于接收实例对象的。
第二种:特殊方法:def __init__(self,其他形参)
。用于在创建实例对象后对其进行初始化。self必须有且是第一个形参,其他形参可有可无。创建实例对象后就会自动调用此方法。
(3)实例属性:实例对象所绑定的属性。
给实例对象绑定实例属性的方式:1、在类对象内(方法中):self.属性名 = 属性值 ;2、在类对象外部:实例对象.属性名 = 属性值。
访问实例属性的方式:1、在类对象内部(方法中):self.属性名;2、在类对象外部:实例对象.属性名。
(4)类对象属性:类属性指的是类对象所绑定的属性。
绑定方式:1、类对象内:属性名 = 属性值;2、类对象外部:类对象.属性名 = 属性值。
访问类属性的方式:1、类对象的内部(方法中):类对象.属性名;2、在类对象外部:类对象.属性名 或 实例对象.属性名
总结:访问实例属性和类属性都可通过“实例对象.属性名”的方式,要注意的是,当通过“实例对象.属性名”方式访问属性时,会先查找指定的实例对象中有没有指定名称的实例属性,如果没有,再查找对应的类对象中有没有指定名称的类属性。
(5)函数装饰器:装饰器接收一个函数作为参数(传入的实参是被装饰的函数)。装饰器内部嵌套定义一个函数,且返回值是内函数(即return 内函数名)。被装饰函数的前面要添加@装饰器的函数名
。
(6)类方法:即类对象中使用装饰器@classmethod
进行装饰的方法。
第一个形参用cls,表示类对象。
调用方式:类对象.方法名(实参)或cls.方法名(实参);也可以被实例对象调用,调用方式:实例对象.方法名(实参)或self.方法名(实参)。
(7)静态方法:用装饰器@staticmethod
。
静态方法只是一个普通的函数,因此,第一个形参没要求。调用方法同类方法。
(8)访问控制:控制类对象的属性和方法在类对象的外部是否可以直接访问。如果在类对象的某个属性或方法前添加两个下划线__
,在类对象的外部就不能直接访问该属性或方法了。但在类对象的外部仍可以通过_类名__xxx
访问属性或方法__xxx
。
(9)三大特征:封装、继承和多态
封装:将数据(属性)和行为(方法)包装到类对象中。在方法内部对属性进行操作,在类对象的外部调用方法。
继承: 当几个类对象有共同的属性和方法时,可以将这些属性和方法提取到一个基类,则只需要让每个类对象(子类)继承这个基类(父类),就可以访问基类中的属性和方法。子类会继承所有父类(所有直接/间接父类)的所有属性和方法。
子类可以添加父类中没有的属性。也可以重写自父类的某个属性或方法:在子类中定义与父类中同名的属性或方法(包括装饰器)。重写后可以通过super().xxx()
调用父类中被重写的名为xxx的方法。
MRO(方法解析顺序)用于查看在类继承树上搜索方法的顺序。获取方法:调用最底层类对象的方法mro()或访问他的特殊属性__mro__
。如果想调用指定父类中被重写的方法,可以给super()传入两个实参:super(a_type,obj)
,a_type是类对象,obj是实例对象。被指定的父类是:obj所对应类对象的MRO中,a_type后面那个类对象。
多态:在不考虑对象类型的情况下使用对象。
(10)内置函数:issubclass()与isinstance() 、type()与dir()、增删改查
issubclass(实参1,实参2)用于判断类对象与类对象的关系(是不是子类)。实参1是类对象。实参2是类对象(或类对象组成的元组)时,如果实参1是实参2的子类(或元组内任意一个类对象的子类),返回Ture。(自己是自己的子类)
isinstance(实参1,实参2)用于判断实例对象与类对象的关系。实参1是实例对象,实参2是类对象(类对象组成的元组)时,如果实参1是实参2或其子类的实例对象(或实参2中任意一个类对象或其子类的实例对象,返回True)(print(isinstance(D(),D))是True)
type()用于获取指定对象的类型。实例对象的类型是其对应的类对象
。类对象的类型是type
,即,类对象是type的一个实例对象。自定义函数对象的类型是function
,内置函数对象的类型是builtin_function_or_method
(如type(dir)是这个,type(dir())是list)。可以用运算符==
判断某个对象的类型是否是指定的类型。不是基本数据类型需导入模块types使用其中定义的变量。
dir()用于获得类对象或实例对象所有可以访问的属性和方法(包括从父类中继承的)的列表。类对象和实例对象的结果的区别:类对象的结果不包括实例属性。
增删改查:
hasatter(object,name): 判断指定对象object是否有名为name的属性或方法。
getattr(object,name[,default]):等价于:object.name。用于获取指定对象object中名为name的属性或方法。找不到name指定的属性或方法时,不指定default就抛出AttributeError.指定了参数default就返回default。
setattr(object,name,value):在指定的object中添加或修改名为name的属性或方法的值,改为value。等价于:object.name=value.
delattr(object,name):删除。等同于del object.name。
(11)算术运算符重载
+
对应的特殊方法是__add__()和__radd__()
-
对应的特殊方法是__sub__()和__rsub__()
*
对应的特殊方法是__mul__()和__rmul__()
/
对应的特殊方法是__truediv__()和__rtruediv__()
//
对应的特殊方法是__floordiv__()和__rfloordiv__()
例如:object1+object2,object1在左边,所以需要实现__add__(),object2在右边,所以需要实现__radd__()。先查看object1,如果返回NotImplemented
,就转去查看object2。
(12)类的特殊方法之__str__()和__repr__()
类的特殊方法之__str__()和__repr__()用于自定义并返回实例对象的字符串表示形式。
- 直接打印一个实例对象时,若实例对象对应的类对象中实现了特殊方法__repr__(),会自动调用该方法,否则打印实例对象对应的类对象和实例对象在内存中的地址。
- 用print打印实例对象时。若有__str__(),会自动调用它,否则有__repr__(),就调用它,都没有就打印地址。
- str(实例对象名)时,若有__str__(),会自动调用它,否则有__repr__(),就调用它,都没有就打印地址。
- repr(实例对象名)时,有__repr__(),就调用它,否则就打印地址.
(13)new()
当使用“类名([实参])”创建实例对象时,首先调用__new__(cls,*args,**kwargs)
创建实例对象,该类中没有,就去父类中找;再调用特殊方法__init__()对创建的实例对象进行初始化,new()返回的实例对象会作为实参被自动传递给__init__()的第一个形参self。
(14)getitem()、setitem()、delitem()用于使用中括号语法操作数据。
getitem(self,key):当操作object[key]时,会自动调用该特殊方法。
setitem(self,key,value):当执行操作object[key]=value时,会自动调用该特殊方法。
delitem(self,key):当执行操作del object[key]时,会自动调用该特殊方法。
(15)特殊方法之__call__()与__callable__()、len()
如果在类对象中实现了特殊方法__call__(),那么就可以像调用函数一样直接调用这个类对象的实例对象,从而会自动调用特殊方法__call__()。
内置函数callable用于判断指定对象是否是可调用的。除了函数对象是可调用的之外,对于实现了特殊方法__call__()的类对象,其实例对象也是可调用的。
特殊方法__len__()用于解决内置函数len()的实参不能是自定义类对象的实例对象这个问题。有了__len__(),调用len()时,在其内部会自动调用实参所对应类对象的特殊方法__len__()。
(16)特殊属性:doc、dict、slots
类对象有个特殊属性叫__doc__
,用于访问类对象的文档字符串。文档字符串是位于类对象的第一行的字符串,通常用三个引号表示(如:""“文档字符串”"")访问类对象的文档字符串方式:类名.doc
特殊属性__dict__
,用于获得指定的类对象和实例对象所绑定的所有属性和方法的字典,其中,字典中的键为属性名或方法名。
特殊属性__slots__
用于对实例对象动态绑定的属性和方法的名称进行限制。在类对象中定义这个特殊属性,并给它赋值一个所有元素都为字符串的列表或元组。这样名称只能来自于__slots__中的元素。
类对象中定义了__slots__
后,就不会再创建__dict__
了(打印类名称.__dict__
,会报错),但__slots__只对其所在类对象的实例对象起作用,对子类的实例对象无用。如果子类也定义了特殊属性__slots__
,那么子类的实例对象可以动态绑定的属性方法的名称为子类的__slots__和父类的__slots__。
(17)生成器和迭代器 - 生成器表达式:例如输出
(i * i for i in range(8))
的结果<generator object <genexpr> at 0x000001C75B0390C0>
就是生成器表达式。需要用其他方式查看其中的元素。
查看方式有两种:
1、多次调用next()
,每次都返回生成器的下一个元素,直到抛出异常StopIteration
时表示没有更多元素了。
2、使用for-in语句
对生成器进行迭代,这样就不用关心异常StopIteration
了。
生成器中保存的并不是其对应的所有元素,而是如何推算出所有元素的算法。用于以上两种方法时都是在调用中一个个将元素推算出来,所以生成器是惰性推算,只有当用到生成器中的某个元素时,才会临时进行推算,不会提前。
还可以使用生成器函数得到生成器,生成器函数中通过关键字yield
返回推算出的元素(如print(a,end = ','
等同于yield a
),当调用以上两种查看方式时,执行完yield语句就会将生成器函数挂起,下次从挂起的地方继续执行。 - 迭代器:
可以用for-in语句的对象被称为可迭代(Iterable)对象,例如:range、列表、元组、字符串、字典、集合、生成器.可以调用内置函数isinstance(某对象,类Iterable)判断一个对象是否是可迭代对象,标准库模块collections中的类Iterable用于表示可迭代对象。
迭代器(Iterator)对象:可以作为next()的实参从而支持惰性推算的可迭代对象。range、列表、元组、字符串、字典、集合都不是。生成器可以。所以生成器是迭代器的一种。
可以调用内置函数iter()把不支持惰性推算的可迭代对象转换成迭代对象。如果一个对象同时实现了特殊方法__iter__()和__next__(),那么该对象也被称为迭代器对象。如果将该对象用于for-in语句,for-in语句首先会调用特殊方法__iter__()返回一个可迭代对象,然后不断调用该可迭代对象的__next__()返回下一次迭代的值,直到遇到StopIteration时退出循环。
25、lambda函数:返回函数名作为结果
<函数名> = lambda <参数>: <表达式>
等价于
def <函数名>(<参数>):
<函数体>
return <返回值>
26、返回迭代器的函数range/map/filter/reduce/zip/enumerate
range(start,stop,step)函数:返回一个可迭代对象(类型是对象),而不是列表类型,所以打印的时候不会打印列表。计数从start至stop结束,但不包括stop,步长为step。
map(函数,一个或多个序列):(函数作用到每一个序列)每一个序列都调用函数,返回新返回值。返回迭代器
27、模块与包
API用于描述模块中提供的函数的功能和调用方法。
模块的导入:from 模块 import 函数名(*)或import 模块名
查看模块搜索路径:sys.path
标准库os:import os 。查看当前路径:os.getcwd() ;修改当前路径:os.chdir(路径); 建立子文件夹,已存在会保存:os.mkdir();删除一个文件夹,不存在会报错:os.rmdir();列出当前目录下文件夹名称,返回一个列表:os.listdir();修改文件名:os.rename();删除文件:os.remove();
文件的开与关:开:open()提供了’r’,‘w’,‘x’,‘a’,‘b’,‘t’,’+’。如:f = open(‘a.txt’,‘r’) ,以w方式打开一个不存在的文件,会创建此文件,其他的遇到不存在文件,会报错。
关:f.close()。f.write()。f.read():读完一次,指针位于文档最后,再次读内容为空。关闭后再打开时,指针又回到文档的起点。
读取:read()返回字符串、readline()按行读取,返回字符串、readlines()所有内容在一整行返回,返回列表。
f.tell()获得文件当前读写位置。控制文件读写位置:f.seek(偏移量,参数)参数为0,1,2分别表示文件开头、当前、末尾位置。
28、错误与异常
错误分为:语法错误、逻辑错误和运行时错误。
语法错误指拼写等错误:SyntaxError、
逻辑错误:程序可执行,但结果不对;
运行时错误:
没导入相关模块:NameError;
0做分母:ZeroDivisionError;
程序试图打开不存在的文件:FileNotFoundError。
异常:程序没有语法错误的前提下,在运行期间产生的特定错误。
TypeError.
异常处理:try…except…else…finally结构
将可能会产生异常的代码放在try语句块中,把处理异常是代码放在except语句块中。
29、turtle库(import turtle)
设置窗口大小及位置:turtle.setup(width, height, startx, starty)
海龟坐标(以海龟为参照物确定方向):
向海龟正前方进行:turtle.fd(d) ;
向海龟反方向进行:turtle.bk(d) ;
向海龟左侧angle度的某点为圆心r为半径进行曲线运行:turtle.circle(r,angle)
改变海龟行进方向:turtle.seth();
向左转/向右转:turtle.left(angle)/turtle.right(angle);
画笔控制函数:抬起画笔,海龟在飞行:turtle.penup();
放下画笔:turtle.pendown();
改变画笔粗细:turtle.pensize()或turtle.width();
改变画笔颜色:turtle.pencolor()。