Python异常、模块与包

数据来源

01 异常

什么是异常

bug单词的诞生

异常演示

"""
主动写一段错误代码,演示异常的出现
"""
# 打开文件,不存在的文件  open(文件路径,操作方式,文件编码)  操作方式:r 只读打开 w 创建新的文件  a 追加文件内容
f = open('F:/bill11.txt','r',encoding="UTF-8")       # r 读取目标文件

总结

02 异常的捕获

为什么要捕获异常

捕获常规异常

演示

"""
演示捕获异常
"""
# 基本捕获语法(捕获所有异常)
try:
    # 可能出现异常的代码写到这块
    f = open('F:/bill11.txt','r',encoding="UTF-8")       # r 读取目标文件
except:
    # 异常处理代码
    print("出现异常了,因为文件不存在,我将open的模式,改成w模式去打开")
    f = open('F:/bill11.txt', 'w', encoding="UTF-8")     # w 创建文件

捕获指定的异常

演示 

# 捕获指定的异常
try:
    print(age)
except NameError as e:
    print("变量名称未定义异常")
    print(e)

捕获多个异常

演示

# 捕获多个异常
try:
    1 / 0
    print(age)
except (NameError,ZeroDivisionError) as e:
    print("变量未定义或除于0的异常")
    print(e)

异常 else

演示

# 捕获所有异常
try:
    # print(name)
    print("Hello")
except Exception as e:
    print("出现异常了")
else: # 可选
    print("好高兴,没有异常")

异常的 finally

演示

# 捕获所有异常
try:
    # print(name)
    f = open('F:/bill11.txt','r',encoding="UTF-8")       # r 读取目标文件
except:
    print("出现异常了,因为文件不存在,我将open的模式,改成w模式去打开")
    f = open('F:/bill11.txt', 'w', encoding="UTF-8")     # w 创建文件
else: # 可选
    print("好高兴,没有异常")
finally: # 可选
    print("无论是否有异常都会执行")
    f.close() # 无论是否有异常都会执行这句,关闭文件代码

总结

03  异常的传递性

演示

"""
演示异常的传递性
"""
# 定义一个出现异常的方法
def func01():  # 异常在func02没有被捕获
    print("这是func01开始")
    num =1 / 0   # 定义异常python不能除0
    print("这是func01结束")

# 定义一个无异常的方法,调用上面的方法
def func02():  # 异常在func02没有被捕获
    print("这是func02开始")
    func01()
    print("这是func02结束")

# 定义一个方法,调用上面的方法
def main():   # 异常在main中被捕获
    try:
        func02()
    except Exception as e:
        print(e)
main()

这个案例目的就是告诉我们,捕获异常是不需要深入到异常出现的地方,只需要在最后调用的函数捕获即可因为异常具有传递性

04 模块的概念与导入

什么是模块

模块的导入方式

import 模块名

演示 

"""
演示Python的模块导入
"""
# 使用import导入time模块使用sleep功能(函数)
import time # 导入Pyhon内置的模块(time.py这个代码文件。查看模块源代码:ctrl + 鼠标点击模块名)

print("开始")
# 让程序睡眠1秒(阻塞,暂停)
time.sleep(1)  # 模块名.功能名
print("结束")

from 模块名 import 功能名

演示

# 使用from导入time的sleep功能(函数)
from time import sleep
print("开始")
# 让程序睡眠1秒(阻塞,暂停)
sleep(1)  # 模块名.功能名
print("结束")

from 模块名 import *

# 使用*导入time的全部功能(函数)
from time import *  # *表示全部
print("开始")
# 让程序睡眠1秒(阻塞,暂停)
sleep(1)  # 模块名.功能名
print("结束")

as 定义别名 

演示 


# 使用as给特定功能加上别名
import time as t
# 或
from time import sleep as s
print("开始")
# 让程序睡眠1秒(阻塞,暂停)
# t.sleep(1)  # 模块名.功能名
s(1)  # 模块名.功能名
print("结束")

总结

05 自定义模块并导入

制作自定义模块

演示

创建一个.py文件如:my_module1.py,文件内容如下:

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

在另一个文件中引入自定义模块

"""
演示自定义模式
"""
# 导入自定义模块适应
import my_module1
my_module1.test(6,8)

注意事项 

演示 

再创建一个.py文件如:my_module2  内容如下

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

然后调用自定义模块

"""
演示自定义模式
"""
# 导入自定义模块适应
import my_module1
# 或
# from  my_module1 import test
# test(6,8)

# 导入不同模块的同名功能
from my_module1 import test
from my_module2 import test
test(10,4)

测试模块

__main__变量

演示

def test(a,b):
    print(a - b)
    
if __name__ == '__main__':  # 直接写main根据代码提示回车就能出来了
    test(10,6)

模块中运行 

调用模块的文件中运行,只会执行当前文件的代码模块中的测试代码没有执行

 __all__变量

演示

首先将自定义模块的内容改为:

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

def test_b(a,b):
    print(a - b)

然后调用模块

在自定义模块中使用  __all__ 变量

__all__ =["test_a"]  

调用模块

没有使用__all__变量之前模块的所有函数都可以使用,使用了__all__变量之后只能使用__all__变量指定的函数或方法,因为在外部文件调用的模块功能就是来自__all__变量。

注意:这个__all__变量只作用与from my_module2 import *的*号上,你手动指定函数或方法是不受__all__变量影响的

总结

06 自定义包

什么是 Python 包

快速入门

导入包

方式一:

演示

1)创建一个Python包

然后输入包名如:my_package

然后就可以在这个包下创建模块  

 

然后输入模块名如:my_module1   内容如下:

"""
自定义模块1
"""
def info_print1():
    print("我是模块1的功能函数代码")

再创建一个模块2 模块名称,如:my_module2    内容如下:

"""
自定义模块2
"""
def info_print2():
    print("我是模块2的功能函数代码")

调用包内的模块

"""
演示Python的包
"""
# 创建一个包
# 导入自定义包中的模块,并使用
import my_package.my_module1
import my_package.my_module2

my_package.my_module1.info_print1()
my_package.my_module2.info_print2()

print("------------或 使用 from的形式直接导入模块------------")
# 或 使用 from的形式直接导入模块
from my_package import my_module1
from my_package import my_module2

my_module1.info_print1()
my_module2.info_print2()

print("------------再或者直接到如模块内容对应的功能函数------------")
# 再或者直接到如模块内容对应的功能函数
from my_package.my_module1 import info_print1
from my_package.my_module2 import info_print2

info_print1()
info_print2()

导入包-方式2

演示

在__init__.py文件中使用__all__变量来控制  import * 方式导入的行为

__all__ = ["my_module1"]

调用模块验证一下

# 通过__all__变量,控制 import *
from  my_package import  *
my_module1.info_print1()
my_module2.info_print2()  # 在__all__变量中没有存入my_module2所以这里直接报错了

总结

07 安装第三方包

什么是第三方包

安装第三方的包 - pip

演示

window + R 输入:cmd打开命令提示符

首先确保你的电脑安装了Python,可以输入:python -V   # 测试,有版本号出现就是安装了,没有就去安装一下Java环境安装、python环境安装、Burpsuite安装_正经人_____的博客-CSDN博客

废话不多说直接安装python第三方包输入:pip install  第三方包名

例:pip install numpy
 

 检测包有没有安装成功

pip的网络优化

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名称

https://pypi.tuna.tsinghua.edu.cn/simple 是清华大学提供的一个网站,可供pip程序下载第三方包

安装第三方包- PyCharn

演示

-i https://pypi.tuna.tsinghua.edu.cn/simple 

总结

08 Python异常、模块、包:综合案例

演示

1)创建一个自定义包,名称为:my_utils(我的工具)

2)在包内提供2个模块

str_util.py ( 字符串相关工具,内含:)

  • 函数:str_reverse(s),接受传入字符串,将字符串反转返回
  • 函数:substr(s, x, y),按照下标x和y,对字符串进行切片

文件内代码 

def str_reverse(s):
    """
    str_reverse 字符串反转函数
    :param s: 接收传入的字符串
    :return: 返回反转后的字符串
    """
    my_str = s[::-1]  # 通过字符串切片操作把字符反转
    return my_str
def substr(s,x,y):
    """
    substr 接收字符串与开始索引、结束索引的切片函数
    :param s: 接收一个字符串
    :param x: 接收切片的开始索引
    :param y: 接收切片的结束索引,切片不包含结束索引的字符
    :return: None
    """
    my_str = s[x:y:1]
    print(f"切片后的字符串:{my_str}")

if __name__ == '__main__':   # 测试模块
    new_my_str = str_reverse("1,2,3,4,5,6,7,8")
    print(f"new_my_str:{new_my_str}")
    substr("123456789",1,6)

运行结果

 

file_util.py(文件处理相关工具,内含:)

  • 函数:print_file_info(file_name),接收传入文件的路径,打印文件的全部内容,如文件不存在则捕获异常,输出提示信息,通过finally关闭文件对象
  • 函数:append_to_file(file_name, data),接收文件路径以及传入数据,将数据追加写入到文件中
def print_file_info(file_name):
    """
    print_file_info ,打印文件内容的函数
    :param file_name: 接收传入文件的路径
    :return: Nane
    """
    try:
        f = open(file_name, 'r', encoding="UTF-8")  # r 读取目标文件
    except:
        print("出现异常了,因为文件不存在",file_name)
        f.close()  # 关闭文件
    else:  # 没有异常
        print(f"{f.read()}")
        f.close()  # 关闭文件

def append_to_file(file_name, data):
    """
    append_to_file  追加文件内容的函数
    :param file_name: 接收文件路径
    :param data: 接收要追加的文件数据
    :return: Nane
    """
    f = open(file_name, 'a', encoding="UTF-8")  # a 追加
    f.write(data)  # 内容写入到内存中
    f.flush()  #  # 将内存积攒的内容写入到电脑的硬盘文件中
    f_r = open(file_name, 'r', encoding="UTF-8")  # r 读取目标文件
    print(f"追加后的文件内容:{f_r.read()}")
    f.close()  # 关闭文件

if __name__ == '__main__':  # 测试模块
    print_file_info(file_name="F:/test.txt")
    append_to_file(file_name="F:/test.txt",data="\n你好,李银河")

运行结果 

 可以自己尝试调用使用模块的方法

猜你喜欢

转载自blog.csdn.net/weixin_43263566/article/details/129127747