文章目录
- 异常
- 异常简介
- 异常处理
- 捕获所有异常
- 捕获指定异常
- 捕获多个指定异常
- 异常else、finally
- 异常的传递
- 模块
- 模块导入
- 自定义模块
- 包
- 自定义python包
- 安装第三方python包
- 综合案例
异常
异常简介
异常就是程序运行过程中出现了错误
f = open('RLlearn_2.txt', "r", encoding='UTF-8')
下面上运行上面这段代码的结果
异常处理
捕获异常的作用在于:提前假设某处会出现异常,提前做好准备,当真的出现异常的时候,可以有后续手段
捕获所有异常
基本语法:
try:可能发生错误的代码
except:如果出现异常执行的代码
# eg
try:f = open('linux.txt', 'r')
except:f = open('linux.txt', 'w')
捕获所有异常的另一种写法
try:f = open('linux.txt', 'r')
except Exception as e:print("出现异常了")
捕获指定异常
基本语法:
try:print(name)
except NameError as e:print('name变量名称未定义错误')print(e)
捕获多个指定异常
将需要补获多个异常类型用元组组合起来
try:print(1/0)
except (NameError, ZeroDivisionError) as e:print('ZeroDivision错误...')
异常else、finally
else表示的是如果没有异常需要执行的代码,这是一个可选功能
try:f = open('linux.txt', 'r')
except Exception as e:print("出现异常了")
else:print("11111")
finally表示的是无论是否异常都要执行的代码
# 有异常代码
try:f = open('linu.txt', 'r')
except Exception as e:print("异常")
else:print("else")
finally:print('finally')
# 无异常代码
try:f = open('linux.txt', 'r')
except Exception as e:print("异常")
else:print("else")
finally:print('finally')
有异常执行结果:
无异常执行结果:
异常的传递
异常是具有传递性的
先看一下这段代码
def f1():print('f1 start')num = 1 / 0print('f1 end')
def f2():print('f2 start')f1()print('f2 end')
def main():try:f2()except Exception as e:print(e)
当函数f1中发生异常,并且没有捕获处理这个异常的时候,异常会传递到函数f2,当f2也没有捕获处理这个异常的时候,main函数会捕获这个异常,这就是异常的传递性,当所有函数都没有捕获异常的时候,程序就会报错
异常传递这个特性就使得我们可以在更高的调用层级去捕获异常,而并不一定需要在异常直接出现的位置捕获异常。
模块
模块导入
Python 模块**(Module),是一个Python文件**,以**.py**结尾,模块能定义函数、类和变量,模块里也能包含可执行代码
模块的作用:python中有很多各种不同的模块,每一个模块都可以帮助我们快速的实现一些功能,可以认为一个模块就是一个工具包,每个工具包中都有不同的工具供我们使用进而实现各种不同的功能
语法:
[from module_name] import [module | class | variable | function] [as other_name]
常见的组合形式
import module_name
from module_name import class、variable、function
from module import *
import module as other_name
from module_name import 功能名 as other_name
案例
通过import module_name
导入后,使用模块内的内容时需要module_name.
import timeprint(1)
time.sleep(5)
print(2)
通过from module_name import function_name
导入后,就可以不用 module_name.function_name
而是直接使用function_name
from time import sleepprint(1)
sleep(5)
print(2)
from module_name import *
是将module内的全部功能进行导入
from time import *
sleep(3)
起别名,有时候模块的名字或者function的名字过程可以通过as other_name
的方式给他们起别名
import time as t
t.sleep(2)
from time import sleep as sl
sl(2)
自定义模块
自定义模块就是自己写个python文件需要用的时候按照模块的导入正常导入就可以了
注意当导入多个模块的时候,并且模块内有同名功能,后导入的模块会覆盖前面的
if __name__ == '__main__'
可以用来测试模块,同时保证我们在别的python文件中导入模块的时候if条件里面的内容不会执行。
为什么可以呢?
# module.py文件
def test(a, b):return a + bif __name__ == '__main__':print(test(1, 2))
当我们运行module.py这个文件的时候,这时候python的内置变量
__name__就会成为’main’,而运行在其他python文件导入这个模块的时候,这时这个模块的name就不再是main了,于是if语句里面的内容就不会被执行
如果一个模块文件有——all——变量,当使用from xxx import *
导入时,只能导入列表中的元素。
包
自定义python包
python的包:
- 从物理上看,包就是一个文件夹,在该文件夹下包含了一个——init——.py文件,该文件夹可用于包含多个模块文件
- 从逻辑上看,包的本质依然是模块
于是乎,报的作用也就是,当我们的模块文件越来越多时候,包就可以帮助我们管理这些模块,包的作用就是包含多个模块,但包的本质依然是模块
pycharm中创建包
导入包
方式一:
import package_name.module_name
import package_name.module_name.function_name
方式二:
通过在——init——.py
中定义——all——
变量来控制import *
方式和上面的导入module一样
安装第三方python包
什么是第三方包:第三方包就是非Python官方内置的包,可以安装他们扩展功能,提高开发效率。
安装第三方包-pip
pip这个应用程序是内置在python中的,只要正常安装了python就可以正常使用pip
程序
但是可以看到虽然numpy在下载了,但是网速如龟速,这是因为pip默认都是连接的国外的网站在下载。
可以通过下面的命令来解决
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple package_name
https://pypi.tuna.tsinghua.edu.cn/simple这是清华大学提供的一个网站,可供pip程序下载第三方包
综合案例
str_util.py文件
def str_reverse(s):tmp = str()for i in s[len(s)-1:0:-1]:tmp = tmp + ireturn tmpdef substr(s, x, y):return s[x : y + 1 : 1]if __name__ == '__main__':print(str_reverse('123'))print(substr('1234578', 1, 5))
file_util.py文件
def printf_file_info(file_name):try:f = open(file_name, 'r', encoding='UTF-8')except:print('文件不存在')else:print(f.readlines())finally:f.close()def append_to_file(file_name, data):with open(file_name, 'a', encoding='UTF-8') as f:f.write(data)if __name__ == '__main__':printf_file_info('../1.txt')append_to_file('../1.txt', '\n Hello Python')