Python语言程序设计 学习笔记(二) 第七章 对象和类 第八章 更多字符串和特殊方法 第九章 使用Tkinter进行GUI程序设计 第十章 列表 第十一章 多维列表 第十二章 继承和多态 第十三章 文件和异常处理
整章内容:
- [x] 描述对象和类,以及使用类来建模对象。
- [x] 定义带数据域和方法的类。
- [x] 使用构造方法调用初始化程序来创建和初始化数据域以构建一个对象。
- [x] 使用圆点运算符(
.
)访问对象成员。 - [x] 使用
self
参数引用对象本身。 - [x] 使用
UML
图符号来描述类和对象。 - [x] 区分不可变对象和可变对象。
- [x] 隐藏数据域以避免数据域损坏并使类更易于维护。
- [x] 在软件开发过程中应用类的抽象和封装。
- [x] 探究面向过程范式和面向对象范式的差异。
新内容:
-
一个Python类使用变量存储数据域,定义方法来完成动作。类就是一份契约(有时也称为模板或蓝本),它定义对象的数据域和方法。
对象是类的一个实例,可以创建一个类的多个对象。创建类的一个实例的过程被称为实例化。术语对象和实例经常是可互换的。对象就是实例,而实例就是对象。
-
__init__
方法:初始化程序,它是在创建和初始化这个新对象时被调用的。初始化程序能完成任何动作,但初始化程序被设计为完成初始化动作,例如:使用初始值创建对象的数据域。 -
使用构造方法由类来创建对象时,构造方法完成两个任务:
- 在内存中为类创建一个对象。
- 调用类的
__init__
方法来初始化对象。
-
将对象赋值给一个变量:
objectRefVar = ClassName(arguments)
。 -
访问对象数据域并调用它的方法:通过使用圆点运算符(
.
),如:objectRefVar.datafield
、objectRefVar.method(args)
。 -
定义的每个方法的第一个参数是
self
,它是指向对象本身的参数,可以使用它访问在类定义中的对象成员。 -
当将一个对象传递给函数,就是将对象的引用传递给函数。但是传递不可变对象和可变对象之间还有着更重要的区别。
- 像数字或字符串这样的不可变对象参数,函数外的对象的原始值并没有被改变。
- 像圆这样的可变对象参数,如果对象的内容在函数内被改变,则对象的原始值被改变。
-
隐藏数据域:在属性名前加两个下划线可以将属性定义为私有,如:
self.__radius
。这样radius
属性将不能被直接访问,但是可以通过get
方法来读取。
其他内容:略。
第八章 更多字符串和特殊方法
- [x] 学习如何创建字符串。
- [x] 使用
len
、min
和max
函数获取一个字符串的长度、串中的最大和最小的字符串。 - [x] 使用下标运算符(
[]
)访问字符串中的元素。 - [x] 使用截取运算符
str[start:end]
从较长的字符串中得到一个子串。 - [x] 使用
+
运算符连接两个字符串,通过*
运算符赋值一个字符串。 - [x] 使用
in
和not in
运算符判断一个字符串是否包含在另一个字符串内。 - [x] 使用比较运算符(
==
、!=
、<
、<=
、>
、>=
)对字符串进行比较。 - [x] 使用
for
循环迭代字符串中的字符。 - [x] 使用方法
isalnum
、isalpha
、isdigit
、isidentifier
、islower
、isupper
和isspace
来测试字符串。 - [x] 使用方法
endswith
、startswith
、find
、rfind
和count
搜索子串。 - [x] 使用方法
capitalize
、lower
、upper
、title
、swapcase
和replace
转换字符串。 - [x] 使用方法
lstrip
、rstrip
和strip
从一个字符串的左侧或右侧删除空格。 - [x] 使用方法
center
、ljust
、rjust
和format
格式化字符串。 - [x] 在应用程序(
CheckPalindrome
、HexToDecimalConversion
)的开发过程中应用字符串。 - [x] 为运算符定义特殊的方法。
- [x] 设计
Rational
类表示有理数。
新内容:
-
截取运算符通过使用语法
[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
返回这个复制的字符串,它用一个新字符串替换旧字符串所有出现的地方 -
删掉字符串中的空格:字符
''
、f
、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程序设计
- [x] 使用
Tkinter
创建一个简单的GUI
应用程序。 - [x] 使用绑定到小构件命令选项的回调函数来处理事件。
- [x] 使用标签、输入域、按钮、复选按钮、单选按钮、消息和文本创建图形用户界面。
- [x] 在画布上绘制线段、矩形、椭圆、多边形和圆弧并表示文本字符串。
- [x] 使用几何管理器在容器中布局小构件。
- [x] 使用网格管理器在网格中布局小构件。
- [x] 使用包管理器将小构件一个挨一个地放置或一个叠加一个地放置。
- [x] 使用位置管理器将小构件放置在绝对位置上。
- [x] 使用容器来划分小构件以获得期望的布局。
- [x] 在小构件中使用图片。
- [x] 创建包含菜单的应用程序。
- [x] 创建包含弹出菜单的应用程序。
- [x] 绑定一个小构件的鼠标和按键事件以回调一个函数来处理事件。
- [x] 开发动画。
- [x] 使用滚动条扫描一个文本小构件的内容。
- [x] 使用标准对话框显示消息并接收使用者的输入。
新内容:
-
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
小构件里的内容。 -
使用标准对话框显示消息框或者提示用户输入数字和字符串。
其他内容:略。
第十章 列表
- [x] 描述为什么列表在程序设计中很有用。
- [x] 学习如何创建列表。
- [x] 探究列表的常用操作。
- [x] 对列表使用
len
、min
、max
、sum
、和random.shuffle
函数。 - [x] 使用下标变量访问列表元素。
- [x] 使用截取运算符
[start:end]
从一个较长的列表中获取字列表。 - [x] 在列表中使用
+
(联接)、*
(重复)和in/not in
操作。 - [x] 使用
for
循环遍历一个列表中的元素。 - [x] 使用列表解析来创建列表。
- [x] 调用列表的
append
、count
、extend
、index
、insert
、pop
、remove
、reverse
和sort
方法。 - [x] 使用
str
的split
方法将一个字符串分成一个列表。 - [x] 从控制台中读取数据到列表。
- [x] 在应用程序开发中使用列表。
- [x] 将一个列表的内容复制到另外一个列表。
- [x] 开发和调用包含有列表参数且返回列表的函数。
- [x] 使用线性查找算法或者二分查找算法来查找元素。
- [x] 使用选择排序法对列表进行排序。
- [x] 使用插入排序法对列表进行排序。
- [x] 使用列表开发一个弹球动画。
新内容:
-
列表解析。一种创建顺序元素列表的简洁方式,一个列表解析由多个方括号组成,方括号内包含后跟一个
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
第十一章 多维列表
- [x] 学习如何使用二维列表来表示二维数据。
- [x] 使用行下标和列下标来访问二维列表中的元素。
- [x] 为二维列表编写常用的操作(显示列表、求所有元素综合、找出
min
和max
元素、随意打乱和排序)。 - [x] 向函数传递二维列表。
- [x] 使用二维列表编写对多选题评分的程序。
- [x] 使用二维列表来解决找出距离最近点对。
- [x] 使用二维列表来检查数独解决方案。
- [x] 使用多维列表。
新内容:略。
其它内容:
-
多个列表通过一行输入
line = input.split() points = [[eval(line[i]), eval(line[i + 1])] for i in range(0, 6, 2)]
第十二章 继承和多态
- [x] 通过继承由超类定义子类。
- [x] 覆盖子类中的方法。
- [x] 探究
Object
类和它的方法。 - [x] 理解多态和动态绑定。
- [x] 使用
isinstance
函数来判定一个对象是否是类的一个实例。 - [x] 设计一个GUI类显示一个可重用的时钟。
- [x] 探究类之间的关系。
- [x] 使用组合和继承关系设计类。
新内容:
- 继承是面向对象泛型软件重用方面一个重要且强大的特征。假设要定义类来对圆、矩形和三角形建模,这些类都有很多共同的特征,设计这些类来避免冗余并且使系统更易理解和更易维护的最好方式,就是使用继承。
- 如果类C1扩展自另一个类C2,那么就将C1称为派生类、孩子类或子类,而将C2称为超类基类、父类或超类。
- 子类并不是父类的一个子集,实际上子类通常比父类包含更多的信息和方法。
- 方法覆盖:在子类继承父类方法时,子类需要修改定义在父类中的方法的实现。为了覆盖父类的方法,子类中的方法必须使用与父类方法一样的方法头。
- 多态:子类的对象可以传递给需要父类类型的参数。使用父类对象的地方都可以使用子类的对象。
- 动态绑定:一个方法可以被沿着继承链的几个类执行,运行时由Python决定调用哪个方法。
-
isinstance(object, ClassName)
:判断一个对象是否是一个类的实例。
其它内容:略。
第十三章 文件和异常处理
- [x] 为了读写一个文件需要使用
open
函数打开该文件。 - [x] 在一个文件对象中使用
write
方法来写入数据。 - [x] 使用
os.path.isfile
函数来检测一个文件是否存在。 - [x] 在一个文件对象中使用
read
、readline
和readlines
方法来从一个文件读取数据。 - [x] 为了给一个文件追加数据,以追加模式打开这个文件。
- [x] 读写数值数据。
- [x] 显示打开和保存对话框以获取文件名对数据进行读写。
- [x] 利用文件开发应用程序。
- [x] 从网站资源上读取数据。
- [x] 使用
try
、except
和finally
子句来处理异常。 - [x] 使用
raise
语句抛出异常。 - [x] 熟悉
Python
的内置异常类。 - [x] 访问句柄中的一个异常对象。
- [x] 定义自定制的异常类。
- [x] 使用
pickle
模型中的load
和dump
函数来实现二进制IO。 - [x] 使用二进制IO创建一个地址簿。
新内容:
-
文件可以分为文本文件和二进制文件。在Windows系统中能够使用文本编辑器或Notepad处理(读写和创建)或者在UNIX系统中能够使用vi处理的文件被称为文本文件。所有其他文件都被称为二进制文件。
-
打开文件的语法:
-
fileVariable = open(filename, mode)
,其中参数mode
是一个指定这个文件将被如何使用(只读或只写)的字符串,如下表所示。模式 描述 "r" 为了读取打开一个文件 "w" 为了写入打开一个文件,若文件已存在,它的内容将被销毁 "a" 打开一个文件从文件末尾追加数据 "rb" 为读取二进制数据打开文件 "wb" 为写入二进制数据打开文件 -
使用绝对文件名打开Windows下的文件:
input = open(r"c:pyboolScores.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)
:读取一个字节流并将它们存入文件中。
其它内容:略。