目录

一、了解异常

二、异常的捕获方法

1. 基本语法(捕获所有异常)

2. 捕获指定异常

3. 捕获多个异常

4. 捕获所有异常(推荐)

5. else 和 finally

三、异常的传递性

四、Python模块

1. 模块的导入方式

2. 导入示例

3. 自定义模块

4. __main__ 变量的使用

5. __all__ 变量

6. 注意事项

五、Python包

1. 什么是包

2. 导入包的方式

六、安装第三方包

1. 使用pip安装

2. 在PyCharm中安装

七、综合案例:自定义工具包

项目结构

1. str_util.py(字符串工具)

2. file_util.py(文件工具)

3. init.py

4. 使用工具包

八、异常、模块与包速查表

异常捕获

模块导入

包相关

第三方包安装


一、了解异常

异常:程序运行过程中出现的错误(BUG)

# 异常演示:以r模式打开不存在的文件
# f = open("linux.txt", "r")   # 报错:FileNotFoundError

二、异常的捕获方法

1. 基本语法(捕获所有异常)

try:
    # 可能发生错误的代码
    f = open("linux.txt", "r")
except:
    # 出现异常时执行的代码
    f = open("linux.txt", "w")
    print("文件不存在,已创建新文件")
​
# 输出:文件不存在,已创建新文件

2. 捕获指定异常

try:
    print(name)   # name未定义
except NameError as e:
    print(f"捕获到异常:{e}")
​
# 输出:捕获到异常:name 'name' is not defined
# 捕获异常类型不匹配时,无法捕获
try:
    print(1 / 0)   # ZeroDivisionError
except NameError as e:
    print("NameError异常")   # 不会执行
​
# 程序会直接报错

3. 捕获多个异常

try:
    print(1 / 0)
except (NameError, ZeroDivisionError) as e:
    print(f"捕获到异常:{e}")
​
# 输出:捕获到异常:division by zero

4. 捕获所有异常(推荐)

try:
    print(name)
except Exception as e:
    print(f"捕获到异常:{e}")
​
# 输出:捕获到异常:name 'name' is not defined

5. else 和 finally

# else:没有异常时执行
try:
    print("正常代码")
except Exception as e:
    print(f"异常:{e}")
else:
    print("没有异常,执行else")
​
# 输出:
# 正常代码
# 没有异常,执行else
# finally:无论是否有异常都执行
try:
    f = open("test.txt", "r")
except Exception as e:
    f = open("test.txt", "w")
    print("文件不存在,已创建")
else:
    print("文件打开成功")
finally:
    f.close()
    print("文件已关闭")
​
# 输出(如果test.txt不存在):
# 文件不存在,已创建
# 文件已关闭

三、异常的传递性

异常会沿着函数调用链向上传递

def func1():
    print("func1开始")
    print(1 / 0)   # 发生异常
    print("func1结束")

def func2():
    print("func2开始")
    func1()
    print("func2结束")

def main():
    try:
        func2()
    except Exception as e:
        print(f"在main中捕获到异常:{e}")

main()

# 输出:
# func2开始
# func1开始
# 在main中捕获到异常:division by zero

四、Python模块

1. 模块的导入方式

导入方式 语法 调用方式
导入整个模块 import 模块名 模块名.功能名()
导入特定功能 from 模块名 import 功能名 功能名()
导入所有功能 from 模块名 import * 功能名()
模块别名 import 模块名 as 别名 别名.功能名()
功能别名 from 模块名 import 功能 as 别名 别名()

2. 导入示例

# 方式1:import 模块名
import time
print("开始")
time.sleep(1)    # 需要模块名.功能名
print("结束")
# 输出:开始(等待1秒)结束

# 方式2:from 模块名 import 功能名
from time import sleep
print("开始")
sleep(1)         # 直接使用功能名
print("结束")

# 方式3:from 模块名 import *
from time import *
print("开始")
sleep(1)
print("结束")

# 方式4:模块别名
import time as t
print("开始")
t.sleep(1)
print("结束")

# 方式5:功能别名
from time import sleep as sl
print("开始")
sl(1)
print("结束")

3. 自定义模块

创建 my_module.py

def test(a, b):
    print(a + b)

def hello(name):
    print(f"你好,{name}")

使用自定义模块:

# 导入自定义模块
import my_module

my_module.test(3, 5)      # 8
my_module.hello("张三")    # 你好,张三

4. __main__ 变量的使用

# my_module.py
def test(a, b):
    print(a + b)

# 只在当前文件直接运行时执行,被导入时不执行
if __name__ == '__main__':
    test(1, 1)   # 直接运行时输出2,被导入时不执行

5. __all__ 变量

# my_module.py
__all__ = ['test']   # 只允许导入test

def test(a, b):
    print(a + b)

def hello(name):
    print(f"你好,{name}")
# 使用 from xxx import * 时,只能导入__all__列表中的功能
from my_module import *

test(3, 5)    # 8(可以)
# hello("张三")  # 报错,hello不在__all__中

6. 注意事项

# 后导入的模块会覆盖先导入的同名功能
from module1 import test   # test出1
from module2 import test   # test出2

test()   # 执行的是module2中的test

五、Python包

1. 什么是包

:一个包含 __init__.py 文件的文件夹,用于管理多个模块

my_package/          # 包名
    __init__.py      # 包标识文件
    module1.py       # 模块1
    module2.py       # 模块2

2. 导入包的方式

方式1import 包名.模块名

import my_package.my_module1
my_package.my_module1.test(1, 2)

方式2from 包名 import 模块名

from my_package import my_module1
my_module1.test(1, 2)

方式3from 包名.模块名 import 功能名

from my_package.my_module1 import test
test(1, 2)

方式4from 包名 import *(需要在 __init__.py 中定义 __all__

# __init__.py
__all__ = ['my_module1', 'my_module2']
from my_package import *
my_module1.test(1, 2)
my_module2.hello("张三")

六、安装第三方包

1. 使用pip安装

# 基本安装
pip install 包名

# 使用清华镜像源安装(更快)
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名

# 示例:安装numpy
pip install numpy

2. 在PyCharm中安装

  • File → Settings → Project → Python Interpreter

  • 点击"+"号搜索并安装


七、综合案例:自定义工具包

项目结构

my_utils/              # 工具包
    __init__.py
    str_util.py        # 字符串工具
    file_util.py       # 文件工具

1. str_util.py(字符串工具)

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

def substr(s, x, y):
    """
    字符串切片
    :param s: 输入字符串
    :param x: 起始下标
    :param y: 结束下标
    :return: 切片后的字符串
    """
    return s[x:y]

# 测试代码
if __name__ == '__main__':
    print(str_reverse("hello"))     # olleh
    print(substr("hello", 1, 4))    # ell

2. file_util.py(文件工具)

def print_file_info(file_name):
    """
    打印文件内容
    :param file_name: 文件路径
    :return: None
    """
    f = None
    try:
        f = open(file_name, "r", encoding="UTF-8")
        content = f.read()
        print("文件内容:")
        print(content)
    except FileNotFoundError:
        print(f"错误:文件'{file_name}'不存在")
    except Exception as e:
        print(f"发生未知错误:{e}")
    finally:
        if f:
            f.close()
            print("文件已关闭")

def append_to_file(file_name, data):
    """
    追加数据到文件
    :param file_name: 文件路径
    :param data: 要追加的数据
    :return: None
    """
    try:
        with open(file_name, "a", encoding="UTF-8") as f:
            f.write(data)
        print(f"数据已追加到'{file_name}'")
    except Exception as e:
        print(f"追加失败:{e}")

# 测试代码
if __name__ == '__main__':
    # 测试打印文件内容
    print_file_info("test.txt")
    
    # 测试追加内容
    append_to_file("test.txt", "\n新的一行内容")

3. init.py

__all__ = ['str_util', 'file_util']

4. 使用工具包

# 方式1:导入整个模块
import my_utils.str_util
import my_utils.file_util

print(my_utils.str_util.str_reverse("Python"))   # nohtyP
my_utils.file_util.append_to_file("log.txt", "2024-01-01 日志信息\n")

# 方式2:导入具体功能
from my_utils.str_util import str_reverse, substr
from my_utils.file_util import print_file_info

print(str_reverse("hello"))   # olleh
print(substr("hello", 1, 4))  # ell

# 方式3:导入所有(需要__all__)
from my_utils import *
print(str_util.str_reverse("world"))   # dlrow

八、异常、模块与包速查表

异常捕获

语法 说明
try: ... except: ... 捕获所有异常
except 异常类型 as e: 捕获指定异常
except (类型1, 类型2): 捕获多个异常
except Exception as e: 捕获所有异常(推荐)
else: 无异常时执行
finally: 无论是否异常都执行

模块导入

语法 说明
import 模块 导入整个模块
from 模块 import 功能 导入特定功能
from 模块 import * 导入所有功能
import 模块 as 别名 模块别名
from 模块 import 功能 as 别名 功能别名

包相关

概念 说明
包含 __init__.py 的文件夹
__init__.py 标识文件夹为包
__all__ 控制 import * 的内容
__name__ "__main__" 表示直接运行

第三方包安装

# 基本安装
pip install 包名
​
# 使用清华镜像源
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名
​
# 查看已安装包
pip list
​
# 卸载包
pip uninstall 包名

更多推荐