python
基础
异常,模块,和包
异常
异常
之前程序出现了bug,解释器无法执行,会出现一些错误提示,这就是所谓的异常
。
程序开发时,很难将所有的特殊情况都处理的面面俱到,通过异常捕获
可以针对突发事件做集中的处理,从而保证程序的稳定性和健壮性。
异常的写法
try:
尝试执行的代码
except:
出现错误的处理
例:
try:
print(hello)
except:
print("打印不出来")
# 输出
打印不出来
捕获异常
异常类型
先前程序出现bug时,Python解释器会抛出一串提示。如:
print(hello)
这段程序中没有定义hello
这个变量的内容,变无法打印。Python解释器抛出的提示为:
NameError:name 'hello' is not defined
其中NameError
就是这个异常的异常类型。
捕获指定异常
对于已知的不同类型异常,通常希望可以分别处理。
例:
try:
print(1/0)
except NameError :
print("没有该变量")
except ZeroDivisionError :
print("0不能被除")
# 输出
0不能被除
还可以一次捕获指定的多个异常,用元组打包。
try:
print(1/0)
except NameError :
print("没有该变量")
except (ZeroDivisionError,TypeError) :
print("出现了异常")
捕获全部异常
Exception
是所有程序异常类的父类。
try:
print(1/0)
except NameError :
print("没有该变量")
except (ZeroDivisionError,TypeError) :
print("出现除0异常或类型异常")
except Exception :
print("其他异常")
异常的完整语法
捕获异常描述信息
try:
print(1/0)
except Exception as result:
print(result)
# 输出
division by zero
else
和finally
else
只有在没有异常时才会执行的代码finally
无论是否有异常,都会执行的代码
异常的完整语法
try:
num = int(input("请输入整数:"))
result = 8 / num
print(result)
except ValueError:
print("请输入正确的整数")
except ZeroDivisionError:
print("除 0 错误")
except Exception as result:
print("未知错误 %s" % result)
else:
print("正常执行")
finally:
print("执行完成,但是不保证正确")
异常的传递
异常的传递 —— 当函数/方法 执行出现异常,会将异常传递给函数/方法的调用一方。如果传递到主程序,仍然 没有异常处理,程序才会被终止。
因此可以在主函数中增加异常捕获。而在主函数中调用的其他函数,只要出现异常,都会传递到主函数的异常捕获中,这样就不需要在代码中,增加大量的异常捕获,能够保证代码的整洁。
def demo1():
return int(input("请输入一个整数:"))
def demo2():
return demo1()
try:
print(demo2())
except ValueError:
print("请输入正确的整数")
except Exception as result:
print("未知错误 %s" % result)
自定义异常
通常我们不希望用户进行一些非法操作,因此我们会自定义一些异常,这些异常是给用户看的。
Python中的Exception
类为异常类,可以创建一个Exception
对象,使用raise
抛出异常对象。
# 出入密码时,不应该少于8位。
class ShortPasswordError(Exception):
def __init__(self,length,min_length):
self.length = length
self.min_length = min_length
# 异常的描述信息
def __str__(self):
return f'你输入的长度是{self.length}, 不能少于{self.min_length}个字符'
def main():
try:
con = input('请输入密码:')
if len(con) < 8:
raise ShortPasswordError(len(con), 8)
except Exception as result:
print(result)
else:
print('密码已经输入完成')
main()
# 输出
请输入密码:sdas
你输入的长度是4, 不能少于8个字符
模块
模块
- 每一个以扩展名
py
结尾的 Python源代码文件都是一个模块
- 模块名 同样也是一个 标识符,需要符合标识符的命名规则
- 在模块中定义的
全局变量
、函数
、类
都是提供给外界直接使用的 工具 模块
就好比是 工具包,要想使用这个工具包中的工具,就需要先 导入 这个模块
导入模块
import
导入
# 1. 导入模块
import 模块名
import 模块名1, 模块名2...
# 2. 调用功能
模块名.功能名()
import random
ran_int = random.randint(0,10)
print(ran_int)
from...import
导入
导入后不需要通过模块名
调用,直接使用功能名
调用。
from 模块名 import 功能1, 功能2, 功能3...
from random import randint
ran_int = randint(0,10)
print(ran_int)
导入所有工具
from 模块名 import *
可以导入该模块的所有工具,但不推荐使用,因为函数重名并没有提示。
as
设定别名
若模块名太长,或需要一个别名。可用as
设定。
如果两个模块*,存在同名的函数,那么 后导入模块的函数,会覆盖掉先导入的函数,也可用as
起别名的方法解决。
import 模块名1 as 模块别名
from 模块名 import 功能名 as 功能别名
from random import randint as int_ran
ran_int = int_ran(0,10)
print(ran_int)
模块搜索的顺序
python解释器在导入模块时
- 搜索 当前目录 指定模块名的文件,如果有就直接导入
- 如果没有,再搜索 系统目录
Python 中每一个模块都有一个内置属性 __file__
可以 查看模块 的 完整路径。
自己的文件名不要和已有模块名重复。
制作模块
定义模块
新建一个.py
文件,编写函数,变了或类即可。
# Test.py
def wujiao():
print("wujiao功能正在运行")
# mod.py
from Test import wujiao
wujiao()
# 输出
wujiao功能正在运行
__name__
定义好一个模块后,通常需要在模块内进行运行测试。可导入模块后会立即将模块内的代码运行一遍。如果不做处理,就会运行测试代码。
__name__
的功能是:在该模块文件内,__name__
的值是__main__
。在其他文件导入该模块时,__name__
的值是模块名
。因此可以用以下方法测试:
def main():
pass # 测试信息。
if __name__ == '__main__':
main()
__all__
在使用from ... import *
的时候,有些模块不想被*
导入。可使用__all__
。
__all__
的功能是:当使用from xxx import *
导入时,只能导入这个列表中的元素。
__all__ = ['testA']
def testA():
print('testA')
def testB():
print('testB')
from my_module1 import *
testA()
testB()
# 输出
testA
NameError:name 'testB' is not defined
包
包
- 包 是一个 包含多个模块 的 特殊目录
- 目录下有一个 特殊的文件
__init__.py
- 包名的 命名方式 和变量名一致,小写字母 +
_
制作包
例:
- 新建一个文件夹,命名为包名。如:wujiao_tools
- 在文件夹中创建一个
__init__.py
文件。 - 编写模块。比如:
Fire.py
,Run.py
- 将模块写入
__init__.py
中
# 从当前目录导入模块列表
from . import Fire
from . import Run
导入包
# 导入方法1
import wujiao_tools
wujiao_tools.Fire.Fire()
wujiao_tools.Run.Run()
# 导入方法2
from wujiao_tools import Fire
Fire.Fire()
# 导入方法3
from wujiao_tools.Fire import Fire
Fire()
发布模块
- 如果希望自己开发的模块,分享 给其他人,可以按照以下步骤操作
制作发布压缩包步骤
- 创建 setup.py
setup.py
的文件
from distutils.core import setup
setup(name="hm_message", # 包名
version="1.0", # 版本
description="itheima's 发送和接收消息模块", # 描述信息
long_description="完整的发送和接收消息模块", # 完整描述信息
author="itheima", # 作者
author_email="itheima@itheima.com", # 作者邮箱
url="www.itheima.com", # 主页
py_modules=["hm_message.send_message",
"hm_message.receive_message"])
有关字典参数的详细信息,可以参阅官方网站:
https://docs.python.org/2/distutils/apiref.html
- 构建模块
$ python3 setup.py build
- 生成发布压缩包
$ python3 setup.py sdist
注意:要制作哪个版本的模块,就使用哪个版本的解释器执行!
安装模块
$ tar -zxvf hm_message-1.0.tar.gz
$ sudo python3 setup.py install
卸载模块
直接从安装目录下,把安装模块的 目录 删除就可以
$ cd /usr/local/lib/python3.5/dist-packages/
$ sudo rm -r hm_message*
pip
安装第三方模块
pip
是一个通用的Python
包管理工具- 提供了对
Python
包的查找、下载、安装、卸载等功能
安装和卸载命令如下:
# 将模块安装到 Python 2.x 环境
$ sudo pip install pygame
$ sudo pip uninstall pygame
# 将模块安装到 Python 3.x 环境
$ sudo pip3 install pygame
$ sudo pip3 uninstall pygame