一.了解python
1.python命名规则
(1).区分大小写
(2).首字母可以是下划线——或字母,不能是数字
(3).除了首字母外的其他字符必须是下划线、字母和数字
(4).关键字和python的内置函数不可以使用
2.注释
单行注释 #
3.# coding=utf-8
这个注释告诉python解释器该文件的编码集是utf-8,该注释必须放在文件的第一行或第二行才能生效,它还有替代写法:# -- coding:utf-8 --
4.模块
(1).引入模块
import 模块名 这种会导入模块内的所有代码元素,需要模块名前缀
from 模块名 import 代码元素 直接导出模块内的代码元素,不需要模块名前缀
from 模块名 import 代码元素 as 代码元素别名
5.python中的数据类型
在python中所有的数据类型都是类,每个数据值都是类的实例
在python中有6中主要的内置数据类型:数字、字符串、列表、元组、集合和字典。列表、元组、集合和字典可以容纳多项数据
python中的数字类型一共有4种:整数类型、浮点类型、复数类型和布尔类型(布尔类型是整数类型的一种)
5-1.整数类型
python中的整数类型为int类,整数类型的范围可以很大,表示很大的整数,只受所在计算机的限制
5-2.浮点类型
浮点类型主要用来存储小数数值,python的浮点类型为float类,pythonm只支持双精度浮点类型,而且是与本机相关的
5-3.复数类型
整数和浮点数在数学中被统称为实数。与实数对应的是复数,复数在数学中表示为:a+bi,其中a被称为实部,b被称为虚部,i被称为虚数单位
例:1+2j 、(1+2j)+(1+2j)=(2+4j)
5-4.布尔类型
python中的布尔类型为bool类,bool是int的子类,它只有两个值:True和False
注:python中的数据类型转换很灵活,任何类型的数据都可以通过bool()函数转换为布尔值
5-5.数字类型的相互转换
5-5-1.隐式类型转换(进行数学计算的时候数字类型不同会发生隐式类型转换)
5-5-2.显式类型转换int()整数、float()小数、bool()布尔
6.python的运算符
6-1.算术运算符
算术运算符用于组织整数类型和浮点类型的数据,有一元运算符和二元运算符之分
一元算术运算符有两个+(正号)和-(负号),例如:+a还是a,-a是对a的取反运算。
二元算术运算符
运算符 | 名称 | 例子 | 说明 |
---|---|---|---|
+ | 加 | a+b | 求a与b的和 |
- | 减 | a-b | 求a与b的差 |
* | 乘 | a*b | 求a与b的和积 |
/ | 除 | a/b | 求a除以b的商 |
% | 取余 | a%b | 求a除以b的余数 |
** | 幂 | a**b | 求a到b次幂 |
// | 地板除法 | a//b | 求a与b的商的最大整数 |
6-2.比较运算符
运算符 | 名称 | 例子 | 说明 |
---|---|---|---|
== | 等于 | a==b | a等于b时返回True,否则返回False |
!= | 不等于 | a!=b | 与==相反 |
> | 大于 | a>b | a大于b时返回True,否则返回False |
< | 小于 | a | a小于b时返回True,否则返回False |
>= | 大于等于 | a>=b | a大于等于b时返回True,否则返回False |
<= | 小于等于 | a<=b | a小于等于b时返回True,否则返回False |
6-3.逻辑运算符
运算符 | 名称 | 例子 | 说明 |
---|---|---|---|
not | 逻辑非 | not a | a为True时,值为False,a为False时,值为True |
and | 逻辑与 | a and b | a/b都为True时,计算结果为True,否则为False |
or | 逻辑或 | a or b | a、b都为False时,计算结果为False,否则返回True |
6-4.位运算符
运算符 | 名称 | 例子 | 说明 |
---|---|---|---|
~ | 位反 | ~x | 将x的值按位取反 |
& | 位与 | x & y | 将x与y按位进行位与运算 |
| | 位或 | x | y | 将x与y按位进行位或运算 |
^ | 位异或 | x ^ y | 将x与y按位进行位异或运算 |
>> | 右移 | x >> a | 将x右移a位,高位采用符号位补位 |
<< | 左移 | x << a | 将x左移a位,低位采用0补位 |
6-5.赋值运算符
运算符 | 名称 | 例子 | 说明 |
---|---|---|---|
+= | 加赋值 | a+=b | 等价于a=a+b |
-= | 减赋值 | a-=b | 等价于a=a-b |
*= | 乘赋值 | a*=b | 等价于a=a*b |
/= | 除赋值 | a/=b | 等价于a=a/b |
%= | 取余赋值 | a%=b | 等价于a=a%b |
**= | 幂赋值 | a**=b | 等价于a=a**b |
//= | 地板除法赋值 | a//=b | 等价于a=a//b |
&= | 位与赋值 | a&=b | 等价于a=a&b |
|= | 位或赋值 | a|=b | 等价于a=a|b |
^= | 位异或赋值 | a^=b | 等价于a=a^b |
<<= | 左移赋值 | a<<=b | 等价于a=a< |
>>= | 右移赋值 | a>>=b | 等价于a=a>>b |
6-6.运算符优先级
优先级 | 运算符 | 说明 |
---|---|---|
1 | () | 小括号 |
2 | ** | 幂 |
3 | ~ | 位反 |
4 | +,- | 正负号 |
5 | *,/,%,// | 乘,除,取余,地板除 |
6 | +,- | 加减 |
7 | <<,>> | 位移 |
8 | & | 位与 |
9 | ^ | 位异或 |
10 | | | 位或 |
11 | <,<=,>,>=,<>,!=,== | 比较 |
12 | not | 逻辑非 |
12 | and,or | 逻辑与,逻辑或 |
7.程序流程控制
7-1.分支语句
7-1-1.if结构
if条件:
缩进(在python编程规范中推荐使用4个半角空格)语句组
7-1-2.if-else结构
if条件:
缩进(在python编程规范中推荐使用4个半角空格)语句组1
else:
缩进(在python编程规范中推荐使用4个半角空格)语句组2
7-1-3.if-elif-else结构
if条件:
缩进(在python编程规范中推荐使用4个半角空格)语句组1
elif:
缩进(在python编程规范中推荐使用4个半角空格)语句组2
else:
缩进(在python编程规范中推荐使用4个半角空格)语句组3
7-2.循环语句
python支持两种循环语句:while和for
7-2-1.while语句
while循环条件:
缩进(在python编程规范中推荐使用4个半角空格)循环体语句组
else:(else不是必须,当循环体正常结束时会执行else,当循环被中断时不执行,当遇到break、return和有异常发生时都会中断循环)
缩进(在python编程规范中推荐使用4个半角空格)语句组
7-2-2.for语句
for 变量 in 可迭代对象:
缩进(在python编程规范中推荐使用4个半角空格)循环体语句组
else:
缩进(在python编程规范中推荐使用4个半角空格)语句组
7-3.跳转语句
跳转语句能够改变程序的执行顺序,包括break、continue和return。break和continue用于循环体中,而return用于函数中
7-3-1.break语句
break语句用于强行退出循环体,不在执行循环体中剩余的语句
7-3-2.continue语句
continue语句用于结束本次循环,跳过循环体中尚未执行的语句,接着进行终止条件的判断,以决定是否继续循环
8.容器类型的数据
8-1.序列
序列是一种可迭代的、元素有序的容器类型的数据
序列包括列表(list)、字符串(str)、元组(tuple)和字节序列(bytes)
8-1-1.序列的索引操作
序列中的元素都是有序的,每一个元素都带有序号,这个序号叫做索引,索引有正值索引和负值索引之分
8-1-2.加和乘操作
加(+)和乘()运算符也可以用于序列中的元素操作,加(+)运算符可以将两个序列连接起来,乘()运算符可以将两个序列重复多次
8-1-3.切片操作
序列的切片(Slicing)就是从序列中切分出小的子序列
切片运算符的语法形式为[start: end: step]其中,start是开始索引,end是结束索引,step是步长(切片时获取的元素的间隔,可以为正整数,也可以为负整数,步长为负值时从右往左获取元素)
注意:切下的小切片包括start位置的元素,但不包括end位置的元素
,start和end都可以省略。
8-1-4.成员测试
成员测试运算符有两个:in和out in,in用于测试是否包含某一个元素,not in用于测试是否不包含某一个元素
8-2列表
列表(list)是一种可变序列类型,我们可以追加、插入、删除和替换列表中的元素
8-2-1.创建列表
创建列表有两种方法
1.list(iterable)函数:参数iterable是可迭代对象(字符串、列表、元组、集合和字典等)
2.[元素1,元素2,元素3,...]:指定具体的列表元素,元素之间以逗号分隔,列表元素需要使用中括号括起来
8-2-2.追加元素
列表是可变的序列对象,列表可以追加元素
1.列表追加单个元素时,可以是用列表的append(x)方法
2.在列表中追加多个元素时,可以使用加(+)运算符或列表的extend(t)方法
注:
方法和函数有什么区别
在python中方法隶属于类,通过类或对象调用方法,例如在list.append(x)中,list是列表对象;函数不隶属于任何类,直接调用即可,例如list(iterable)
8-2-3.插入元素
想向列表中插入元素时,可以使用列表的list.insert(i,x)方法,其中,i指定索引位置,x是要插入的元素
8-2-4.替换元素
想替换列表里的元素时,将列表元素进行赋值即可
8-2-5.删除元素
想在列表中删除元素时,可使用列表的list.remove(x)方法,找到匹配的元素x,则删除该元素,如果找到多个匹配的元素,只删除第一个匹配的元素
8-3.元组
元组(tuple)是一种不可变序列类型
8-3-1.创建元组
1typle(iterable)函数:参数iterable是可迭代对象(字符串、列表、元组、集合和字典等)
2(元素1,元素2,元素3):指定具体的元组元素,元素之间以逗号分隔,对于元组元素,可以使用小括号括起来,也可以省略小括号
8-3-2.元组拆包
创建元组,并将多个数据放到元组中,这个过程被称为元组打包
与元组打包相反的操作时拆包,就是将元组中的元素取出,分别赋给不同的变量
8-4.集合
集合(set)是一种可迭代的无序的、不能包含重复元素的容器类型的数据 序列中的元素时有序的;集合中的元素是无序的,但元素不能重复
8-4-1.创建集合
1set(iterable)函数:参数iterable是可迭代对象(字符串、列表、元组、集合和字典等)
2{元素1,元素2,元素3}:指定具体的集合元素,元素之间以逗号分隔。对于集合元素,需要使用大括号括起来
8-4-2.修改集合
修改集合类似于修改列表,可以向其中插入和删除元素。修改可变集合
add(elem)添加元素,如果元素已经存在,则不能添加,不会抛出错误
remove(elem):删除元素,如果元素不存在,则抛出错误
clear():清除集合
8-5.字典
字典(dict)是可迭代的通过键(key)来访问元素的可变的容器类型的数据
字典由两部分视图构成:键视图和值视图。键视图不能包含重复的元素,值视图能,在键视图中,键和值是成对出现的
8-5-1.创建字典
我们可以通过以下两种方法创建字典
1dict()函数
2{key1:value1,key2:value2}:指定具体的字典键值对,键值对之间以逗号分隔,最后用大括号括起来
8-5-2.修改字典
字典可以被修改,但都是针对键和值同时操作的,对字典的修改包括添加、替换和删除使用字典的pop(key)方法删除键值对,返回删除的值
8-5-3.访问字典视图
我们可以通过字典中的三种方法访问字典视图
items():返回字典的所有键值对视图,keys()返回字典键视图
values():返回字典值视图
9.字符串
在python中,字符串(str)是一种不可变的字符序列
9-1.字符串的表示方式
字符串有三种表示方式:普通字符串、原始字符串和长字符串
9-1-1.普通字符串
普通字符串指用单引号或双引号括起来的字符串
9-1-2.原始字符串
原始字符串中的特殊字符不需要被转义,按照字符串的本来样子呈现,在普通字符串前加r就是原始字符串了
9-1-3.长字符串
如果要使用字符串表示一篇文章,其中包含了换行、缩进等排版字符,则可以使用长字符串表示,对于长字符串,要使用三个单引号或三个双引号括起来
9-2.字符串与数字的相互转换
在python中,它们是不兼容的两种数据类型不能进行隐式转换,只能通过函数进行显式转换
9-2-1.将字符串转换为数字
将字符串转换为数字,可以使用int()和float()实现,如果成功则返回数字,否则引发异常
注意:带有小数点的字符串数字无法转换成整数,在默认情况下,int函数都将字符串参数当作十进制数字进行转换,所以int(‘ab’)会失败。int()函数也可以指定基数(进制)
9-2-2.将数字转换为字符串
将数字转换为字符串,可以使用str()函数,str()函数可以将很多类型的数据都转换为字符串
9-3.格式化字符串
使用format()方法,它不仅可以实现字符串的拼接,还可以格式化字符串,例如在计算的金额需要保留小数点后四位、数字需要右对齐等时,可以使用该方法
9-3-1.使用占位符
要想将表达式的计算结果插入字符串中,则需要用到占位符,对于占位符,使用一对大括号({})表示
9-3-2.格式化控制符
在占位符中还可以有格式化控制符,对字符串的格式进行更加精准的控制。
字符串的格式化控制符及其说明如下表所示
格式化控制符位于占位符索引或占位符名字的后面,之间用冒号分隔,语法:{参数序号:格式控制符}或:{参数名:格式控制符}
格式控制符 | 说明 |
---|---|
s | 字符串 |
d | 十进制整数 |
f、F | 十进制浮点数 |
g、G | 十进制整数或浮点数 |
e、E | 科学计算法表示浮点数 |
o | 八进制整数,符号是小英文字母o |
x、X | 十六进制整数,x是小写表示,X |
是大写表示 |
注:参数序号与:之间不能有空格
9-4.操作字符串
9-4-1.字符串查找
字符串的find()方法用于查找子字符串,该方法的语法为str.find(sub[,start[,end]),表示:在索引start到end之间查找子字符串sub,如果找到,则返回最左端位置的索引;如果没有找到,则返回-1
在python文档中[]表示可以省略部分内容,find方法的参数[,start[,end]]表示start和end都可以省略
9-4-2.字符串替换
若想进行字符串替换,则可以使用replace()方法替换匹配的子字符串,返回值是替换之后的字符串。该方法的语法为str.replace(old,new[,count]),表示用new子字符串替换old子字符串。count参数指定了替换old子字符串的个数,如果count被省略,则替换所有的old子字符串
9-4-3.字符串分隔
若想进行字符串分隔,则可以使用split()方法,按照子字符串来分隔字符串,返回字符串对象,该方法的语法为str.split(sep=none
,maxsplit=-1),表示:使用sep子字符串分隔字符串str,maxsplit是最大分隔次数,如果massplit被省略,则表示不限制分隔次数
10.函数
函数具有函数名、参数和返回值。python中的函数很灵活:可以在模块中但是类之外定义,作用域是当前模块,我们称之为函数;也可以在别的函数中定义,我们称之为嵌套函数;还可以在类中定义,我们称之为方法
10-1.定义函数
自定义函数的语法格式如下:
def 函数名 (形式参数列表):
缩进(在python编程规范中推荐使用4个半角空格)函数体
return 返回值
什么是形式参数?
由于定义函数时的参数不是实际数据,会在调用函数时传递给它们实际数据,所以我们称定义函数时的参数为形式参数,简称形参;称调用函数时传递的实际数据为实际参数,简称实参
10-2.调用函数
10-2-1使用位置参数调用函数
在调用函数时传递的实参与定义函数时的形参位置顺序一致,这是调用函数的基本形式
10-2-2.使用关键字参数调用函数
在调用函数时可以采用‘关键字=实参’的形式,其中关键字的名字就是定义函数时形参的名称
10-3.参数的默认值
例 def make_coffee(name='卡布奇诺'):
return ‘制作一杯咖啡’.format(name)
10-4.可变参数
在使用格式化字符串的format()方法时,有时可以传递1个参数,有时可以传递3个参数,这是因为python中的函数可以定义接收不确定数量的参数,这种参数被称为可变参数。可变参数有两种,即在参数前加或*
10-4-1.基于元组的可变参数(*可变参数)
*可变参数在函数中被组装成一个元组
例:def sum(*numbers):
total =0.0
for number in numbers:
total+=number
return total
sum(1.0,2.0,4.0)
10-4-2.基于字典的可变参数(**可变参数)
**可变参数在函数中被组装成一个字典
例:def show_info(**info):
for key,value in info.items
print('{0}-{1}'.format(key,value))
show_info(name='tonmy',age=18,sex=true)
10-5.函数中变量的作用域
变量可以在模块中创建,作用域(变量的有效范围)是整个模块,被称为全局变量,变量也可以在函数中创建,在默认情况下作用域是整个函数,被称为局部变量
10-6.函数类型
python中的任意一个函数都有数据类型,这种数据类型是function,被称为函数类型
10-6-1.理解函数类型
函数类型的数据与其他类型的数据是一样的,任意类型的数据都可以作为函数返回值使用,还可以作为函数参数使用。因此,一个函数可以作为另一个函数返回值使用,也可以作为另一个函数参数使用
10-6-2.过滤函数filter()
在python中定义了一些用于数据处理的函数,如filter()和map()等
filter()函数用于对容器中的元素进行过滤处理
filter()函数的语法如下:filter(function,iterable)
参数function是一个提供过滤条件的函数,返回布尔值
参数iterable是容器类型的数据
注意:filter()
函数的返回值并不是一个列表,如果需要返回列表类型的数据,则还需要通过list()函数进行转换
10-6-3.映射函数map()
map()函数用于对容器中的元素进行映射(或变换)
map()函数的语法如下:map(function,iterable)
参数function是一个提供变换规则的函数,返回变换之后的元素。
参数iterable是容器类型的数据。
10-7.lambda()函数
在python中使用lamnda关键字定义匿名函数,lambda关键字定义的函数也被称为lambda()函数,定义lambda()函数的语法如下:
lambda 参数列表(注:不需要用小括号括括起来):lambda体
注意:lambda体部分不能是一个代码块,不能包含多条语句,只有一条语句,不需要使用return语句返回
11.类与对象
11-1.面向对象
类和对象都是面向对象中的重要概念。面向对象是一种编程思想,即按照真实世界的思维构造软件系统
11-2.定义类
python中的数据类型都是类,我们可以自定义类,即创新一种新的数据类型,定义语法格式为:
class 类名(父类):
缩进(在python编程规范中推荐使用4个半角空格)类体
pass
父类可以省略声明,表示直接继承object类
代码中的pass语句有什么作用?
pass语句只用于维持程序结构的完整。我们在编程时若不想马上编写某些代码,又不想有语法错误,就可以使用pass语句占位
11-3.创建对象
类相当于一个模板,依据这样的模板来创建对象,就是类的实例化,所以对象也被称为实例
在c++中销毁对象需要程序员手动释放对象,而在python中销毁对象时由python垃圾回收器在后台释放对象,不需要手动
11-4.类的成员
成员变量也被称为数据成员,保存了类或对象的数据
构造方法是一种特殊的函数,用于初始化类的成员变量
属性是对类进行封装而提供的特殊方法
实例变量和实例方法与类变量和类方法有什么区别?
实例变量和实例方法属于对象,通过对象调用,而类变量和类方法属于类,通过类调用
11-4-1.实例变量
实例变量就是对象个体特有的数据
11-4-2.构造方法
__init__()是构造方法,构造方法用来初始化变量,在定义__init__()方法时,它的第一个参数应该是self,之后的参数用来初始化实例变量,调用构造方法时不需要传入self参数
类中的self表示当前对象,构造方法中的self参数说明这个方法属于实例,self。age中的self表示age属于实例,即实例成员变量
11-4-3.实例方法
实例方法与实例变量一样,都是某个实例(或对象)个体特有的方法
11-4-4.类变量
类变量是属于类的变量,不属于单个对象
11-4.5.类方法
类方法与类变量类似,属于类不属于个体实例,在定义类方法时,它的第1个参数不是self,而是类本身
class Account:
interest_rate=0.0668
#类方法
@classmethod
def interest_by(cls,amt):
return cls.interest_rate*amt
cls代表类自身,即Account类,cls可以直接使用Account替换,所以cls。interest_rateamt可以改为Account.interest_rateamt
注:类方法可以访问类变量和其他类方法,但不能访问其他实例方法和实例变量
11-5.封装性
封装性是面向对象重要的基本特性之一。封装隐藏了对象的内部细节,只保留有限的对外接口,外部调用者不用关心对象的内部细节,使得操作对象变得简单
11-5-1.私有变量
为了防止外部调用者随意存取类的内部数据(成员变量),内部数据(成员变量)会被封装为私有变量,外部调用者只能通过方法调用私有变量
在默认情况下,python中的变量是公有的,可以在类的外部访问它们,如果想让它们成为私有变量,则在变量前加上双下划线(__)即可
私有变量只能在类的内部调用,外部调用会报错
11-5-2.私有方法
私有方法与私有变量的封装是类似的,在方法前加上双下划线(__)就是私有方法了
11-5-3.使用属性
为了实现对象的封装,在一个类中不应该有公有的成员变量。这些成员变量应该被设计为私有,然后通过公有的set(赋值)和get(取值)方法访问
当外部调用通过两个公有方法访问被封装的私有成员变量时,会比较麻烦,我们可以在类中定义属性,属性可以替代get()和set()这两个公有方法
示例如下:
class Dog:
#构造方法
def __init__(self,name,age,sex='雌性'):
self.name=name
self.__age = age
#实例方法
def run(self):
print('{}在跑....'.format(self.name))
#定义age属性的get方法,使用@property装饰器进行修饰,方法名就是属性名,即age
@property
def age(self):
return self.__age
#定义age属性的set方法,使用@age.setter装饰器进行修饰,age是属性名
@age.setter
def age(self,age):
self.__age=age
可以通过属性赋值,访问形式为实例.属性
11-6.继承性
继承性也是面向对象重要的基本特性之一
11-6-1python中的继承
在python中声明子类继承父类,语法很简单,定义类时在类的后面使用一对小括号指定它的父类就可以了
子类继承父类时,会把父类的公有的成员变量和方法才可以被继承
11-6-2.多继承
从面向对象的继承性理论上讲,一个子类可以有多个父类,但是,如果在多个父类中有相同的方法,那么子类应该继承哪一个父类方法?这样会发生冲突,所以很多计算机语言都不支持多继承,但python支持
在python中,当子类继承多个父类时,如果在多个父类中有相同的成员方法或成员变量,则子类优先继承左边父类中的成员方法或成员变量,从左到右继承级别从高到低
11-6-3.方法重写
如果子类的方法名与父类的方法名相同,则在这种情况下,子类的方法会重写(Override)父类的同名方法
11-7.多态性
多态性也是面向对象重要的基本特性之一,多态指对象可以表现出多种1形态
11-7-1.继承与多态
在多个子类继承父类,并重写父类方法后,这些子类所创建的对象之间就是多态的,这些对象采用不同的方法实现父类方法
11-7-2.鸭子类型测试与多态
python的多态性更加灵活,支持鸭子类型测试,鸭子类型测试指:若看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟可以被称为鸭子
12.异常处理
为了增强程序的健壮性,我们也需要考虑异常处理方面的内容,例如,在读取文件时需要考虑文件不存在、文件格式不正确等异常情况
12-1.第一个异常-除零异常
在数学中,任何整数都不能除以0,如果在计算机程序中将整数除以0,则会引发异常
程序运行出错的时候会有Traceback信息,Traceback信息是异常堆栈信息,描述了程序运行的过程及引发异常的信息
在python中,异常类命名的主要后缀有EXception、Error和W arning,也有少数几个没有采用这几个后缀命名
12-2.捕获异常
我们不能防止用户输入0,但在出现异常后我们能捕获并处理异常,不至于让程序发生终止并退出
12-2-1.try-except语句
异常捕获是通过try-except语句实现的,基本的try-except语句的语法如下
在try代码块中包含在执行过程中可能引发异常的语句,如果没有发生异常,则跳到except代码块执行,这就是异常捕获
try-except语句的执行流程如下
try:
可能会引发异常的语句
except[异常类型]
处理异常
在except语句中如果不指定具体的异常数据类型,则except语句可以捕获在try中发生的所有异常,如果指定异常类型,则except语句只能捕获在try中发生的指定类型的异常
12-2-2.多个except代码块
多条语句可能会引发多种不同的异常,对每一种异常都会采用不同的处理方式,针对这种情况,我们可以在一个try后面跟多个except代码块
12-2-3.多重异常捕获
如果多个except代码块的异常处理过程类似,则可以合并处理,这就是多重异常捕获
except(异常类型1,异常类型2) as e:
12-2-4.try-except语句嵌套
try:
i2=int(i)
try:
result = n/12
except ZerDivisionError as el:
print(1111)
except ValueError as e2:
print(1111)
12-3.使用finally代码释放资源
有时在try-except语句中会占用一些资源,例如打开的文件、网络连接,打开的数据库及数据结果集等都会占用计算机资源,需要程序员释放这些资源,为了确保这些资源能够释放,可以使用finally代码块
在try-execpt语句后面还可以跟一个finally代码块,语法如下
try:
可能会引发异常的语句
execpt 异常类型1:
处理异常
execpt 异常类型2:
处理异常
finally:
释放资源
12-4.自定义异常类
实现自定义异常类的示例代码如下:
class ZjieketangExecption(Execption):
def __init__(self,message):
super().__init__(message)
12-5.手动引发异常
系统的异常由解释器引发,而自定义异常类我们可以通raise语句手动引发异常
示例:
try:
result= n/int(i)
execpt ZeroDivisionError as e:
raise ZhijieketangException('不能除以0')
13.常用的内置模块
13-1.数学计算模块math
在math模块中包含数学运算相关的函数等,例如指数、对数、平方根和三角函数等
math.pi数学常量π
math函数
函数 | 说明 |
---|---|
ceil | 返回大于或等于x的最小整数 |
floor | 返回小于或等于x的最小整数 |
sqrt | 返回x的平方根 |
pow(x,y) | 返回x的y次幂的值 |
math.log(x,[,base]) | 返回以base为底的x对数,若省略底数base,则计算x自然对数 |
sin | 返回弧度x的三角正弦 |
degrees | 将弧度转换为角度 |
radians | 将角度转换为弧度 |
ceil | 返回大于或等于x的最小整数 |
13-2.日期时间模块datetime
python官方提供的日期和时间模块主要是datetime模块,在datetime模块中提供了右侧几个类
datetetime:包含时间和日期
date:只包含日期
time:只包含时间
timedelta:计算时间跨度
tzinfo:时区信息
13-2-1.datetime类
datetime类表示日期和时间等信息,我们可以使用如下构造方法创建datetime对象
datetime.datetime(year,month,day,hout=0,minute=0,second=0,microsecond=0,tzinfo=None)
datetime的参数说明如下
参数 | 说明 | 取值范围 |
---|---|---|
year | 年不可省略 | datetime.MINYEAR>=year<=datetime.MAXYEAR |
month | 月不可省略 | 1>=month<=12 |
day | 日不可省略 | 1>=day<=给定年份和月份,这时该月的最大天数 |
hour | 小时可以省略 | 0>=hour<=24 |
minute | 分钟可以省略 | 0>=year<=60 |
second | 秒可以省略 | 0>=year<=60 |
microsecond | 微秒可以省略 | 0>=year<=1000000 |
tzinfo | 时区 | 无 |
datetime类的常用方法如下
datetime.today():返回当地的本地日期和时间
datetime.now(tz=none):返回指定时区的当前日期和时间,参数tz用于设置时区,如果参数tz为None或省略,则等同于today()
datetime.fromtimestamp(timestamp,tz=None):返回UNIX时间戳对应的本地日期和时间。UNIX时间戳是从1970年1月1日00:00:00开始到现在为止的总秒数。
注:在python中,时间戳的单位是秒
13-2-2.date类
date类表示日期信息,我们可以使用如下构造方法创建date对象
datetime.date(year,month,day)
date类的常用方法如下
date.today():返回当前的本地日期
date.fromtimestamp(timestamp):返回与UNIX时间戳对应的本地日期
13-2-3.time类
time类表示一天中的时间信息,我们可以使用如下构造方法创建time对象
datetime.time(hour=0,minute=0,second=0,microsecond=0,tzinfo=None)
13-2-4.timedelta类计算时间跨度类
如果我想知道10天之后是哪一天·,还想知道2020年1月1日前5周是哪一天,在python中可以使用timedelta类,timedelta类用于计算datetime、date和time对象的时间间隔
timedelta类的构造方法如下:
datetime.timedelta(days=0,seconds=0,microseconds=0,milliseconds=0,minutes=0,hours=0,weeks=0)
其中的所有参数都可以为整数或浮点数,也可以为正数或负数
13-2-5.将日期时间与字符串相互转换
在python中使用strftime()方法进行日期时间的格式化,在datetime、date和time三个类中都有一个实例方法strftimr(format)
将字符串转换成日期时间对象的过程,叫做日期时间解析,在python中使用datetime.strptime(date_string,format)类方法进行日期时间解析
在strftime()和strptime()方法中都有一个格式化参数format,用例控制日期时间的格式,常用的日期和时间格式控制符如下表所示
指令 | 含义 | 示例 |
---|---|---|
%m | 两位月份表示 | 01、02、12 |
%y | 两位年份表示 | 08、18 |
%Y | 四位年份表示 | 2008、2018 |
%d | 两位表示月中的一天 | 01、02、03 |
%H | 两位小时表示(24小时制) | 01、01、23 |
%l | 两位小时表示(12小时制) | 01、01、12 |
%p | AM或PM区域性表示 | AM和PM |
%M | 两位分钟表示 | 00、01、59 |
%S | 两位秒表示 | 00、01、59 |
%f | 以6位数表示微秒 | 000000、000001、999999 |
%z | +HHMM或-HHMM的UTC偏移 | +0000、-0400、+1030,如果没有设置时区,则为空 |
%Z | 时区名称 | UTC、EST、CST,如果没有设置时区,则为空 |
注:在将一个字符串解析为时间对象是,需要注意:提供的字符串应该可以表示一个有效的日期时间字符串,否则会发生ValueError异常
13-3.正则表达式模块-re
正则表达式指预先定义好一个字符串模板,通过这个字符串模板可以匹配、查找和替换那些匹配字符串模板的字符串
正则表达式实现的字符串查找和替换与字符串方法实现的查找和替换有什么区别?
正则表达式实现的字符串操作效率更高、功能更强大
正则表达式的难点是编写字符串模板,即正则表达式,几乎所有编程语言的正则表达式都是通用的,python中的正则表达式模块是re
13-3-1.字符串匹配
字符串匹配指验证一个字符串是否符合指定的字符串模板,常用于用户输入验证
我们使用match(p,text)函数进行字符串匹配,其中参数p是正则表达式,即字符串模板,text是要验证的字符串,如果匹配成功,则返回一个Match(匹配对象),否则返回None、
13-3-2.字符串查找
字符串查找指从一个字符串中查找匹配正则表达式的子字符串,
常用的字符串查找函数如下:
search(p,text):在text字符串中查找匹配的内容,如果找到,则
返回第1个匹配的Match对象,否则返回None。p是正则表达式。
findall(p,text):在text字符串中查找所有匹配的内容,如果找到
,则返回所有匹配的字符串列表;如果一个都没有匹配,则返回None。
p是正则表达式
13-3-3.字符串替换
正则表达式的字符串替换函数是sub(),该函数替换匹配的子字
符串,返回值是替换之后的字符串,其语法格式如下:
re.sub(pattern,repl,string,count=0)
参数pattern是正则表达式;参数repl是用于替换的新字符串
;参数string是即将被替换的旧字符串;参数count是要替换的最大数量
,默认值为零,表示不限制替换数量
13-3-4.字符串替换
在Python中使用re模块中的split()函数进行字符串分割,该函数
按照匹配的子字符串进行字符串分割,返回字符串列表对象,其语法格
式如下
re.split(pattern,string,maxsplit=0)
其中,参数pattern是正则表达式;参数string是要分割的字符串;参
数maxsplit是最大分割次数;maxsplit的默认值为零,表示分割次数没有
限制。
14.文件读写
文件是数据的载体,程序可以从文件中读取数据,也可以将数据写入文件中
文本文件和二进制文件的区别是什么,在文本文件的内部以字符形式存储数据,字符有编码的,例如GBK(简体中文)、utf-8等,在二进制文件的内部以字节形式存储数据,没有编码的概念。二进制文件比较常用,例如windows中的exe、图片(jpg、png),以及word、excel和ppt等文件
14-1.打开文件
我们在使用文件之前要先将文件打开,这通过open()函数实现。open()函数的语法如下:
open(file,mode=‘r’,encoding=None,errors=None)
file参数:file参数用于表示要打开的文件,可以是字符串或整数,如果file是字符串,则表示文件名,文件名即可以是当前目录的相对路径,也可以是绝对路径;如果file是整数,则表示一个已经打开的文件
mode参数:mode参数用于设置文件打开模式,用字符串表示,例如rb表示以只读模式打开二进制文件,用于设置文件打开模式的字符串的每一个字符都表示不同的含义,对这些字符的具体说明如下
t:以文本文件模式打开文件
b:以二进制文件模式打开文件
r:以只读模式打开文件
w:以只写模式打开文件,不能读内容,如果文件不存在。则创建文件,如果文件存在,则覆盖文件的内容
x:以独占创建模式打开文件,如果文件不存在,则创建并以写入模式打开;如果文件已存在,则引发FileExistsError异常
a:以追加模式打开文件,不能读内容。如果文件不存在,则创建文件,如果文件存在,则在文件末尾追加
+:以更新(读写)模式打开文件,必须与r、w或a组合使用,才能设置文件为读写模式
字符串 | 说明 |
---|---|
rt或r | 以只读模式打开文本文件 |
wt或w | 以只写模式打开文本文件 |
xt或x | 以独占创建模式打开文本文件 |
at或a | 以追加模式打开文本文件 |
rb | 二进制文件模式,类似于rt |
wb | 二进制文件模式,类似于wt |
xb | 二进制文件模式,类似于xt |
xb | 二进制文件模式,类似于xt |
ab | 二进制文件模式,类似于at |
r+ | 以读写模式打开文本文件,如果文件不存在,则抛出异常 |
w+ | 以读写模式打开文本文件,如果文件不存在,则创建文件 |
a+ | 以读追加文本文件模式打开文本文件,如果文件不存在,则创建文件 |
rb+ | 二进制文件模式,类似于r+ |
wb+ | 二进制文件模式,类似于w+ |
ab+ | 二进制文件模式,类似于a+ |
encoding参数
encoding用来指定打开文件是的文件编码。默认是UTF-8
编码,主要用于打开文本文件
errors参数
errors参数用来指定在文本文件发生编码错误时如何处理,推荐errors参数的取值为ignore,表示在遇到编码错误时忽略该错误,程序会继续执行,不会退出
14-2.关闭文件
在打开文件后,如果不再使用该文件,则应该将其关闭,会用到close()方法
14-2-1.在finallky代码块中关闭文件
对文件的操作往往会抛出异常,为了保证对文件的操作无论是正常结束还是异常结束,都能够关闭文件,我们应该将对close()方法的调用放在异常处理的finally代码块中
14-2-2.在with as代码块中关闭文件
python提供了一个with as代码块,可帮助我们自动释放资源(包括关闭文件的操作),它可以替代finally代码块,优化代码结构,提高其可读性
14-3.读写文本文件
读写文本文件的相关方法如下
read(size=-1):从文件中读取字符串,size限制读取的字符数,size=-1指对读取的字符数没有限制
readline(size=-1):在读取到换行符或文件尾时返回单行字符串,如果已经到文件尾,则返回一个空字符串,size是限制读取的字符数,size=-1表示没有限制
readlines():读取文件数据到一个字符串列表中,每一行数据都是列表的一个元素
write(s):将字符串s写入文件中,并返回写入的字符数
writelines(lines):向文件中写入一个字符串列表,不添加行分隔符,因此通常为每一行末尾都提供分隔符
flush():刷新写缓冲区,在文件没有关闭的情况下将数据写入文件中
14-4.读写二进制文件
二进制文件的读写单位是字节,二进制文件的主要读写方法如下
read(size=-1):从文件中读取字节。size限制读取的字节数,如果size=-1,则读取全部字节
readline(size=-1):从文件中读取并返回一行,size是限制读取的行数,如果size=-1,则没有限制
readlines():读取文件数据到一个字节列表中,每一行数据都是列表的一个元素
write():写入b字节,并返回写入的字节数
writelines():向文件写入一个字节列表,不添加行分隔符,因此通常为每一行末尾都提供行分隔符
flush():刷新写缓冲区,在文件没有关闭的情况下将数据写入文件中
15.图形用户界面
15-1.python中的图形用户界面开发库
pythpn中的图形用户界面开发库有很多,较为突出的有:tkinter、pyQt和wxPython
了解页面构成
常见的GUI界面包括五个部分,主界面(main window),菜单界面(menu),按键(button),标签(labels),文本输入(text entry)
在wxpython中,为了更好的实现GUI编写,封装了多个类,常用的的除了有wxFrame()对应主界面、wx.MenuBar()对应菜单类、wx.StaticText()对应label、wx.TextCtrl()对应text entry、wx.lib.plot.PlotCanvas(对应画布)
注: Qt是一个跨平台的c++应用程序开发框架,被广泛用于开发GUI程序,也可用于开发非GUI程序
Tkinter是python官方提供的图形用户界面开发库,用于封装TkGUI工具包,跨平台。但是,Tkinter工具包所包含的控件较少,帮助文档不健全,不便于我们开发复杂的图形用户界面
PyQt是非python官方提供的图形用户界面开发库,用于封装Qt工具包,跨平台。若想使用pyQt工具包,则需要额外安装软件包
wxPython是非python官方提供的图形用户界面开发库,也跨平台,它提供了丰富的控件,可用于开发复杂的图形用户界面
我们使用python的pip指令进行安装,pip是python提供的包(库)管理工具·,可以对第三方库进行安装、卸载等操作
实现效果:
什么是主事件循环?
事件循环是一种事件或消息分发处理机制,大部分图形用户界面在界面中的显示及响应用户事件的处理都是通过主事件循环实现的
在运行python文件时会输出libpng warning iCCP:known incorrect sGRB profile信息,这是什么意思
因为wxPython加载图片时使用了libpng工具,所以如果png图片非格式比较老,libpng工具就会发出警告,这个警告对我们没有影响
注libpng是一款用c语言编写的比较底层的读写png的库,跨平台
15-2.自定义窗口类
实现效果:
self.SetTopWindow设置窗体属性
控件是否可以直接放在窗口中?
可以,但直接把控件放到窗口中在布局时会有很多问题,推荐将所有控件都放在面板中,再将面板放到窗口中
15-2-1.菜单栏MenuBar
self.CreateStatusBar()#创建位于窗口底部的状态栏
#self.SetStatusText("Welcome to wxPython!")设置状态栏信息
#设置菜单
wx.Menu()
#filemenu.Append(1, "&About...") 添加“About”
#wx.ID_ABOUT和wx.ID_EXIT是wxWidgets提供的标准ID
filemenu.Append(wx.ID_ABOUT, u"关于", u"关于程序的信息")
filemenu.AppendSeparator()#添加分割线
filemenu.Append(wx.ID_EXIT, u"退出", u"终止应用程序")
#创建菜单栏
menuBar=wx.MenuBar()
menuBar.Append(filemenu, u"文件")
self.SetMenuBar(menuBar)
实现效果
15-3.事件处理
图形界面的控件要响应用户的操作,就必须添加事件处理机制
其中涉及的主要内容如下
事件源:事件发生的场所,就是各个控件
事件:wxpython中的事件被封装为事件类wx.Event及其子类
事件处理程序:一个响应用户事件的方法
实现效果:
事件 | 描述 |
---|---|
wxKeyEvent | 按下或释放按键 |
wxPaintEvent | 每当窗口内容需要重绘时生成 |
wxMouseEvent | 包含有关鼠标活动(如按下或拖动鼠标按钮)导致的任何事件的数据 |
wxScrollEvent | 与可滚动控件相关联,如wxScrollbar或wxSlider |
wxCommandEvent | 包含源自许多小部件的事件数据,如按钮,对话框,剪贴板等 |
wxMenuEvent | 不同的菜单相关事件,不包括菜单命令按钮单击 |
wxColourPickerEvent | wxColourPickerCtrl生成的事件 |
wxDirFilePickerEvent | FileDialog和DirDialog生成的事件 |
15-4.布局管理
之前的案例中我们使用的控件的位置和大小都使用了绝对数值,这些控件不会随着父窗口的移动或大小变化,这种控件的位置和大小都使用了绝对数值的叫做绝对布局,绝对布局有很多问题,在进行界面布局时尽量不要采用绝对布局
wxPython提供了布局管理器类帮助实现界面布局,主要分为两大类:盒子布局管理器和网格布局管理器,盒子布局类似于css中的弹性布局
15-4-1.盒子布局管理器
盒子布局管理器是wx.BoxSizer,Box布局管理器是最常用的布局管理器,它可以让其中的子窗口或控件沿垂直或水平方向布局
(1)创建盒子布局管理器对象
设置为水平方向布局wx.BoxSizer(wx.HORIZONTAL)
wx.HORIZONTAL是默认值可以省略
设置为垂直方向布局wx.BoxSizer(wx.VERTICAL)
(2)添加子窗口(或控件)到父窗口
我们使用wx.BoxSizer对象的Add()方法添加到父窗口,语法如下:
Add(window,proportion=0,flag=0,border=0)
proportion参数用于设置当前子窗口(或控件)在父窗口中所占的空间比例:flag参数是布局标志,用来控制对齐方式、边框和尺寸,borde用来设置边框的宽度
flag对齐标志如下表所示
标志 | 说明 |
---|---|
wx.ALIGN_TOP | 顶对齐 |
wx.ALIGN_BOTTOM | 底对齐 |
wx.ALIGN_LEFT | 左对齐 |
wx.ALIGN_RIGHT | 右对齐 |
wx.ALIGN_CENTER | 居中对齐 |
wx.ALIGN_CENTER_VERTICAL | 垂直居中对齐 |
wx.ALIGN_CENTER_HORIZONTAL | 水平居中对齐 |
wx.ALIGN_CENTRE | 同wx.ALIGN_CENTER |
wx.ALIGN_CENTRE_VERTICAL | 同wx.ALIGN_CENTER_VERTICAL |
wx.ALIGN_CENTRE_HORIZONTAL | 同wx.ALIGN_CENTER_HORIZONTAL |
flag边框标志如下表所示
标志 | 说明 |
---|---|
wx.TOP | 设置有顶部边框,边框的宽度需要border参数设置 |
wx.BOTTOM | 设置有底部边框 |
wx.LEFT | 设置有左边框 |
wx.RIGHT | 设置有右边框 |
wx.ALL | 设置4面全有边框 |
flag调整尺寸标志如下表所示
标志 | 说明 |
---|---|
wx.EXPAND | 调整子窗口(或控件)完全填满有效空间 |
wx.SHAPED | 调整子窗口(或控件)完全填满有效空间,但保存高宽比 |
wx.FIXED_MINSIZE | 调整子窗口(或控件)为最小尺寸 |
wx.RESERVE_SPACE_EVEN_IF_HIDDEN | 设置此标志后,子窗口(或控件)如果被隐藏,则所占空间保留 |
wx.GridSizer(rows, columns, vgap, hgap)网格布局
方法 | 说明 |
---|---|
Add | 在下一个可用的网格槽中添加一个控件 |
AddMany | 添加控件列表中的每个项目 |
SetRows | 设置sizer中的行数 |
GetRows | 检索sizer中的行数 |
SetCols | 设置sizer中的列数 |
GetCols | 检索sizer中的列数 |
SetVGap | 设置单元格之间的垂直间隙,以像素为单位 |
GetVGap | 返回单元格之间的vgap值 |
SetHGap | 设置单元格之间的水平间隙,以像素为单位 |
GetHGap | 返回单元格之间的hgap值 |
wx.FlexGridSizer
该分级器还具有二维网格。 然而,它在细胞中布置对照物时提供了更多的灵活性。(网格布局)
wx.FlexGridSizer(rows=1,cols=0,vgap=0,hgap=0)
参数:rows定义GridSizer行数
cols定义GridSIzer列数
vgap定义垂直方向上行间距
hgap定义水平方向上列间距
FlexGridSizer的常用函数
AddGrowableCol(idx,proportion=0)设定索引为idx的列为可增长列
AddGrowableRow(idx,proportion=0)设定索引为idx的行为可增长行
参数proportion=0为默认,表示所有的可增长行或列按照同比例缩放
Wx.GridBagSizer(网格布局)
Wx.GridbagSizer().Add(control, pos, span, flags, border)
GridBagsizer类最重要的方法是Add(),它将position作为必需参数。 跨度,对齐,边框标志和边框大小参数是可选的。 如果没有明确使用,则它们采用默认值。
方法 | 说明 |
---|---|
Add | 在网格中的指定位置添加给定控件 |
GetItemPosition | 返回网格中控件的位置 |
SetItemPosition | 将控件放在网格中的指定位置 |
GetItemSpan | 返回项的行/列跨越 |
SetItemSpan | 跨行/列数跨越指定的项目 |
StaticBoxSizer
StaticBoxSizer将box sizer放入静态框中。 它提供了盒子周围的边框以及顶部的标签。 以下步骤涉及准备statcboxsizer -
创建一个wx.StaticBox对象。
使用上面的静态框作为参数声明一个wx.StaticBoxSizer。
创建控件并添加staticbox sizer。
将其设置为框架的sizer。
15-4.控件
15-4-1.文本输入控件
wx.TextCtrl是可以输入文本的控件
样式参数
参数 | 描述 |
---|---|
wx.TE_MULTILINE | 文本控件允许多行 |
wx.TE_PASSWORD | 文本以星号显示 |
wx.TE_READONLY | 文本用户不可编辑 |
wxTE_LEFT | 文本左对齐 |
wxTE_CENTER | 文本居中 |
wxTE_RIGHT | 文本右对齐 |
方法 | 描述 |
---|---|
AppendText | 将文本添加到文本控件的末尾 |
Clear | 清除 |
GetValue | 返回内容 |
Replace | 替换全部或部分文本 |
SetEditable | 使文本框可编辑或已读 |
SetMaxLength | 最大字符数 |
SetValue | 设置内容 |
IsMultiLine | 如果设置为TE_MULTILINE,则返回true |
SetValue()设置input初始值
实现效果:
15-4-2.复选框和单选按钮
多选控件是复选框(wx.CheckBox),复选框(wx.CheckBox)有时也能单独使用,能提供两种状态的开和关
wx.CheckBox(parent,id,label,pos,size,size,style)
style有以下参数值:
wx.CHK_2STATE创建两个状态复选框
wx.CHK_3STATE创建三个状态复选框
wx.ALIGN_RIGHT在复选框左侧放置一个框标签
这个类有两个重要的方法GetState()返回true或false,具体 取决于是否选中了复选框,SetValue()用于以编程方式选择复选框
wx.CHECKBOX是唯一可用的事件绑定器,每次选中或取消框架上的任何复选框时,都会调用关联的事件处理程序
单选控件是单选按钮(wx.RadioBotton),同一组的多个单选按钮应该具有互斥性
wx.RadioButton(parent,id,label,pos,size,style)
wx.RadioBox(parent,id,label,pos,size,choices[],initialimensions,style)
方法 | 描述 |
---|---|
GetSelection | 返回所选项的索引 |
SetSelection | 以编程方式选择项目 |
GetString | 返回所选项的标签 |
SetString | 设置所选项目的标签 |
Show | 显示或隐藏项目 |
15-4-3.列表
列表控件可以实现单选或多选,列表控件类是wx.ListBox
参数 | 描述 |
---|---|
wxLB_SINGLE | 单选名单 |
wxLB_MULTIPLE | 多选列表:用户可以打开和关闭多个项目 |
wxLB_EXTENOED | 扩展选择列表-用户可以通过使用SUIFT或CTRL键及光标移动或鼠标来扩展选择 |
wxLB_HSCROLL | 如果内容太宽,则创建水平滚动条 |
wxLB_ALWAYS_SB | 始终显示垂直滚动条 |
wxLB_NEEDED_SB | 需要时创建垂直滚动条 |
wxLB_SORT | 列表框内容按字母顺序排序 |
方法 | 描述 |
---|---|
DeSelect | 取消选择列表框中的项目 |
InsertItem | 指定位置插入给定字符串 |
SetFirstItem | 将给定索引处的字符串设置为列表中的第一个 |
IsSorted | 如果使用wxLB_SORT样式,则返回true |
GetString | 返回所选索引处的字符串 |
SetString | 为给定索引处的项目设置标签 |
15-4-4.静态图片控件
静态图片控件用于显示一张图片,图片可以是wx.Python所支持的任意图片格式,静态图片控件类是wx.StaticBitmap
使用self.panelLayout语句重新设置panel面板布局,在图片替换后。需要重写绘制窗口,否则布局会方式混乱
wx.StaticBitmap(parent,id=ID_ANY,bitmap=NullBitmap,pos=DefaultPosition,size=DefaultSize,style=0,name=StaticBitmapNameStr)
15-4-5.绘图API
GDI +(图形绘制界面),CoreGraphics和Cairo libraries构成了wxPython中绘制API的框架,wx.GraphicsContent是主要的可绘制对象,使用它可以创建各种Device Content对象
wx.DC是一个抽象类。其派生类用于在不同设备上呈现图形和文本
wx.ScreenDC是用它在屏幕上绘画,而不是单个窗口
wx.ClientDC使用它在窗口的客户区域(没有边框和其他装饰的部分)上绘制,单不要在wxPaintEvent中使用它
wx.PaintDC使用它在窗口的客户区域上绘制,但only在wxPaintEvent中绘制
wx.WindowDC用它来绘制窗口的整个区域,包括装饰,这可能不适用于非windows平台
wx.Colur颜色对象表示rgb,有一些预定义的颜色对象,如:
wxBLACK
wxBLUE
wxCYAN
wxGREEN
wxYELLOW
wxLIGHT_GREY
wxRED
wxWHITE
wx.Pen笔对象确定图形形状的颜色、宽度和样式。如:
wxBLACK_DASHED_PEN
wxBLACK_PEN
wxBLUE_PEN
wxCYAN_PEN
wxGREEN_PEN
wxYELLOW_PEN
wxGREY_PEN
wxLIGHT_GREY_PEN
wxMEDIUM_GREY_PEN
wxRED_PEN
wxTRANSPARENT_PEN
wxWHITE_PEN
wx.SOLID
wx.DOT
wx.LONG_DASH
wx.SHORT_DASH
wx.DOT_DASH
wx.TRANSPARENT
wx.BRUSH画笔是填充形状背景所需的另一个基本图形对象,如矩形,椭圆,圆等
wx.SOLID
wx.STIPPLE
wx.BDIAGONAL_HATCH
wx.CROSSDIAG_HATCH
wx.FDIAGONAL_HATCH
wx.CROSS_HATCH
wx.HORIZONTAL_HATCH
wx.VERTICAL_HATCH
wx.TRANSPARENT
DrawRectangle()绘制给定尺寸的矩形
DrawCircle()在给定点绘制一个圆作为中心和半径
DrawEllipse()绘制具有给定x和y半径的椭圆
DrawLine()在两个wx.Point对象之间绘制一条线
DrawBitmap()在给定位置绘制图像
DrawText()在指定位置显示给定文本
16.网络通信
16-1.基本的网络知识
16-1-1TCP/IP
在网络通信中会用到一些相关协议,其中,TCP/IP是非常重要的协议,由IP和TCP两个协议组成,IP(internet Protocol)是一种低级的路由协议,它将数据拆分在许多小的数据包中,并通过网络将它们发送到某一特定地址,但无法保证所有包都能抵达目的地,也不能保证包按顺序抵达。
由于通过IP传输数据存在不安全性,所以还需要通过TCP(Transmission Control Protocol,传输控制协议)进行网络通信。TCP是一种高层次的协议,是面向连接的可靠数据传输协议,如果有些数据包没被收到,则会重发,对数据包的内容准确性进行检查并保证数据包按照顺序的抵达,所以,TCP能够保证数据包安全地按照发送时的顺序送达目的地
16-1-2.IP地址
为了实现网络中不同计算机之间的通信,每台计算机都必须有一个与众不同的标识,这就是IP地址,TCP/IP使用IP地址来标识源地址和目的地址
16-1-3.端口
一个IP地址标识一台计算机,每台计算机又有很多网络通信程序在运行,提供网络服务或进行通信,这就需要不同的端口进行通信,如果把IP地址比作电话号码,那么端口就是分机号码,在进行网络通信时不仅要指定IP地址,还要指定端口号
16-1-4.HTTP/HTTPS
对互联网的访问大多基于HTTP/HTTPS,HTTP/HTTPS是TCP/IP的一种协议
HTTP(Hypertext Transfer Protovol,超文本传输协议)属于应用层协议,其简捷、快速的方式适用于分布式超文本信息传输,HTTP是无连接协议,即在每一次请求时都会建立连接,服务器在处理完客户端的请求后,会先应答客户端,然后断开连接,不会一直占用网络资源
HTTP/1.1共定义了8种请求方法:OPTTIONS、HEAD、GET、POST、PUT、DELETE、TRACE和CONNECT
1).GET方法:用于向指定的资源发出请求,被发送的信息显式的跟在URL后面,它一般只用于读取数据,接触到的人都可以看到,因此是不安全的
2).POST方法:用于向指定的资源提交数据,相对get安全一些
HTTPS(Hypertext Transfer Orotocol Secure,超文本传输安全协议),是超文本传输协议和SSL的组合,用于提供加密通信及对网络服务器身份的鉴定
HTTPS与HTTP的区别是:HTTPS使用https://代替http://。HTTPS使用端口443,而HTTP使用端口80与TCP/IP通信
16-3.urllib.request模块
我们想要在python中访问互联网资源,则可以使用官方内置的urllib.request模块
16-3-1.发送get请求
如果要发送HTTP/HTTPS的get请求。则乐意使用urllib.request模块的Request对象
16-3-2.发送post请求
16-4.JSON数据
16-4-1.JSON文档的结构
构成JSON文档的两种结构:JSON对象和JSON数组
JSON对象类似于Python中的字典类型
16-4-2.JSON数据的解码
JSON数据的解码(decode)指将JSON数据转换为Python数据,当从网络中接收或从磁盘中读取JSON数据时,需要将其解码为Python数据
我们使用json模块提供的loads(str)函数进行JSON数据的解码,参数str是JSON字符串,返回Python数据
17.访问数据库
如果数据量较少,则我们可以将数据保存到文件中,如果数据量较大,则我们可以将数据保存到数据库中
17-1.SQLite数据库
SQLite数据库是嵌入式系统使用的关系数据库,目前的主流版本是SQLite3,SQLite是开源的,采用c语言编写而成,具有可移植性强,可靠性高,小而易用等特点。SQLite提供了对SQL-92标准的支持,支持多表、索引、事务、视图和触发
17-1-1.SQLite数据类型
SQLite是无数据类型的数据库,在创建表时不需要为字段指定数据类型。但从编程规范上讲,我们应该指定数据类型,因为数据类型可以表明这个字段的含义。
SQLite数据库与Oracle或MySQL等网络数据库有什么区别?
SQLite是为嵌入式设备(如智能手机等)设计的数据库。SQLite在运行时与使用它的应用程序之间共用相同的进程控件,而在运行时,Oracle或MySQL程序与使用它的应用程序在两个不同的进程中
SQLite支持的常见数据类型如下:
INTEGER:有符号的整数类型
REAL:浮点类型
TEXT:字符串类型,采用UTF-8和UTF-16字符编码
BLOB:二进制大对象类型,能够存放任意二进制数据
17-1-2.Python数据类型与SQLite数据类型的映射
在使用python访问SQLite数据库时,会经常涉及数据类型的互相转换,它们的映射关系如下表所示
python数据类型 | SQLite数据类型 |
---|---|
None | NULL |
int | INTEGER |
float | REAL |
str | TEXT |
bytes | BLOB |
17-1-3.使用GUI管理工具管理SQLite数据库
SQLite数据库是否自带GUI(图形界面)管理工具
SQLite数据库本身自带一个基于命令提示符的管理工具,使用起来很困难。如果使用GUI管理工具,则需要使用第三方工具,第三方工具有很多,例如Sqliteadmin Administrator、DB Browser for SQLite、SQLiteStudio等,DB Browser for SQLite对中文支持很好
17-2.sqlite3模块API
python官方提供了sqlite3模块来访问SQLite数据库
17-2-1.数据库连接对象Connection
数据库访问的第一步是进行数据库连接
我们可以通过connect(database)函数进行数据库连接,参数database是SQLite数据库的文件路径,如果连接成功,则返回数据库连接对象Connection
Connection对象有如下重要的方法
close():关闭数据库连接,在关闭之后再使用数据库连接将引发异常
commint():提交数据库事务
rollback():回滚数据库事务
cursor():获得CUrsor游标对象
17-2-2.游标对象Cursor
一个Cursor游标对象表示一个数据库游标,游标暂时保存了SQL操作所影响到的数据,游标是通过数据库连接创建的。
游标Cursor对象有很多方法和属性,其中的基本SQL操作方法如下
execute(sql[,parameters]):执行一条SQL语句,sql是SQL语句,parameters是为SQL提供的参数,可以是序列或字典类型。返回值是整数,表示执行SQL语句影响的行数
executemany(sql[,seq_of_params]):执行批量SQL语句,sql是SQL语句,sql_of_params是SQL提供的参数,sql_of_params是序列。返回值是整数,表示执行SQL语句影响的行数
在通过excute()和executemany()方法执行SQL查询语句后,还要通过提取方法从查询结果集中返回数据,相关提取方法如下
fetchone():从结果集中返回只有一条记录的序列,如果没有数据,则返回None。
fechmany(size-cursor.arrayszie):从结果集中返回小于等于size记录数的序列,如果没有数据,则返回空序列,size在默认情况下是整个游标的行数
fetchall():从结果集中返回所有数据
18.多线程
18-1.线程相关的知识
18-1-1.进程
一个进程就是一个正在执行的程序,每个进程都有自己独立的一块内存空间、一组系统资源。在进程的概念中,每一个进程的内部数据和状态都是完全独立的
18-1-2.线程
在一个进程中可以包含多个线程,多个线程共享一块内存空间和一组系统资源。所以,系统在各个线程之间切换时,开销要比进程小得多,正因如此,线程被称为轻量级进程
18-1-3.主线程
python程序至少有一个线程,这就是主线程,程序在启动后由python解释器负责创建主线程,在程序结束后由python解释器负责停止主线程。在多线程中,主线程负责其他线程的启动、挂起、停止等操作。其他线程被称为子线程
18-2.线程模块—threading
python官方提供的threading模块可以进行多线程编程。threading模块提供了多线程编程的高级API,在threading模块中提供了线程类Thread,还提供了很多线程相关的函数,常用的函数如下:
active_count():返回当前处于活动状态的线程个数
currect_thread():返回当前的Thread对象
main_thread():返回主线程对象
18-3.创建子线程
创建一个可执行的子线程,需要如下两个要素
线程对象:线程对象是threading模块的线程类Thread或Thread子类所创建的对象
线程体:线程体是子线程要执行的代码,这些代码会被封装到一个函数中,子线程在启动后会执行线程体,实现线程体主要有以下两种方式
1).自定义函数实现线程体
2).自定义线程类实现线程体
18-3-1.自定义函数实现线程体
创建线程Thread对象的构造方法如下:
Thread(target=None,name=None.args=())
traget参数指向线程体函数,我们可以自定义该线程体函数:通过name参数可以设置线程名,如果省略这个参数,则系统会为其分配一个名称,args是为线程体函数提供的参数,是一个元组类型
import time
#线程休眠
time.sleep(2)
在多线程编程中,要注意给每个子线程执行的机会,主要是通过让子线程休眠来让当前线程暂停执行,其他线程才有机会执行。如果子线程没有休眠,则在第一个子线程执行完毕后,再执行第二个子线程
18-3-2.自定义线程类实现线程体
另外一种实现线程体的方式是,创建一个Thread子类并重写run()方法,run()就是线程体函数
18-4.线程管理
线程管理包括线程创建、线程启动、线程休眠、等待线程结束和线程停止。
18-4-1.等待线程结束
有时,一个线程(假设是主线程)需要等待另外一个线程(假设是t1子线程)执行结束才能继续执行
join()方法的语法如下:join(timeout=None)
参数timeout用于设置超时时间,单位是秒。如果没有设置timeout,则可以一直等待,直到结束
18-4-2.线程停止
在线程体结束时,线程就停止了,但在某些业务比较复杂时,会在线程体中执行一个死循环,线程体是否持续执行死循环是通过判断停止变量实现的,死循环结束则线程体结束,线程也就结束了
另外在一般情况下,死循环会执行线程任务,然后休眠,再执行,再休眠。直到结束循环