Python语言程序设计 学习笔记(二)
第七章 对象和类
整章内容:
新内容:
-
一个Python类使用变量存储数据域,定义方法来完成动作。类就是一份契约(有时也称为模板或蓝本),它定义对象的数据域和方法。
对象是类的一个实例,可以创建一个类的多个对象。创建类的一个实例的过程被称为实例化。术语对象和实例经常是可互换的。对象就是实例,而实例就是对象。
-
__init__
方法:初始化程序,它是在创建和初始化这个新对象时被调用的。初始化程序能完成任何动作,但初始化程序被设计为完成初始化动作,例如:使用初始值创建对象的数据域。 -
使用构造方法由类来创建对象时,构造方法完成两个任务:
- 在内存中为类创建一个对象。
- 调用类的
__init__
方法来初始化对象。
-
将对象赋值给一个变量:
objectRefVar = ClassName(arguments)
。 -
访问对象数据域并调用它的方法:通过使用圆点运算符(
.
),如:objectRefVar.datafield
、objectRefVar.method(args)
。 -
定义的每个方法的第一个参数是
self
,它是指向对象本身的参数,可以使用它访问在类定义中的对象成员。 -
当将一个对象传递给函数,就是将对象的引用传递给函数。但是传递不可变对象和可变对象之间还有着更重要的区别。
- 像数字或字符串这样的不可变对象参数,函数外的对象的原始值并没有被改变。
- 像圆这样的可变对象参数,如果对象的内容在函数内被改变,则对象的原始值被改变。
-
隐藏数据域:在属性名前加两个下划线可以将属性定义为私有,如:
self.__radius
。这样radius
属性将不能被直接访问,但是可以通过get
方法来读取。
其他内容:略。
第八章 更多字符串和特殊方法
新内容:
-
截取运算符通过使用语法
[start : end]
返回字符串其中的一段,这一段是从下表start
到end - 1
的一个子串。如果截取操作符s[i : j]
中的下标是负数,则用len(s) + index
来代替;如果j > len(s)
,则j
就会被设置成len(s)
;如果i >= j
,则截取的字符串将变为空串。 -
使用
in
和not in
来测试一个字符串是否在另一个字符串中。 -
搜索字符串中子串的方法。
str 说明 endswith(s1 : str): bool
如果字符串是以子串 s1
结尾则返回True
startswith(s1 : str): bool
如果字符串是以子串 s1
开始则返回True
find(s1): int
返回 s1
在这个字符串的最低下标,如果字符串中不存在s1
,则返回-1rfind(s1): int
返回 s1
在这个字符串的最高下标,如果字符串中不存在s1
,则返回-1count(substring): int
返回这个字符串在字符串中出现的无覆盖的次数 -
转换字符串的方法:以下方法可以控制字符串复制过程中字母的大小写,或是整体地替换。
str 说明 capitalize(): str
返回这个复制的字符串并只大写第一个字符 lower(): str
返回这个复制的字符串并将所有字母转换为小写的 upper(): str
返回这个复制的字符串并将所有字母转换为大写的 title(): str
返回这个复制的字符串并大写每个单词的首字母 swapcase(): str
返回这个复制的字符串,将小写字母转换成大写,将大写字母转换成小写 replace(old, new): str
返回这个复制的字符串,它用一个新字符串替换旧字符串所有出现的地方 -
删掉字符串中的空格:字符
''
、\t
、\f
、\r
和\n
都是空白字符。str 说明 lstrip(): str
返回去掉前段空白字符的字符串 rstrip(): str
返回去掉末端空白字符的字符串 strip(): str
返回去掉两端空白字符的字符串 -
格式化字符串。
str 说明 s.center(width): str
返回在给定宽度域上居中的字符串副本 s.ljust(width): str
返回在给定宽度域上左对齐的字符串文本 s.rjust(width): str
返回在给定宽度域上右对齐的字符串文本 format(items): str
格式化一个字符串
其他内容:
- 一个
str
对象是不可变的,即一旦创建了这个字符串,它的内容就成为不可变的了。 - 为了优化性能,Python使用一个对象来表示具有相同内容的字符串,如
s1 = "Welcome"
,s2 = "Welcome"
,它们都指向同一个字符串对象,有着相同的id数。实际上对于所有不可变对象,此动作都是适用的。
第九章 使用Tkinter进行GUI程序设计
新内容:
-
Tkinter小构件类
小构件 描述 Button 一个用来执行一条命令的简单按钮 Canvas 结构化的图形,用于绘制图形、创建图形编辑器以及实现自定制的小构件类 Checkbutton 单击复选按钮在值之间切换 Entry 一个文本输入域,也被称为文本域或文本框 Frame 包含其他小构件的一个容器小构件 Label 显示文本或图像 Menu 用来实现下拉和弹出菜单的菜单栏 Menubutton 用来实现下拉菜单的菜单按钮 Message 显示文本,类似于标签小构件,但能自动将文本放在给定的宽度或宽高比内 Radiobutton 单击单选按钮设置变量为那个值,同时清除所有和同一个变量相关联的其他单选按钮 Text 格式化的文本显示,允许用不同的风格和属性显示和编辑文本,也支持内嵌的图片和窗口 -
几何管理器。由于三种几何管理器都有自己放置小构件的风格,所以最好不要对同一容器中的小构件使用多个管理器,可以使用框架作为子容器以获取期望的布局。
- 网格管理器将小构件放在容器中一个不可见网格的每个单元内。可以将小构件放在某个特定的行和列内,也可以使用
rowspan
和columnspan
参数将小构件放在多行和多列中。 - 包管理器将小构件依次地一个放置在另一个的顶部或将它们一个挨着一个地放置,也可以使用
fill
选项使一个小构件充满它的整个容器。 - 位置管理器将小构件放在绝对位置上。
- 网格管理器将小构件放在容器中一个不可见网格的每个单元内。可以将小构件放在某个特定的行和列内,也可以使用
-
Canvas
类也可以被用来开发动画。可以在画布上显示图片和文本,并使用move(tags, dx, dy)
方法移动图片,如果dx
是正值,则图片右移dx
个像素,而如果dy
是正值,则图片下移dy
个元素。如果dx
和dy
是负值,图片则向左移或向上移。 -
Scrollbar
小构件可以在水平方向或者垂直方向展开Text
、Canvas
或者Listbox
小构件里的内容。 -
使用标准对话框显示消息框或者提示用户输入数字和字符串。
其他内容:略。
第十章 列表
新内容:
-
列表解析。一种创建顺序元素列表的简洁方式,一个列表解析由多个方括号组成,方括号内包含后跟一个
for
子句的表达式,之后是0或多个for
或if
子句,列表解析可以产生一个由表达式求值结果组成的列表。下面是几个例子。list1 = [x for x in range(5)] list2 = [0.5 * x for x in list1] list3 = [x for x in list2 if x < 1.5]
-
将字符串分成列表。
str
类包括了split
方法,它可以将字符串中的条目分成列表。下面是几个例子。items = "Jane John Peter Susan".split() items = "09/20/2012".split("/")
-
将列表传递给函数。当列表被传递给函数时,由于列表是一个可变对象,所以列表的内容可能会在函数调用后改变。
其他内容:
-
列表方法
list 说明 append(x: object): None
将元素 x
添加到列表结尾count(x: object): int
返回元素 x
在列表中的出现次数extend(l: list): None
将l中的所有元素追加到列表中 index(x: object): int
返回元素 x
在列表中第一次出现的下标insert(index: int, x: object): None
将元素x插入列表中指定下标处。注意:列表第一个元素的下标是\(0\) pop(i): object
删除给定位置的元素并且返回它。参数 i
是可选的,如果未指定,则默认最后一个元素remove(x: object): None
删除列表中第一次出现的 x
reverse(): None
将列表中的所有元素倒序 sort(): None
以升序对列表中的元素排序 -
为了将一个列表中的数据复制给另一个列表,必须将元素逐个地从源列表复制到目标列表。如果直接
list2 = list1
,改变list2
的值时,list1
的值也会被改变,因为它们指向同一个列表,可采用下列方法仅复制内容。list2 = [x for x in list1] list2 = [] + list1
第十一章 多维列表
新内容:略。
其它内容:
-
多个列表通过一行输入
line = input.split() points = [[eval(line[i]), eval(line[i + 1])] for i in range(0, 6, 2)]
第十二章 继承和多态
新内容:
- 继承是面向对象泛型软件重用方面一个重要且强大的特征。假设要定义类来对圆、矩形和三角形建模,这些类都有很多共同的特征,设计这些类来避免冗余并且使系统更易理解和更易维护的最好方式,就是使用继承。
- 如果类C1扩展自另一个类C2,那么就将C1称为派生类、孩子类或子类,而将C2称为超类基类、父类或超类。
- 子类并不是父类的一个子集,实际上子类通常比父类包含更多的信息和方法。
- 方法覆盖:在子类继承父类方法时,子类需要修改定义在父类中的方法的实现。为了覆盖父类的方法,子类中的方法必须使用与父类方法一样的方法头。
- 多态:子类的对象可以传递给需要父类类型的参数。使用父类对象的地方都可以使用子类的对象。
- 动态绑定:一个方法可以被沿着继承链的几个类执行,运行时由Python决定调用哪个方法。
isinstance(object, ClassName)
:判断一个对象是否是一个类的实例。
其它内容:略。
第十三章 文件和异常处理
新内容:
-
文件可以分为文本文件和二进制文件。在Windows系统中能够使用文本编辑器或Notepad处理(读写和创建)或者在UNIX系统中能够使用vi处理的文件被称为文本文件。所有其他文件都被称为二进制文件。
-
打开文件的语法:
-
fileVariable = open(filename, mode)
,其中参数mode
是一个指定这个文件将被如何使用(只读或只写)的字符串,如下表所示。模式 描述 "r" 为了读取打开一个文件 "w" 为了写入打开一个文件,若文件已存在,它的内容将被销毁 "a" 打开一个文件从文件末尾追加数据 "rb" 为读取二进制数据打开文件 "wb" 为写入二进制数据打开文件 -
使用绝对文件名打开Windows下的文件:
input = open(r"c:\pybool\Scores.txt", "r")
。绝对文件名前的r
前缀表示这个字符串是一个行字符串,这会使Python解释器将文件名中的反斜线理解为意义上的反斜线,若无r
前缀,需要使用转义序列将上述语句改写为input = open("c:\\pybool\\Scores.txt", "r")
。
-
-
从文件中读取全部数据的方法:
-
read()
:从文件读取所有数据,然后将它作为一个字符串返回。 -
readlines()
:从文件读取所有数据,然后将它作为一个字符串列表返回。 -
大文件,内容无法全部存在存储器中时可每次读取一行,持续读取下一行直至文件末端。
line = infile.readline() while line != '': line = infile.readline()
for line in infile:
-
-
异常处理:
try: <body> except <ExceptionType1>: <handler1> ... except <ExceptionTypeN>: <handlerN> except: <handlerExcept> else: # 若try块中未抛出异常则执行 <process_else> finally: # 无论什么情况都会执行 <process_finally>
-
抛出异常:
raise RuntimeErroe("Wrong argument")
。 -
处理异常:当
except
子句捕获到异常时,这个异常对象就被赋给一个名为ex
的变量。try <body> except ExceptionType as ex: <handler>
-
序列化:将一个对象转换为一个能够存储在一个文件中或在网络上进行传输的字节流的过程。也称为浸渍、卸载对象。
反序列化:从字节流中提取出对象的过程。也称为去渍、加载对象。
-
dump(objec)
:将对象序列化为一个字节流并将它们存入文件中。load(object)
:读取一个字节流并将它们存入文件中。
其它内容:略。