模块、包和异常捕获
1. 模块
1.1 导入原理(模块、包)
- 导入模块的时候系统就会进入指定模块,将模块中的代码全部执行一遍。
import text # 打印开始 打印结束
1.2 if name == ‘main’
- 在这个if语句中的代码只会在直接执行当前模块的时候执行,在被别的模块导入的时候不会执行
text1.py
# text1.py
def download(name):
print('--------------------')
print(f'{name}开始下载')
print('监测网络状态')
print('连接服务器')
print('传输数据')
print('接收数据')
print(f'{name}下载成功')
# 在这个if语句中的代码只会在直接执行当前模块的时候执行,在被别的模块导入的时候不会执行
if __name__ == '__main__':
names = ['肖生克的救赎', '霸王别姬', '变形金刚', '蜘蛛侠', '钢铁侠', '阿甘正传']
for x in names:
download(x)
在导入该模块时:
from text1 import download
download('变形金刚')
在加入if name == ‘main’:前运行该代码会全部执行(全部下载)
在加入’if name == ‘main’:‘后,只会执行变形金刚
1.2 什么是模块
- python一个文件就是一个模块
1.3 怎么在一个模块中使用另外一个模块的内容
1)前提:如果想要在一个模块中使用另外一个模块中的内容,被使用的模块的模块名必须符合变量名的要求。
2)导入模块:
-
import 模块名 - 导入指定模块,导入后可以通过模块名.xxx的方式使用这个模块中所有的内容
-
from 模块名 import 内容1, 内容2, … - 导入指定模块,导入后可以直接使用指定内容。
-
from 模块名 import * - 导入指定模块,导入后可以直接使用模块中全部内容
-
import 模块名 as 新模块名 - 导入指定模块后对模块进行重命名,在使用时需要用新模块名
-
from 模块名 import 内容1 as 新内容1 - 对导入内容重命名
# ------------- a.导入方式1 ------------------
import text
print(text.a)
print(text.name)
text.f_test()
# ------------ b.导入方法2 --------------------
from text import a, f_test
print(a)
f_test()
print(name) # 没有导入,不能使用
# ------------ c.导入方法3 --------------------
from text import *
print(a)
print(name)
f_test()
------------ d.导入方法4 --------------------
import text as t1
text = 1000
print(t1.a)
print(t1.name)
t1.f_test()
# ------------ e.导入方法4 --------------------
name = '小花'
from text import name, a
print(name) # 小明
print('---------------------------华丽分割线-----------------------------')
from text import name, a
name = '小花'
print(name) # 小花
print('---------------------------华丽分割线-----------------------------')
from text import name as name1
name = '小花'
print(name)
print(name1)
2. 包
2.1 什么是包
包含__init__.py年的文件夹就是包
2.2 怎么使用包或者文件夹中模块的内容
1)import 包名 :
只适用于包)导入指定的包,导入后可以已通过包名.xxx去使用包中__init__.py文件中所有内容
# ------------------------ 导入方式1 ---------------------------
import files2
files2.f_test2() # 包中__init__中函数
print(files2.pi) # 3.14
2)from 包名 import 模块1, 模块2, …
导入指定包中指定模块,导入后可以通过’模块名.xxx’使用指定模块中内容
# ------------------------ 导入方式2 ---------------------------
from files2 import test2, test4
print(test2.msg)
print(test4.a)
from files import test1
print(test1.money)
3)from 包名 import 内容1, 内容2, …
(只适用于包)导入指定包中__init__.py文件中指定内容
from files2 import test2, pi, f_test2
print(pi)
print(f_test2())
4)import 包名.模块名
# ------------------------ 导入方式4 ---------------------------
import files2.test2 as t2
print(t2.msg)
5)from 包名.模块名 import 内容1, 内容2, …
# ------------------------ 导入方式5 ---------------------------
from files2.test2 import msg
print(msg)
from files2.abc import test3
print(test3.demo)
3. 异常捕获
3.1 异常
指程序中的错误
程序出现异常会直接让程序结束运行,在哪个位置出现异常,程序会在那个地方结束
print('+++++')
print('abc'[4]) # 程序在这里结束
print('-----')
print('=====')
3.2 异常捕获
- 让程序在出现异常的时候程序不结束还可以接着往后执行
1)语法结构1 - 捕获所有异常
try:
代码段1(需要捕获异常的代码)
except:
代码段2(出现异常后执行的代码)
finally:
代码段3(最后无论如何都会执行)
- 执行过程:先执行代码段1,执行段代码段1的时候如果没有出现异常就不执行代码段2,若有finally会执行finally代码段;如果出现异常 ,程序不报错,马上执行代码段2,且若有finally还会进入finally。
try:
age = int(input('请输入年龄:'))
print(age)
except:
print('年龄输入有误!')
# 当年龄输入无法转换成整型时,如18h,就不会报错会进入except的代码段打印年龄输入有误!
2)语法结构2 - 捕获指定类型异常
try:
代码段1(需要捕获异常的代码)
except 异常类型:
代码段2(出现异常类型后执行的代码)
finally:
代码段3(最后无论如何都会执行)
- 出现异常但不属于异常类型,没有被捕获到,依旧会执行finally
try:
age = int(input('请输入年龄:'))
print(age)
except ValueError:
print('年龄输入有误!')
finally:
print('!!')
- 当年龄输入无法转换成整型时,如果是valueError的错误类型,就进入except的代码段打印年龄输入有误!,并且还要运行finally的代码段,如果不是valueError的错误类型,会报错,若是有finally,会运行finally的代码段后再报错。
3)语法结构3 - 同时捕获多种异常
try:
代码段1(需要捕获异常的代码)
except (异常类型1, 异常类型2, ...):
代码段2(出现异常后执行的代码)
finally:
代码段3
try:
name = input('请输入姓名:')
name_1 = name[3]
print(name_1)
except (IndexError, KeyError):
print('年龄输入有误!')
4)语法结构4 - 根据不同异常处理不同
try:
代码段1(需要捕获异常的代码)
except 异常类型1:
代码段11
except (异常类型2,异常捕获22, ...):
代码段22
except 异常类型3:
代码段33
...
finally:
代码段3