Python_08_异常,模块,和包

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
elsefinally
  • 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解释器在导入模块时

  1. 搜索 当前目录 指定模块名的文件,如果有就直接导入
  2. 如果没有,再搜索 系统目录

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
  • 包名的 命名方式 和变量名一致,小写字母 + _
制作包

例:

  1. 新建一个文件夹,命名为包名。如:wujiao_tools
  2. 在文件夹中创建一个__init__.py文件。
  3. 编写模块。比如:Fire.pyRun.py
  4. 将模块写入__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()
发布模块
  • 如果希望自己开发的模块,分享 给其他人,可以按照以下步骤操作
制作发布压缩包步骤
  1. 创建 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

  1. 构建模块
$ python3 setup.py build
  1. 生成发布压缩包
$ 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值