目录
异常
概念
- 异常:程序在运行时,如果解析器遇到一个错误,会停止程序的执行,并且提示一些错误信息
- 抛出异常:程序停止执行并且提示错误信息这个动作
- 异常处理:就是通过对异常处理,把抛出的异常信息只给开发人员看,而不是最终用户看
- 程序开发时,很难将所有的特殊情况都处理得面面俱到,通过异常捕获可以针对突发事件做集中的处理,从而保证程序的稳定性和健壮性
捕获异常
1、基本异常
- 在程序开发中,如果对某些代码的执行不能确定是否正确,可以添加try(尝试) 来捕获异常
- 语法格式:
try:
尝试执行的代码
except:
出现错误的处理
2、错误类型捕获
- 在程序执行时,可能会遇到不同类型的异常,并且需要针对不同类型的异常,做出不同的响应,这时需要捕获错误类型
- 语法格式:
try:
尝试执行的代码
except 错误类型1:
错误类型1的处理代码
except (错误类型2,错误类型3):
针对错误类型2和错误类型3的处理代码
- 当python解释器抛出异常时,最后一行错误信息的第一个单词,就是错误类型
3、捕获未知错误
- 在开发时,要预判所有可能出现的错误,还是有一定难度的
- 如果希望程序无论出现任何错误,都不会因为python解析器抛出异常而被终止,可以再增加一个except
- 语法格式:
try:
尝试执行的代码
except 错误类型1:
错误类型1的处理代码
except (错误类型2,错误类型3):
针对错误类型2和错误类型3的处理代码
except Exception as result:
print(“未知错误 %s” % result)
4、异常捕获完整语法
try:
尝试执行的代码
except 错误类型1:
错误类型1的处理代码
except (错误类型2,错误类型3):
针对错误类型2和错误类型3的处理代码
except Exception as result:
print(“未知错误 %s” % result)
else:
没有异常才会执行的代码
finally:
无论是否有异常都会执行的代码
5、异常的传递
- 当函数、方法执行出现异常,会将异常传递给函数、方法的调用者
- 如果传递到主程序任然没有异常处理,程序才会被终止
- 作用:
- 在开发中,可以在主程序增加异常处理
- 而在主程序调用的其他函数,只要出现异常,都会被传递到主程序的异常捕获中
- 这样就不需要在代码中,增加大量的异常捕获
6、抛出raise异常
- 除了代码执行错误抛出异常外,某些程序还希望主动抛出异常,比如规定密码长度不小于8,否则抛出异常
- 适用于需要自定义某些自定义规则,当不符合规则,就抛出异常的场景
- 过程
- 1、创建一个Exception的对象
- 2、使用raise关键字抛出异常对象
- 语法实例:
def input_password():
#1、提示用户输入密码
pwd = input("请输入密码:")
#2、判断密码>=8,返回输入的密码
if len(pwd) >= 8:
return pwd
#3、如果<8 主动抛出异常
#3.1、创建异常对象
ex = Exception("密码长度不够")
#3.2、抛出异常
raise ex
#4、对主程序进行异常处理
try:
print(input_password())
except Exception as result:
print(result)
模块的扩展
模块的导入方法
1)import 模块名1,模块名2
2)import 模块名1
import 模块名2
提示:PE8推荐使用第二种规则,每个导入应该独占一行
导入之后,通过 模块名. 使用模块提供的工具——全局变量、函数、类
拓展:如果模块名过长,可以使用别名、
import 模块名1 as 模块别名
注意:模块别名符合大驼峰命名法
from...import 导入模块的部分工具
- 使用 from 模块名 import 工具 导入模块的工具
- 调用时不需要用模块名.使用工具,可以直接使用模块提供的工具
注意:如果两个模块,存在同名函数,后导入模块的函数或覆盖掉先导入的函数
- 把所有导入代码应该统一写在代码的顶部,更容易及时发现冲突
- 一旦发现冲突,可以使用as关键字对其中一个工具起一个别名
from...import * 导入模块所有工具
- 这种方式不推荐使用,因为函数重名没有任何提示,出现错误不好排除
模块的搜索顺序
- 搜索当前目录指定模块名的文件,如果有直接导入
- 如果没有,再搜索系统目录
- 在开发时,给文件起名,不要和系统的模块文件重名
- 每一个模块都有一个内置属性__file__可以查看模块的完整路径,语法:print(模块名.__file__)
原则——每一个文件都应该是可以被导入的
- 在导入文件时,文件中所有没有任何缩进的代码都会被执行一遍!!!
- 导入文件时,只是用模块的全局变量、函数、类,不需要执行除此之外的代码(比如测试代码)
- 解决方法:__name__属性可以做到,测试模块的代码只在测试情况下被运行,而在被导入是不会被执行
- 如果直接执行程序,print(__name__)就会输出__main__ ;如果是被其他文件导入的,就会输出模块名
- 所以解决方法就是给测试代码块添加一个判断语句,只有__name__等于__main__时才执行测试代码
实例:
if __name__ = "__main__":
main()
包
- 包是一个包含多个模块的特殊目录
- 目录下有一个特殊文件__init__.py
- 包的命名方法符合变量命名规则
-
作用:使用import 包名 可以一次性导入包中所有的模块
需要在外界使用包中的模块,需要在__init__.py中指定对外界提供的模块列表
from . import 模块名
制作并发布自己的模块压缩包
1、把制作好的包复制到一个发布文件夹中
2、在发布文件中新建一个setup.py文件,粘贴以下代码
from distutils.core import setup
setup(name = "包名",
version = "版本",
description = "描述信息",
long_description = "详细信息",
author = "作者",
author_email = "作者邮箱",
url = "主页",
py_modules = ["包名.模块名1","包名.模块名2"] ) #发布的模块列表
3、在终端或命令行使用命令构建模块
$ python3 setup.py build
4、在终端或命令行生成发布压缩包
$ python3 setup.py sdist
安装模块压缩包
1、解压模块压缩包
$ tar -zxvf 发布模块压缩包名.tar.gz
2、安装模块压缩包,会安装到系统目录中
$ sudo python3 setup.py install
卸载已安装好的模块
直接从安装目录下,把安装模块的目录删除就可以了
pip安装第三方模块
- 第三方模块通常是指由知名的第三方团队开发的并且被程序员广泛使用的python包/模块
- pip是一个现代的,通用的python包管理工具
- 提供了对python包的查找、下载、安装、卸载等功能
- 安装卸载命令
# 将模块安装卸python2.x 环境和卸载
$ sudo pip install 包名
$ sudo pip uninstall 包名
# 将模块安装卸python3.x 环境和卸载
$ sudo pip3 install 包名
$ sudo pip3 uninstall 包名
文件
1、文件类型
文本文件和二进制文件
2、操作文件的套路
- 三个步骤:打开open、操作read/write、关闭close
- open函数的第一个参数是要打开的文件名(文件名区分大小写),第二个参数的访问方式(r w a r+ w+ a+),默认是只读方式打开
- 如果文件存在,返回文件操作对象
- 如果文件不存在,会抛出异常
- read方法可以一次性读入并返回文件的所有内容
- close方法负责关闭文件,如果忘记关闭文件,会造成系统资源消耗,而且会影响后续对文件的访问
file = open("文件名")
text = file.read()
print(text)
file.close()
文件指针
- 文件指针标记从哪个位置开始读取数据
- 第一次打开文件时,通常文件指针会指向文件的开始位置
- 当执行了read方法后,文件指针会移动到读取内容的末尾,如果再次执行read方法,不能读取到内容
readline方法
- 可以一次读取一行内容
- 方法执行后,会把文件指针移动到下一行,准备再次读取
文件/目录的常用管理操作
文件操作
方法名 | 说明 | 实例 |
---|---|---|
rename | 重命名文件 | os.rename(源文件名,目标文件名) |
remove | 删除文件 | os.remove(文件名) |
目录操作
方法名 | 说明 | 实例 |
---|---|---|
listdir | 目录列表 | os.listdir(目录名) |
mkdir | 创建目录 | os.mkdir(目录名) |
rmdir | 删除目录 | os.rmdir(目录名) |
getcwd | 获取当前目录 | os.getcwd() |
chdir | 修改工作目录 | os.chdir(目标目录) |
path.isdir | 判断是否是文件 | os.path.isdir(文件路径) |
python 2.x中如何使用中文
要运行带有中文的文件,在第一行增加以下代码
# *-* coding:utf8 *-*
也可以使用
# coding=utf8
unicode字符串
要能够正确遍历字符串,在定义字符串时,需要在字符串的引导前,增加一个小写字母u,告诉解析器这是一个unicode字符创(使用utf-8编码格式的字符串)
eval函数
- 将字符串当成有效的表达式来求值并返回计算结果
- 开发时千万不要使用eval直接转换input的结果,会有个接口能够操作文件/目录