python -【七】异常,模块与包

一、异常

程序执行遇到了错误,无法往下执行的时候,就会抛出异常

捕获异常

语法:
 
try:
    可能发生错误的代码
except Exception as ex:
    处理错误的情况
else:
    没有异常的代码
finally:
    不管有没有异常都要执行的代码

"""
代码解释:
1. 读取文件,如果文件不存在,则进入 except 块
2. except 块创建文件,并写入内容
3. 如果第一步文件存在,则读取文件
4. 关闭文件,无论任何情况都会进入
"""

f = None
try:
    f = open('D:/except.txt', 'r')
except Exception as ex:
    print(f'文件无法找到:{ex}')
    f = open('D:/except.txt', 'w')
    f.write('try ... except ...')
else:
    content = f.read()
    print(f'读取内容:{content}')
finally:
    f.close()

异常的传递性

main 函数内,能够收到 func_1 反馈的异常信息,说明异常具备传递性

def func_1():
    print('func_1 ... 开始')
    # 这里会出现异常
    num = 1 / 0
    print(f'func_1 结束, num = {num}')


def func_2():
    print('func_2 ... 开始')
    func_1()
    print('func_2 ... 结束')


def main():
    print('main ... 开始')
    try:
        # 捕获并处理异常
        func_2()
    except Exception as ex_:
        print(f'main调用func_2发生异常:{ex_}')
    print('main ... 结束')


main()

二、模块

模块的导入方式
基础语法:[from 模块名] import [模块 | 类 | 变量 | 函数 | *] [as 别名]

  • import 模块名
  • import 模块名1, 模块名2
  • from 模块名 import 类、变量、方法等
  • form 模块名 import *
  • import 模块名 as 别名
  • form 模块名 import 功能名 as 别名

导入内置time模块

引入 time 模块中的 sleep 函数并起别名 slp

from time import sleep as slp

# 一秒输出一次 "你好"
while True:
    slp(1)
    print('你好')

导入 time 模块中所有的函数

from time import *

while True:
    sleep(1)
    print('你好')

给模块起别名

import time as t

while True:
    t.sleep(1)
    print('你好')

自定义模块并导入

新建文件 add_module.py

# 的内容
def add(x, y):
	return x + y

新建 test_add_module.py

import add_module

def test_add():
    x = add_module.add(1, 3)
    print(f'add 返回值:{x}')


test_add()

自定义模块导入注意事项:import 的多个模块中函数有相同的,后面的 import 会覆盖前面的

# add_module.py
def add(x, y):
    """
    加法函数
    :param x:   x
    :param y:   y
    :return:    x + y
    """
    return x + y
# add_module2.py
def add(x, y):
    """
    加法函数
    :param x:   x
    :param y:   y
    :return:    x + y
    """
    return x - y
from act_7.modules.add_module import add
# module2 会覆盖 module
from act_7.modules.add_module2 import add


def test_add():
    x = add(1, 3)
    print(f'add 返回值:{x}')

    
"""
add 返回值:-2    
"""

__all__变量的用法

__all__ 变量限制 import * 的导入方式

"""
add_module.py
"""

# import * 的时候,改变量定义了 import 的规则
# 但是可以通过 from xxx import sub 进行导入使用
__all__ = ['add']


def add(x, y):
    """
    加法函数
    :param x:   x
    :param y:   y
    :return:    x + y
    """
    return x + y


def sub(x, y):
    return x - y
"""
py_module.py
"""

from add_module import *

print(f'add 函数的结果:{add(1, 2)}'# 这一句代码会报错
print(f'add 函数的结果:{sub(1, 2)}'

三、python 包

文件夹内只要有 __init__.py 文件的,都统称为包,没有的就是普通文件夹

导入包方式1: import 包名.模块名
导入包方式2: from 包名 import 模块名
导入包方式3: from 包名 import *

案例

/ 根目录
/my_moudle 包名
     __init__.py init 文件
    my_module_1.py 模块1
    my_module_2.py 模块2
pkg_import_example.pymy_moudle 平级的
 
结构如图所示
文件结构

"""
自定义模块1
my_module_1.py 
"""

def print_info1():
    print('我是模块1')

"""
自定义模块2
my_module_2.py
"""

def print_info2():
    print('我是模块2')

"""
导入包的案例
pkg_import_example.py
"""

# 写法1
import my_module.my_module_1 as m1
import my_module.my_module_2 as m2

# 写法2
# from my_module import my_module_1 as m1
# from my_module import my_module_2 as m2

m1.print_info1()
m2.print_info2()

安装三方包

# 使用 pip 安装三方包
pip install numpy

# 临时修改国内源地址
pip install numpy -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

# 配置 pip.ini 文件使用国内源
c:\users\你的用户名\pip\pip.ini
# 将以下内容帖进去
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host = https://pypi.tuna.tsinghua.edu.cn

# pycharm 内设置
# 1. 右下角找到 python 3.9,我的是这样,你的不一定是这个版本号,点击他,会弹窗出来
# 2. 选择 "Interpreter Settings"
# 3. 点击 "+" 号,搜索要安装的包名,例如:pandas
# 4. 配置 "Options": -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
# 5. Install Package

综合案例

创建一个自定义包,名称为: my_utils(我的工具)在包内提供2个模块
str_util.py(字符串相关工具,内含:)
    函数:str_reverse(s),接受传入字符串,将字符串反转返回
    函数:substr(s,x,y),按照下标x和y,对字符串进行切片
file_util.py(文件处理相关工具,内含:)
    函数:print_file_info(file name),接收传入文件的路径,打印文件的全部内容,如文件不存在则捕获异常,输出提示信息,通过finally关闭文件对象
    函数:append to_file(file_name,data),接收文件路径以及传入数据,将数据追加写入到文件中
"""
my_utils/file_util.py
"""

def print_file_info(file_name):
    """
    接收传入文件的路径,打印文件的全部内容,
    如文件不存在则捕获异常,输出提示信息,
    通过finally关闭文件对象
    :param file_name:  文件名字
    :return:           None
    """
    f = None
    try:
        f = open(file_name, 'r', encoding='utf-8')
    except FileNotFoundError as ex:
        print(f'文件[{file_name}]不存在:{ex}')
    else:
        content = f.read()
        print(f'文件的内容:\n {content}')
    finally:
        if f:
            f.close()


def append_to_file(file_name, data):
    """
    接收文件路径以及传入数据,将数据追加写入到文件中
    :param file_name: 文件路径
    :param data:数据
    :return: None
    """
    if not data:
        print(f'输入的内容是 None, 操作结束')
        return
    with open(file_name, 'a', encoding='utf-8') as f:
        f.write(data)


if __name__ == '__main__':
    print_file_info('homework.txt')
    append_to_file('homework.txt', '我是添加的内容')
"""
my_utils/str_util.py
"""

def str_reverse(s):
    """
    翻转字符串
    :param s:  正向字符
    :return:   反转后的
    """
    return s[::-1]


def substr(s, x, y):
    """
    按照下标x和y,对字符串进行切片
    :param s:   目标字符串
    :param x:   起始下标
    :param y:   结束下标
    :return:    切片的内容
    """
    return s[x:y]


if __name__ == '__main__':
    line = '123456'
    reverse = str_reverse(line)
    print(f'反转后:{reverse}')

    slice_ = substr(line, 2, 4)
    print(f'切片后:{slice_}')
"""
my_utils 同层级的 use_my_utils.py
"""

from my_utils import file_util as f
from my_utils import str_util as s


if __name__ == '__main__':
    f.print_file_info('homework.txt')
    f.append_to_file('homework.txt', '我是添加的内容')

    after = '123456'
    revered = s.str_reverse(after)
    print(f'翻转前:{after}, 翻转后:{revered}')

    sub = s.substr(after, 2, 5)
    print(f'截取前:{after}, 截取后:{sub}')

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值