6 模块和包
(1) 命名以.py结尾的文件就是Python模块
Python的包就是一个文件夹,至少有还有一个__init__.py的文件
包中可以有文件夹,文件夹中可以有包
(2) 文件的导入
每使用一个变量名或者函数时,就需要导入另一个文件
例:从mian.py中导入lib文件下的一个函数,现在想从mian.py中使用do_parse函数
在编译器下通过运行python main.py从而运行main.py,和main.py在同一个目录下面的其他包可以被导入使用,现在要导入lib中的do_parse函数,需要在mian.py的源代码中写 from lib.parse import do_parse(parse是lib包下面的一个.py文件,do_parse是该文件下的一个函数)
第三方包的导入
如果lib不在同一个目录下,Python可能找不到,可以使用from .xxx(用.表示当前模块下的,另外还有..就是当前模块的上一目录下)
如果第一次导入的时候,会执行刚刚的代码,但是如果第二次导入的时候,就不会第二次执行了
(3) Python2的特有导入
如果是同包的目录下,就不用使用.号,但是不建议使用
(4) 使用小技巧
dir(模块):查看模块属性
如:在Linux下进入Python,执行(sys是一个系统包)(可以把sys暂时理解为一个对象):import sys->dir(sys)下面会弹出一系列的变量名,此时可是执行:type(sys.version)查看version的属性这里显示的是str,意思是version是str类型的。如果执行type(sys.getsizeof),此时显示的getsizeof是一个函数,如下图
技巧2
每个内置的模块都有一个内置的变量,以双下划线开头,双下划线结尾的__name__,不用定义可以直接使用,一般是一个str类型,即每一个.py下都有一个内置变量,如果是入口模块的话(模块就是一个.py文件),它的内置变量就固定为__main__,如果使用if __name__==”__main__”就可以判断这个模块是否为入口模块
7 高级数据结构
(1) 元组
与列表很相似,定义时把中括号改成小括号,只不过元组的内容不可变,可以理解为常量,注意(2)不是元组,而应该使用(2,),这个是只有一个元素的元组的写法
(2) 字典
想要表示映射的关系
用{}括起来,如
{
“123”:123
456:”hello”
}
注意冒号左边是常量,叫做键,冒号右边是常量或者变量,叫做值,可以讲上式写成一行a={“123”:123,456:”hello”}。如果我们想使用字典里面的值,则使用a[“123”],字典取值,得到了123.如果想要改变字典中的值的话,则使用a[“123”]=”world”,字典设置值。特性是速度非常快
(3) 字符串
字符串可以理解为一个特殊的列表,列表中的每个元素就是一个字符,字符串也是一个常量,我们无法修改其值。字符串可以截获使用,如a=”hello world”,可以使用a[:5]获取前五个值的这样的一个新的字符串进行使用。
字符串的占位符替换
如a=”hello %s” % “world”:这样的话,就把%s替换成world。如果要替换多个值可以使用如下的方式a=”%s %s” % {“hello” “world”}(列表的形式进行替换)。关键字替换:a=”%(a)s%(b)s” % {a:”hello”,b:”world”}(字典形式进行替换)。
(4) 函数中使用元组和字典
当函数返回多个值时,实际上返回的就是一个元组。把一个元组赋值给其他变量时,就是一个拆包的过程。如果我们定义了一个相加的函数add(),此时可以使用元组进行传参,使用方法如下:定义元组nums=(1,2)
使用函数和元组add(*nums),实际上就是把nums替换成了1,2
使用字典和函数
param={“a”:1,”b”:2}
param(**param)->param(a=1,b=2)
8 类和对象
出来模块和函数的形式外,在我们构建大型项目的时候,我们学会使用类和对象的形式
(1) 创建类
class cat(object):
leg_cnt=4 #类属性
def __init__(self,cat_name): #init的名字固定,整条语句不可变,固定是实例的创建过程,self固定格式,不可变,self就是一个实例化的对象
self.name=cat_name #name是附属于self实例的一个变量,使用的方式就是这种形式
def change_name(self,cat_name): ##一个参数一定是self,第一个参数可变,课不用,看自己的需求,这样的一个函数就是一个方法
(2) 使用类(类的实例化)
使用tom=Cat(“Tom”):进行实例化,,此时tom是一个对象
方法的调用:tom.change_name(“xiaohei”)
对象的固有属性:就是在定义类的时候,已经说明leg_cnt=4,所以tom中已经存在leg_cnt=4
(3) 类的继承
class MyCat(Cat): #让猫实例化
def __init__(self,cat_name):
surper(Mycat,self),__init__name
def jump(self)
printf(“try jump”)
jack=MyCat(“jack”)
jack.jump()
jack.climb()
9 文件处理
(1) 写入文件
比如我在某一文件夹下面创建了一个新的文件pome.txt,并在该文件里面写入了内容,可以使用f=open(‘\\\’,’w’) #\\\是文件路径,而w(写入)是打开的属性,还有r(读取),a(追加)
接着使用f.write(pome)文件的一个写入方法,然后使用f.colse()进行文件的关闭
(2)读取文件
f.open(‘文件的路径’)
while Ture
line=f.readline() #读取一行内容
if len(line) == 0:
break
printf(line,end=””) #替换了内置的换行符,因为printf()的后面会内置一个换行符
f.close() #关闭文件
(3)with语句
with open(‘\\\’,’w’) as f:
f.write
因为加了一个with语句,当with结束时,会自动关闭文件
10 异常处理
(1) 将异常包装成一个对象,这些对象有一个基类Exception
捕获异常对象一
try:
…. #可能会出现异常的错误代码
except (一个错误类名称内置的) ase:
printf(e) #处理这个异常
except Exception(这个是异常的基类):
#处理异常代码,如打印
else:
#没有异常的情况的代码
捕获异常2
try :
一段可能出错的代码
finally:
#最后一定会执行这个语句
另外还可以raisee #就是抛出异常
实例演示:在Linux下使用vim创建一个a.py的文件,然后输入如下代码
保存退出后,执行pythona.py 会显示抛出异常
如果想继续抛出异常,就可是使用如下
此时执行,又会抛出异常的处理