Python学习笔记(10) -- 异常,模块,包

传送门==>B站黑马python入门教程


目录


1. 异常


异常:当检测到一个错误时,Python解释器无法继续执行,出现错误的提示,这些就是异常,即bug

例如, r模式打开不存在的文件时;

python 复制代码
f = open('test.txt', 'r')

异常捕获

世界上没有完美的程序,任何程序在运行过程中,都有可能出现异常,导致程序无法正常执行;

那么就需要预先对可能出现的bug进行处理,也就是异常捕获

当我们的程序出现bug,那么就有两种情况:

  • 整个程序因为一个bug停止运行;
  • 对于bug进行预处理,整个程序继续运行;

捕获异常的作用:提前假设某处出现异常,预先准备,当出现异常时,有后续手段;


基本语法

python 复制代码
try:
    可能出现错误的部分
except:
    若出现异常则执行

案例:

python 复制代码
# 例如, r模式打开不存在的文件时;使用w模式打开文件;
try:
    f = open('test.txt', 'r')
except:
    f = open('F:/pythonworkspace/startDemo/fileDemopath/test.txt','w',encoding= "UTF-8")
    f.close()

捕获指定异常

基本语法

python 复制代码
try:
    print(name)
except NameError as e:
    print('name变量名称未定义错误')   

注:

  • 若尝试执行的代码异常类型与实际要捕获的异常类型不一致时,则无法捕获异常;
  • 一般try下方就放一行尝试执行的代码;

捕获多个异常

当捕获多个异常,可以把要捕获的异常类型放在一个元组中;

python 复制代码
try:
    print(name)
    print(1/0)
except (NameError,ZeroDivisionError) as e:
    print('name变量名称未定义错误')
    print('除数不能为0')
    print(e)


捕获所有异常

python 复制代码
try:
    print(name)
    print(1/0)
except Exception as e:
    print("捕获所有可能出现的异常")
    print(e)

异常else

如果没有异常时要执行的代码部分;

python 复制代码
try:
    print(name)
except Exception as e:
    print(e)
else:
    print("没有异常时要执行的部分")  

finally

无论有没有异常都要执行的代码部分;

python 复制代码
try:
    print(name)
    print(1/0)
except Exception as e:
    print(e)
    print("捕获所有可能出现的异常")
else  :
    print("没有异常时要执行的部分")
finally:
    print("无论是否有异常都要执行的代码")

异常的传递

异常具有传递性

案例:

当函数func01()中出现异常,且没有去捕获异常时,

此时异常会传递到func02(),而func02()也没有捕获异常,
main()函数就会捕获异常

python 复制代码
def func01():
    print("func01函数开始")
    print(name)
    print("func01函数结束")

def func02():
    print("func02函数开始")
    func01()
    print("func02函数结束")

def main():
    print("main函数开始")
    try:
        func02()
    except Exception as e:
        print(f"main函数捕获处理异常{e}")
    print("main函数结束")

main()

注:当所有函数都没有去捕获异常时,程序就会报错


2.模块


模块

模块(Module)

是python文件,以.py结尾,模块可以定义函数,类,变量,模块里面也可以包含可执行的代码;

模块的作用:python中有很多各种不同的模块,每一个模块都可以帮助我们去快速地实现一些功能,比如实现和时间相关的功能就可以用time模块,

可以将模块看做是工具包,每个工具包有各种不同的工具供我们使用来实现不同的功能;

模块的导入方式

语法:

from 模块名\] import\[ 模块\|类\|变量\|函数\|\*\]\[as 别名

常用的组合形式:

  • import 模块名
  • from 模块名 import 类,变量,函数
  • from 模块名 import *
  • import 模块名 as 别名
  • from 模块名 import 功能名 as 别名

import 模块名

语法:

import 模块名

import 模块名1,模块名2

模块名.功能名

案例:

导入时间模块后调用方法

python 复制代码
# 导入时间模块
import time

print("开始")
# 睡眠2秒
time.sleep(2)
print("结束")

使用from 导入 time的sleep函数

python 复制代码
from time import sleep
print("开始")
sleep(2)
print("结束")

使用 * 导入 time模块中所有的功能

python 复制代码
from time import *
print("开始")
sleep(2)
# 其他方法
print(time())
print(localtime())
print(asctime())
print("结束")

使用as 给特定功能起别名

python 复制代码
import time as tm
print(tm.time())

自定义模块

python中已经实现了很多的模块,但是有时需要定制化一些模块

案例:

创建py_self_module1.py文件,作为自定义模块,写个计算两数之和的函数;

python 复制代码
def test(a,b):
    """
    计算两数之和
    :param a:
    :param b:
    :return:
    """
    return a+b

# 可以测试模块的功能,
if __name__ == '__main__':
    print(test(1,2))

尝试导入且调用函数

python 复制代码
# 导入自定义模块
import py_self_module1
print(py_self_module1.test(1,2))

案例:

创建py_self_module2.py文件,作为自定义模块,写个计算两数之和的函数;

python 复制代码
def test(a,b):
    """
    计算两数之和
    :param a:
    :param b:
    :return:
    """
    return a+b

同时导入自定义的模块1和模块2,调用函数;

python 复制代码
# 导入自定义的模块1和模块2;
from py_self_module1 import  test
from py_self_module2 import  test

# 调用函数
print(test(1,2))

注意到实际是调用了自定义模块2的函数;


_ all _

若在模块的文件中有_all_变量,当使用from xxx import *导入时,只能导入这个列表中的元素;

案例

在自定义模块1py_self_module1.py中用_all_指定可访问的只有test函数时

python 复制代码
# 指定外部只能访问的内容
_ _all_ _ = ['test2'] = ['test2']

def test(a,b):
    """
    计算两数之和
    :param a:
    :param b:
    :return:
    """
    return a+b

def test2(a,b):
    """
    计算两数之差
    :param a:
    :param b:
    :return:
    """
    return a-b


# 可以测试模块的功能,
if __name__ == '__main__':
    print(test(1,2))
python 复制代码
# 导入自定义模块1
from py_self_module1 import *

print(test(1,2))
print(test2(1,2))



3.Python包


自定义python包

python包

  • 物理上看,包就是文件夹,在该文件夹下包含了一个_init_.py文件,该文件可以用于包含多个模块文件,
  • 逻辑上看,包的本质就是模块

包的作用

当模块文件越来越多时,包可以帮助我们去管理这些模块,包的作用就是包含多个模块,但是包的本质还是模块

案例练习

  • 新建self_package
  • 在新建包内部,创建py_self_module1.py和'py_self_module2.py'模块文件
  • 模块代码如下
python 复制代码
def test(a,b):
    """
    计算两数之和
    :param a:
    :param b:
    :return:
    """
    return a+b

导入包

  • 方式1 : import 包名.模块名
python 复制代码
import self_package.py_self_module1
  • 方式2: from 包名 import 模块名
python 复制代码
from self_package import py_self_module1
  • 方式3: from 包名.模块名 import 模块功能
python 复制代码
from self_package.py_self_module1 import test
print(test(1,2))

-方式4:_all_=[]控制允许导入的模块功能

注:这个适用于 from ... imoirt * 的导包方式

示例:在_init_文件放入

python 复制代码
__all__ = ['py_self_module1']

安装第三方包


第三方包

由于包可以包含一些Python的模块,而模块中有功能,

那么,一个包就是一堆同类型功能的集合体

在Python的生态中,有许多第三方包可以使用,例如:

  • 科学计数常用:numpy包;
  • 数据分析常用:pandas包;
  • 大数据计算常用:pyspark,apache-flink包;
  • 图形可视化常用:matplotlib,pyecharts包;
  • 人工智能常用:tensorflow包;

-pip安装:内置的安装程序命令;

打开命令提示符程序,输入 pip install 包名即可

若安装过慢,可使用镜像源

python 复制代码
pip install -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple 包名

PyCharm 内置安装




相关推荐
Autumn72992 小时前
【python】 日志打印、垃圾回收
开发语言·python
天呐草莓2 小时前
微信小程序应用开发
python·微信小程序·小程序
Blossom.1182 小时前
知识图谱与大模型融合实战:基于GNN+RAG的企业级智能问答系统
人工智能·python·深度学习·神经网络·微服务·重构·知识图谱
im_AMBER2 小时前
Leetcode 83 使数组平衡的最少移除数目中等相关标签 | 尽可能使字符串相等
数据结构·c++·笔记·学习·算法·leetcode
XFF不秃头2 小时前
力扣刷题笔记-组合总和
c++·笔记·leetcode
xian_wwq2 小时前
【学习笔记】安全模型
笔记·学习
Lvan的前端笔记2 小时前
python:列表推导式(List Comprehension)
开发语言·python·list
李小先2 小时前
supersonic——PARSING阶段
开发语言·python
爱学习的张大2 小时前
如何选择正确版本的CUDA和PyTorch安装
人工智能·pytorch·python