编程≈乐高
[toc]
python3默认使用UTF-8编码,无需指定UTF-8编码
模块
代码文件的结构 Python的文件结构可以分为代码、模块、包。
模块中内置如
__name__等属性,到模块被导入到其他模块中时,__name__的值为模块本身名字;模块独立运行时,该值会变成__main__。(理解为main函数)python文件有两种使用方式,作为脚本直接执行、import到其他python脚本中被调用。
if __name__ == '__main__':之后的代码只有在第一种情况下才能运行。
模块导入方式
import a as b:将模块a导入并重命名为bfrom a import func:从模块a中导入func函数from import *:将模块中所有的名字导入到当前模块,容易造成命名冲突a = __import__("3-2 a"): 处理模块名称含有空格的问题
变量
通过var1, var2, var3 = value1, value2, value3同时为多条语句赋值
1 | a,b,c = 1,2,"john" |
变量类型
**dir( )**可查看相关函数
数值numbers、字符串string、列表list、元组tuple、集合sets、字典dictionaries
数值类型
包括
intfloatboolcomplex(复数)等类型复数类型
2+5j或complex(2,5)表示数学上的复数2+5i字符串类型
字符串:由数字、字母、下划线组成的一串字符
有两种取值顺序:从左到右索引,从0开始;从右向左索引,从-1开始;

截取字符串:使用[头下标:尾下标]来截取字符串,包含头下标,不包含尾下标
1
2
3s = 'abcdef'
s[1:5] #表示'bcde'
s[2]='C' #错误,字符串的元素不能改变字符串常用函数
1
2
3
4
5
6
7
8
9
10
11
12
13str(123) #将123转化为字符串
str=str1+str2 #字符串拼接
Count(sub[,start[,end]]) #表示sub在字符串里出现的次数,start和end表示出现次数
Endswith(sub[,start[,end]]) #检查字符串是否以sub为结束,start end可选范围;返回bool类型
Find(sub[,start[,end]]) #监测sub是否包括在字符串中,如果包括返回索引值,否则返回-1
Index(sub[,start[,end]]) #跟find一样,但是如果sub不在字符串中会产生一个异常
Replace(old,new[,count]) #将字符串中的old字符串替换成new字符串,如果count指定,则替换不超过coutn次数
split(sep=None,maxsplit=-1) #不带参数默认是以空格为分隔符切片字符串,如果maxsplit参数有设置,则仅分割maxsplit个字符串,返回切片后的子字符串拼接的结果
Captialize() #将字符串第一个字符改为大写
Lower() #转换字符串中所有大写字符为小写
Partition(sub) #找到子字符串sub,将字符串分成一个3元组(pre_sub,sub,fol_sub),如果字符串不包括sub则返回(‘原字符串’,’’,’’)列表类型(list)
实际上以栈的形式存储
列表用[ ]标识,可以存放不同的数据类型,支持字符、数字、字符串、列表(嵌套)
1
list = ['run',386,70.2]
列表添加元素 append(‘ name’),entend( [list] ),insert( i, ‘name’ )
列表删除元素 remove(‘name’),pop(),pop(i),del
列表切片:使用[头下标:尾下标]来截取字符串,包含头下标,不包含尾下标
列表比较:比较大小关系与String相同(> = < …)in not in
其他函数:sort( ) reverse( ) count( )
分片拷贝为深拷贝,赋值为浅拷贝
1
2
3list = [1,2,3]
list1 = list[:] #深拷贝,创建对象,原对象的所有内容都会在新对象中创建一次
list2 = list #浅拷贝,创建对象,其内容是原对象中元素的引用元组(tuple)
元组用( )标识,不能二次赋值,相当于只读列表
1
2tuple = ('run',386,70.2)
tuple[1] = 400 #错误,元组不能更新创建单个元素的元组,需要加逗号
1
2
3
4tuple1 = (1)
tuple2 = (1,)
type(tuple1) #<class 'int'> 单个元素的元组相当于该元素,如8*(8)
type(tuple2) #<class 'tuple'>元组内容不能改变,可以给元组重新赋值
1
2tuple = (1,2,4,5)
tuple = tuple[:2]+(3,)+tuple[2:] #tuple包含12345 +拼接操作符左右元素必须一致
字典(dictionary)
字典用{ }标识,字典中的元素无序,通过键来存取
1
2
3
4
5
6
7dict = {}
dict['one'] = 'this is one'
dict[2] = 'this is two'
print dict #输出完整字典
print dict.keys() #输出所有键
print dict.values() #输出所有值
分支和循环
if 语句
1
2
3
4
5
6
7#一般表达形式
if 条件:
...
elif 条件:
...
else 条件:
...三元运算符
1
val= val1 if 条件成立 else val2
assert断言
1
assert 1>2 #当为假时抛出AssertionError异常,可用来调试程序
while 语句
一般形式
1
2while condition:
statements...while循环中使用else语句
1
2
3
4
5#while...else在条件语句为false时执行else语句
while condition:
statements...
else:
statement...for 语句
一般形式
1
2
3
4for variable in sequence:
statements...
else:
statements...1
2
3
4#python for循环可以遍历任何序列的项目,如一个列表或者一个字符串
languages=['C','C++','Python']
for x in languages:
print(x)需要遍历数字序列或者控制次数,使用range( )函数
1
2range([start,]stop[,step=1])
#从start到stop,默认从0开始,默认间隔为11
2
3#与for循环结合使用
for i in range(5):
print i #输出0 1 2 3 4break与continue
break跳出当前循环体
continue跳过当前循环的剩余语句开始下一次循坏
列表推导式
快速生成包含一堆数据的列表
1 | [i+1 for i in range(10)] # 生成1-10列表 |
字典推导式
快速生成包含一堆数据的字典
1 | {i+1:for i in range(10)} |
三元运算符
1 | a = 10 if 4>3 else 20 |
函数
函数的一般格式
1
2
3def func(...):
...
return ... #可以返回多个返回值,用元组表示函数文档
1
2
3
4
5
6def fun():
'this is an empty function' #函数文档
#查看函数文档的两种方式,通过此可以查看系统函数如print
fun.__doc__
help(fun)关键字参数
使用关键字参数允许函数调用时参数的顺序与声明时不一致
1
2
3
4
5def fun(name,age):
...
#调用时
fun(age=22,name='w')默认参数
调用函数时,如果没有传递参数则会使用默认参数
1
2def fun(name='w',age=22):
...可变参数、不定长参数
不确定参数的个数
1
2
3
4def fun(*num):
return len(num)
fun(1,2,3,4) #调用时可传入多个参数1
2
3#可变参数后面的参数最好带有默认参数,通过关键字参数调用,如print
print(*objects,sep=' ',end='\n',file=sys.stdout,flush=False)
print(1,2,sep='+')global与nonlocal关键字
1
...
闭包
1
...
内部函数
在函数中定义的函数
1
2
3
4def fun1():
def fun2():
...
fun2()
文件
读写文件的步骤
- 打开文件:使用open函数,返回文件对象
- 具体读写:使用文件对象的read、write方法读写
- 关闭文件:使用close函数
删除具体文件
1
2import os
os.remove(filename)打开文件
1
open(filename,mode) #mode默认为r
各种模式
- r:只读,文件必须存在
- w:只写,覆盖或创建文件
- a:只写,创建文件或在文件后追加内容
- +:读写(不能单独使用)
- b:二进制模式打开(不能单独使用)
读写模式r+、w+、a+
- r+:文件必须存在,写入时覆盖文件
- w+:文件不存在创造文件,文件存在覆盖文件
- a+:文件不存在创造文件,文件存在在文件后追加内容
文件对象的方法
1
2
3
4
5
6f.read(size) #读取size个字符,size为负或不存在读取全部文件
f.readline() #读取一行,以字符串返回
f.readlines() #读取所有行,以列表返回
f.write(string) #写入文件
f.tell() #返回当前文件所处的位置
f.seek(offset,from_what) #改变文件所处的位置,from_what:0文件头,默认;1当前位置;2文件尾文件对象当成迭代器来读取
1
2for line in f:
print(line)使用with语句
相当于自动执行close操作
1
2
3
4
5with open(file,'r+') as f:
try:
... # 对文件进行操作
except:
...os模块中关于文件的方法
1
2
3
4
5
6
7
8
9getcwd() #返回当前工作目录
chdir(path) #改变工作目录
mkdir(path) #创建单层目录,若存在抛出异常
makedirs(path) #创建多层目录,若存在抛出异常
remove(path) #删除文件
rmdir(path) #删除单层目录,目录非空抛出异常
removedirs(path)#递归删除空目录,目录非空抛出异常
rename(old,new) #文件重命名
system(command) #运行系统的shell命令pickle模块
pickle用于对python对象进行序列化和反序列化,可以方便的将类对象存储在文件中。
常用函数
1
2
3
4
5
6
7
8pickle.dump(obj,file[,protocol])
#将obj对象序列化存入已经打开的file中
pickle.load(file)
#将file中的对象序列化读出
pickle.dumps(obj[,protocol])
#将obj对象序列化为string形式,而不是存入文件中
pickle.loads(string)
#从string中读出序列化前的obj对象使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#dump使用(序列化)
f=open('b://test.pkl','wb') #.pkl为pickle的文件,.txt也可以,反正都是乱码,.pkl显得专业;一定要使用二进制模式
list=[1,2.2,'33']
pickle.dump(list,f)
f.close()
#load使用(反序列化)
f=open('b://test.pkl','rb')
list=pickle.load(f)
f.close()
#dumps与loads使用
list=[1,2.2,'33']
bytes=pickle.dumps(list) #将list序列化
list=pickle.loads(bytes) #将bytes反序列化
异常
异常处理
1
2
3
4
5
6
7#‘标准’的异常处理
try:
...
except <Exception> [as result]:
...
finally:
...1
2
3
4
5#使用except不带任何异常类型,不推荐使用
try:
...
except:
...1
2
3
4
5
6
7
8
9
10#使用except带有多种异常类型
try:
...
except (Exception1,Exception2,...):
...
#或者多次except
except Exception1:
...
except Exception2:
触发异常
1
raise Exception #闹着玩
用户自定义异常
类和对象
类的实现
创建类
1
2
3
4
5class MyClass: #定义类
"""A simple example class""" #定义类的说明字符串
i = 1234 #定义成员变量
def fun(self): #定义方法
return i使用类
1
2m = MyClass() #创建类对象
print(m.fun()) #调用类方法类的内置属性
1
2
3
4
5__name__ #类名称
__doc__ #类文档
__module__ #类定义所在的模块,如果是当前模块则为__main__
__base__ #该类的父类列表,tuple类型
__dict__ #该类的所有属性,dict类型类属性的私有化
1
2class Myclass:
__name='myclass' #属性名前加两道下划线表示为private变量,其余为public变量
类的动态属性
python中的类,可以为实例化的对象添加动态属性,增加灵活性。
动态属性仅作用于当前对象
添加动态属性
1
2
3
4
5class Myclass:
pass #pass关键字占格,不进行操作
m=Myclass()
m.name='Myclass' #通过 对象名.属性名 添加属性删除动态属性
1
del m.name #通过 del 对象名.类名 删除属性
限制类属性
通过 _slots__可以限制类的属性,即限定该类所允许添加的动态属性名称
1
2class Myclass:
__slots__=('name','age') #添加的动态属性只能为name、age
实例化类对象
类的初始化方法
实现带有初始值的实例化,需要在定义类时,在类中实现_init__方法,相当于构造函数
1
2
3
4
5
6
7class Myclass:
def __init__(self,name,age):
self.name=name
self.age=age
def getMyClass(self):
return self.name,self.ageclass中的self
self关键字来指定本身,相当于java中的this。不同的是,python中类成员函数必须第一个参数是self
类的继承
单继承
1
2class DerivedClassName(FatherClassName):
...多继承
1
2class DerivedClassName(FatherClassName1,FatherClassName2,...):
...覆写
子类与父类的成员函数名相同,则父类会被覆写
1
2
3
4
5#通过 父类名.函数 调用父类直接调用被覆写的函数
FatherclassName.method(self,arguments)
#也可以通过super()调用,使用super不使用self
super().method(arguments)
类的魔法方法
图形用户界面GUI
- EasyGUI 简单操作
- Tkinter 功能强大

