一、异常
程序执行遇到了错误,无法往下执行的时候,就会抛出异常
捕获异常
语法:
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.py
跟my_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}')