python入门(九)——python异常、模块与包

上期文章

python入门(八)——python文件操作



一、了解异常

异常:当检测到一个错误时,python解释器就无法继续执行,反而出现一些错误的提示,也就是常说的bug,例如打开一个不存在的文件

二、异常的捕获方法

捕获异常的作用:提前假设某处会出现异常,做好提前准备,当真的出现异常时,可以有后续手段

捕获所有类型的异常

try:
	可能会发生错误的代码
except:
	如果出现异常执行的代码

try:
	可能会发生错误的代码
except Exception as e:
	如果出现异常执行的代码
# 尝试以r模式打开文件,如果文件不存在,则以w方式打开
try:
    f = open('比奇堡.txt', 'r')
except:
    f = open('比奇堡.txt', 'w')

捕获指定异常

# 指定捕获出现了变量未定义的异常 NameError
try:
	print(name) # name未定义
except NameError as e: # e是异常的对象
	print('name变量名称未定义错误')
	print(e)

name变量名称未定义错误
name 'name' is not defined

注意事项:

  • 如果尝试执行的代码异常类型和要捕获的异常类型不一致,则无法捕获异常
  • 一般try下方只放一行尝试执行的代码

捕获多个指定的异常

当捕获多个异常时,可以把要捕获的异常类型名字放到except后,并使用元组的方式进行书写

try:
	print(1/0)
	print(name)
except (NameError, ZeroDivisionError) as e:
	print('ZeroDivison错误...')
try:
    print(1/0)
    print(name)
except (NameError, ZeroDivisionError) as e:
    print('出现变量未定义或者除以0的异常错误')

异常else

else表示如果没有异常要执行的代码

try:
    print(1)
except Exception as e:
    print(e)
else:
	print('我是else,是没有异常的时候执行的代码')
try:
    print('hello world!')
except:
    print('出现异常!')
else:
    print('恭喜!没有出现异常!')

hello world!
恭喜!没有出现异常!

异常finally

finally表示无论是否出现异常都需要执行的代码,例如关闭文件

try:
    f = open('比奇堡.txt', 'r', encoding='UTF_8')
except:
    f = open('比奇堡.txt', 'w', encoding='UTF_8')
else:
    print('恭喜!没有出现异常!')
finally:
    print('无论是否出现异常,我都要执行!')
    f.close()

恭喜!没有出现异常!
无论是否出现异常,我都要执行!

异常的传递性

当函数func1中发生异常,并且没有捕获处理这个异常时,异常会传递到函数func2,当func2也没有捕获处理这个异常时,main函数会捕获这个异常,当所有函数都没有捕获异常时 ,程序会报错

可以直接在顶层函数中捕获异常

def func1():
    print('这是func1开始')
    num = 1 / 0
    print('这是func1结束')

def func2():
    print('这是func2开始')
    func1()
    print('这是func2结束')

def main():
    try:
        func2()
    except Exception as e:
        print(e)

main()

这是func2开始
这是func1开始
division by zero

三、python模块

python模块module是一个python文件,以.py结尾,模块能定义函数、类和变量,模块里也能包含可执行的代码

模块作用:python中有很多不同的模块,每个模块都可以实现特定的功能,比如实现和时间相关的功能可以使用time模块,模块相当于是一个工具包,每一个工具包都有各种不同的工具供我们使用进而实现各种不同的功能

总结:模块就是一个python文件,里面有类、函数、变量等,可以导入模块去使用,一般写在代码文件的开头位置

模块导入方式

# from和as可选可不选
[from 模块名] import [模块 || 变量 | 函数 | *] [as 别名]

# 常用组合形式如:
import 模块名
from 模块名 import 类、变量、方法等
from 模块名 import *
import 模块名 as 别名
from 模块名 import 功能名 as 别名

import模块名

import 模块名
import 模块名1,模块名2

模块名.功能名()

使用time里的所有功能

import time
print('欢迎来到')
time.sleep(5)
print('比奇堡!')

from 模块名 import 功能名

from 模块名 import 功能名
功能名()

使用time里的sleep功能

from time import sleep
print('开始')
sleep(1)
print('结束')

from 模块名 import *

from 模块名 import *

功能名()

使用time里的所有功能

from time import *
print('开始')
sleep(1)
print('结束')

as定义别名

# 模块定义别名
import 模块名 as 别名

# 功能定义别名
from 模块名 import 功能 as 别名
# 模块别名
import times as tt
tt.sleep(2)
print('hello')

# 功能别名
from time import sleep as sl
sl(2)
print('hello')

自定义模块

在这里插入图片描述
注意:每个python文件都可以作为一个模块,模块的名字就是文件的名字,自定义模块名必须要符合标识符命名规则

导入不同模块的同名功能

# 模块1(文件1)代码
def test(a, b):
	print(a + b)

# 模块2(文件1)代码
def test(a, b):
	print(a - b)

# 导入模块和调用功能代码
from model1 import test
from model2 import test
test(1, 2)

-1

注意事项:当导入多个模块且模块内有同名功能时,调用到的是后面导入的模块功能

python里会提示调用哪个模块的功能,如图模块2调用语句颜色更深,模块1调用语句颜色较浅,说明这里调用的是模块2的text功能
在这里插入图片描述

测试模块

在实际开发中,开发人员编写完一个模块后,为了让模块能在项目中达到想要的效果,开发人员会自行在py文件中添加一些测试信息,例如添加的测试代码test(1, 1),无论是当前文件还是其他已经导入该模块的文件,在运行的时候都会自动执行test函数的调用

解决方案

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

# 只在当前文件中调用该函数,其他导入的文件内不符合该条件,则不执行test函数调用
if __name__ == '__main__':
	test(1, 1)

在这里插入图片描述

all

如果一个模块里有–all–变量,当使用from xxx import *时,只能导入这个列表里的元素
在这里插入图片描述

四、python包

python包:物理上看,其实是一个文件夹,该文件夹包含了一个–init–.py的文件,该文件夹还包含多个模块文件;逻辑上看,包的本质依然是模块

注意:如果没有–init–.py文件,则只是一个普通的文件夹,有才是包
在这里插入图片描述
包的作用:当模块文件越来越多时,包可以帮助我们管理这些模块,即作用是包含多种模块,包的本质依然是模块

  • 新建包my_package
  • 新建包内模块,my_modulel1和my_modulel2

在这里插入图片描述
注意:新建包后,包内部会自动创建–init–.py文件,这个文件控制着包的导入行为

导入包

方法一

import 包名.模块名

包名.模块名.目标
# 方法一
import my_package.my_modulel1
import my_package.my_modulel2

my_package.my_modulel1.info_print1()
my_package.my_modulel2.info_print2()

# 方法二
from my_package import my_modulel1
from my_package import my_modulel2

my_modulel1.info_print1()
my_modulel2.info_print2()

# 方法三
from my_package.my_modulel1 import info_print1
from my_package.my_modulel2 import info_print2

info_print1()
info_print2()

1
2
my_modulel1
my_modulel2

方法二

在–init–.py文件中添加–all–=[ ],控制允许导入的模块列表

from 包名 import *  # 仅针对该导入模式
模块名.目标

在这里插入图片描述
注意:–all–只针对from xxx import *这种方式,对import xxx这种方式无效

安装第三方python包

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

第三方包

  • 科学计算中常用的:numpy包
  • 数据分析中常用的:pandas包
  • 大数据计算中常用的:pyspark、apache-fink包
  • 图形可视化场用的:matplotlib、pyecharts
  • 人工智能常用的:tensorflow

pip

只需要使用python内置的pip程序,输入:

pip install 包名称

pip网络优化

连接国内网站进行包的安装:

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

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

安装第三方包

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
options这里可以添加国内的网站:

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

异常—模块—包综合案例

创建一个自定义包,名称为: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),接收文件路径以及传入数据,将数据追加写入到文件中

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("happy"))
    print(substr("happy", 1, 3))

file_util.py


def print_file_name(file_name):
    """
    将给定路径的文件内容输出到控制台
    :param file_name:需要读取的文件路径
    :return:none
    """
    f = None
    try:
        f = open(file_name, 'r', encoding = 'UTF-8')
        content = f.read()
        print(content)
    except Exception as e:
        print(f"程序出现异常,原因是{e}")
    finally:
        if f:   # 如果变量是none,表示false,非文件对象不能调用close方法
            f.close()

def append_to_file(file_name, data):
    """
    将指定的数据添加到指定的文件中
    :param file_name: 指定的文件路径
    :param data:添加的数据
    :return:none
    """
    f = open(file_name, 'a', encoding = 'UTF-8')
    f.write(f"\n{data}")
    f.close()

if __name__ == '__main__':
    print_file_name('/Users/shenyanqi/Documents/pycharm项目/python快速入门/测试.txt')
    append_to_file('/Users/shenyanqi/Documents/pycharm项目/python快速入门/测试.txt', '欢迎来到比奇堡!')

案例.py

from my_utils import file_util
from my_utils import str_util

print(str_util.str_reverse("欢迎来到比奇堡!"))
print(str_util.substr("欢迎来到比奇堡!", 1, 3))

file_util.append_to_file('/Users/.../Documents/pycharm项目/python快速入门/测试.txt', '欢迎来到比奇堡!')
file_util.print_file_name('/Users/.../Documents/pycharm项目/python快速入门/测试.txt')

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值