【嵌入式学习4】模块、包、内置模块、异常
目录
1、模块
①创建模块文件
②导入模块
2、模块导入冲突
①局部引入冲突及解决方案
②全部引入冲入及解决方案
3、模块的内置变量__name__
__name__的作用
4、包
①引入包中模块功能:import 包名.模块名
②引入包中模块功能:from 包名 import 模块名
③引入包中模块功能:from 包名.模块名 import 变量,函数,类
④引入包中模块功能:from 包名.模块名 import *
5、开启本地http文件分享服务
6、系统内置模块
①sys模块
②time模块
③datetime模块
④计算排序
⑤math模块
⑥random模块
7、exception异常
①捕获异常
②finally
③try except finally
④try except else finally
⑤多重捕获
⑥常见异常类型
1、模块
类似于写一个单独出来的.py文件,再将其作为模块导入进主文件。
①创建模块文件
"""
模块名utils.py
"""
# 定义变量
name = '张三'
# 定义函数
def sum(a,b):
return a+b
# 定义类
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
def __str__(self):
return 'name:{},age:{}'.format(self.name,self.age)
②导入模块
"""
整体导入模块
"""
import utils
# 使用模块中功能
print(utils.name)
# 调用模块中的sum方法
result = utils.sum(10,20)
# 创建模块utils中的Person类对象
p = utils.Person('张三',30)
"""
导入模块部分功能
"""
from utils import name, sum
# 使用name
print(name)
# 调用sum函数
result = sum(10,20)
"""
导入模块全部功能
"""
from utils import *
# 使用name
print(name)
# 调用sum函数
result = sum(10,20)
# 创建Person对象
p = Person('李云龙',60)
2、模块导入冲突
如果两个模块中有同名的变量、函数或者类,同时引入就可能出现冲突
①局部引入冲突及解决方案
# 同时引入name的话,输出的name是hi中的name,是有顺序的
from hello import name
from hi import name
print(name)
# 局部引入冲突解决方法:用as起别名
from hello import name as hello_name
from hi import name as hi_name
print(hello_name)
print(hi_name)
②全部引入冲入及解决方案
from hello import *
from hi import *
print(name) # 输出的是hi中的name属性
# 解决方案:直接引入模块
import hello
import hi
print(hello.name)
print(hi.name)
3、模块的内置变量__name__
由下面的例子可以得知:
- 如果当前模块作为启动项,__name__ 值为 __main__
- 如果当前模块当作依赖引入,__name__ 值不为 __main__,为依赖的模块名称
# ①
# 创建hello.py
print(__name__)
# 结果为 __main__
# ②
# 导入其他模块hello.py
import hello
print(__name__)
# 结果为 hello
__name__的作用
python没有入口函数的概念,可将主程序代码放入if __name__ = '__main__':中,当前模块即可以独立测试运行,也可以被其他文件导入使用。
def sum(m,n):
return m+n
if __name__ == '__main__':
a = 10
b =20
result = sum(a,b)
print(result)
4、包
用来放模块的文件夹,限定模块命名空间,管理模块让业务更加清晰
network包:可以用来管理网络访问
cart模块中,可以提供购物车的增删改查功能
product中,可以提供商品的查看功能
user模块中,可以提供登录,注册等功能
storage包:可以用来管理本地存储
cart模块中,可以提供购物车存储功能
product中,可以提供商品存储功能
user模块中,可以提供用户信息存储功能
①引入包中模块功能:import 包名.模块名
import pkg.hello
#访问模块中的属性
print(pkg.hello.name)
#访问模块中的函数
pkg.hello.say()
#访问模块中的类
nice = pkg.hello.Nice()
②引入包中模块功能:from 包名 import 模块名
from pkg import hello
#访问模块中的属性
print(hello.name)
#访问模块中的函数
hello.say()
#访问模块中的类
nice = hello.Nice()
③引入包中模块功能:from 包名.模块名 import 变量,函数,类
from pkg.hello import name
from pkg.hello import say
from pkg.hello import Nice
#访问模块中的属性
print(name)
#访问模块中的函数
say()
#访问模块中的类
nice = Nice()
④引入包中模块功能:from 包名.模块名 import *
from pkg.hello import *
#访问模块中的属性
print(name)
#访问模块中的函数
say()
#访问模块中的类
nice = Nice()
5、开启本地http文件分享服务
python -m http.server 8080
-
这个命令会启动一个简单的 HTTP 服务器,监听指定的端口(在这里是 8080)
-
它会将当前目录及其子目录中的文件作为静态资源提供给客户端访问
-
如果当前目录下有一个名为
index.html
的文件,客户端可以通过浏览器访问http://localhost:8080/index.html
来查看该文件
6、系统内置模块
①sys模块
- sys.argv:获取启动时的参数
import sys
print("脚本名称:", sys.argv[0])
print("参数列表:", sys.argv[1:])
"""
运行脚本时:
python script.py arg1 arg2
输出:
脚本名称: script.py
参数列表: ['arg1', 'arg2']
"""
- sys.path:获取加载的环境
import sys
print("模块搜索路径:", sys.path)
"""
可以修改sys.path来动态添加模块搜索路径,可以将新的路径添加到模块搜索路径的末尾
sys.path.append("/path/to/my/module")
"""
import sys
# 添加新的模块搜索路径
sys.path.append('/path/to/your/module')
# 现在可以导入该路径下的模块
import your_module
- sys.exit():程序退出
import sys
if __name__ == "__main__":
print("程序开始运行")
sys.exit(0) # 正常退出
print("这行代码不会被执行")
②time模块
该模块包含和时间相关的信息
import time
result = time.time() # time.time()获取当前时间戳,单位是秒
print(result)
import time
# print('程序开始')
time.sleep(3) # 睡眠3秒钟,阻断程序
# print('程序结束')
③datetime模块
"""
datetime获取日期
datetime.datetime.now().year
datetime.datetime.now().month
datetime.datetime.now().day
"""
import datetime
# 获取当前年
year = datetime.datetime.now().year
# 获取月
month = datetime.datetime.now().month
# 获取日期
day = datetime.datetime.now().day
print(year)
print(month)
print(day)
# 格式化日期时间
"""
strftime() 是 datetime.datetime 类的一个方法,用于将日期和时间对象格式化为字符串。
datetime_object.strftime(format_string)
"""
now = datetime.datetime.now()
str_time = datetime.datetime.strftime(now, "%Y-%m-%d %H:%M:%S")
④计算排序
aaa = [2, 4, 1, 2, 3, 6]
# 列表最大值
print(max(aaa))
# 列表最小值
print(min(aaa))
# 列表和
print(sum(aaa))
# 列表长度
print(len(aaa))
# 列表排序
print(sorted(aaa))
# 列表倒序
print(sorted(aaa, reverse=True))
⑤math模块
import math
# 幂
print(math.pow(10, 2))
# 向下取整
print(math.floor(1.8234234234234))
# 向上取整
print(math.ceil(1.1234234234234))
# 四舍五入
print(round(1.6234234234234))
# sin 传入弧度值 pi 3.14 180度
print(math.sin(1.57))
⑥random模块
import random
# 随机整数
print(random.randint(10, 20))
# 随机小数 [0, 1)
print(random.random())
# 随机浮点类型数据,random.uniform(start,end)
print(random.uniform(1.3, 8.5))
# 从列表中随机获取元素
lst = [10,20,30]
print(random.choice(lst))
# 随机返回列表 返回单个元素的列表
print(random.choices(lst))
7、exception异常
①捕获异常
try:
代码
except:
出现异常的代码
try:
result = a/b
print('没有异常',result)
except Exception as error:# 如果代码有异常会执行 ,没有异常并不会执行
print('出现了异常',error)
②finally
try:
逻辑代码
finally:
无论是否出现异常,都会执行
try:
a = 1 / 0
print("异常之后的代码", a)
finally:
print("finally里的代码")
③try except finally
try:
逻辑代码
except Exception as error:
print(error)
finally:
无论是否出现异常,都会执行
-------
# 无论文件是否操作失败,最终都需要关闭文件,所以把文件关闭的方法放到finally中
f = open('a.txt','w')
try:
f.write('hello')
# 出现异常
a = 10
b = 0
re = a/b
except:
print('出现异常')
finally: # 即使程序出现异常 finally里面的代码也可以继续执行
# 必须要关闭 内存泄漏
f.close()
print('文件已经关闭了')
④try except else finally
try:
逻辑代码
except Exception as error:
print(error)
else:
没有出现异常的逻辑
finally:
无论是否出现异常,都会执行
-----
a = 10
b = 0
try:
result = a / b
print(result)
except:
print('出异常')
else:
print('没有出异常')
finally:
print('最终执行的代码')
⑤多重捕获
# 可以通过多个except捕获不同的异常分别处理
try:
a = 1 / 0
b = [1, 2]
c = b[4]
except IndexError as error:
print("indexerror 错误逻辑")
except ZeroDivisionError as error:
print(error)
⑥常见异常类型
IndexError | 数组下表越界异常 |
KeyError | 字典中键不存在 |
ValueError | 值类型错误 |
AttributeError | 对象中属性、函数不存在 |