一、模块
1、简介
-
本质:
模块是指内部具有一定功能(代码)的py文件 -
发展历史:
- 前期:在python刚开始的时候其他编程语言都看不起python,认为python是’掉包侠‘
- 后期:随着市场发展有更多人了解python,这时python‘掉包侠’的外号从贬义词变为了褒义词
2、模块的表现形式
- 1、py文件(py文件也可以称之为是模块文件)
- 2、含有多个py文件的文件夹(按照模块功能的不同划分不同的文件夹储存)
- 3、已被编译为共享库或DLL的C或C++扩展
- 4、使用C编写并链接到python解释器的内置模块
二、模块的分类
1、自定义模块
- 此类模块是我们自己编写的模块文件
2、内置模块
- python内置模块,不需要下载,只要在py文件内部调用就可使用
3、第三方模块
- 是从网络上下载的模块,此类模块功能比较强大,是python背后的大佬进行编写,上传后供我们使用的模块
三、导入模块的句式
学前须知:
- 1、执行文件:运行代码的主文件
- 2、被导入文件:指存放模块的文件,需要导入在执行文件
- 3、以后在编写代码时,py文件的名称一般是纯英文,不会含有中文或空格
- 4、被导入的模块文件不需要填写后缀名
1、import句式
关键词:import
导入用法:
import 模块名
优点:
1、可以一次性导入所有模块名称空间中名字
2、需要模块名加点的方式才能调用,不易弄混
缺点:
1、必须要模块名加点的方式才能调用,比较麻烦
'''
底层原理:
1、先产生执行文件的空间名称
2、执行被导入文件的代码,将产生的名字放入被导入文件的名称空间中
3、在执行文件的名称空间中产生一个模块的名字
4、在执行文件中使用该模块名加点的方式使用模块名称空间中的所有名字
'''
2、from...import...句式
关键词:from...import...
导入用法:
from 文件地址/文明名 import 文件名/名称空间名字
from也可以通过*号的方式来导入所有模块内的名字
在模块中可使用__all__的方式来限制*号导入名字,只有在__all__后方列表内的名字才能
被*号使用
'''
底层原理:
1.先产生执行文件的名称空间
2.执行被导入文件的代码将产生的名字放入被导入文件的名称空间中
3.在执行文件的名称空间中产生对应的名字绑定模块名称空间中对应的名字
4.在执行文件中直接使用名字就可以访问名称空间中对应的名字
'''
优点:
1、可以指名道姓的调用模块中需要的名字
缺点:
1、调用时容易弄混
3、补充说明
-
起别名
- 可以通过以上两种句式在导入模块名的后方加as修改模块名
-
一次性导入多个模块
- 可以使用逗号的方式一次性导入多个模块,在模块功能相似度不高的情况下不推荐使用
四、循环导入问题
1、循环导入
- 循环导入是指两个文件之间相互导入,并且相互使用各自名称空间中的名字
2、如何解决循环导入问题
-
1、确保名字在使用前就已经准备完毕
- 这种方式可能会出现代码循环执行多次的请款
- 2、这种情况非常容易报错,在以后的使用当中,如果无特殊情况尽量避免这种情况发生
五、判断文件类型
所有的py文件都可以运行 __name__ 运行后所对应的值是 __main__,但当我们运行的是导入文件时,系统则会返回给我们模块名
我们在开发模块阶段,会使用模块名来测试模块的功能,如果直接使用名称调用的话,这样别人在导入模块后会直接使用模块中的名字,造成诸多不便,由此,我们可以得出,使用if设置条件来将名称作为子代码执行条件,这样模块被导入后就不会直接运行
if __name__ == __ main__:
测试名称1...
测试名称2...
测试名称3...
'''
应用场景:
1、模块开发阶段
2、项目启动文件
'''
六、模块查找顺序
1、内存
-
在导入模块时,python会首先在内存中查找模块名,当系统中无此模块名的时候会报错
2、内置空间
- 在我们导入模块时要避免模块名和内置模块名冲突的问题,若自定义模块和内置模块名冲突时,系统只会执行内置模块功能,执行自定义模块功能时,系统会报错
3、执行python所在的sys.path(系统环境)
-
1、当我们导入的模块在上述空间中都没有找到时,pycharm会到py执行文件所在的sys.path中寻找,所有我们在导入模块时,需要将添加至执行文件所在的sys.pach目录中!
-
2、可通过打印sys.pach的方式来查看执行文件所在的地址
- 3、可通过sys.pach.append的方式来将模块文件导入到执行文件的目录中
七、绝对导入与相对导入
1、绝对导入
绝对导入是指以执行文件所在目录为绝对路径的方式,将模块地址导入到py文件中
导入方式:
from 模块地址 import 模块名称/名称空间名字
2、相对导入
这种导入方式不是以sys.path目录为相对路径,导入的其他模块中需要导入的地址是相对于模块的位置,这种话方式可以通过点的方式简写
- . # 表示当前目录
- ... # 表示路径中上一层目录
- .. \ .. # 表示上上一层目录
注意事项:
在执行中无法使用相对导入,这种方式会式系统报错
八、包
- 1、指含有多个py文件的集合
- 2、专业:内部含有__ init__.py文件的文件夹(python2必须要求 python3无所谓)
九、练习题
将员工管理系统生成模块后运行。。。。
Administrator = 'kang|111' # 管理员账户
adm = 'b' # 管理员登录状态
user_name_dict = {
'10086': {'user_id': '10086', 'user_name': 'xiaokang', 'user_paw': '123', 'user_sex': '男', 'user_age': '18',
'user_post': 'IT', 'user_pay': '100000'},
'10010': {'user_id': '10010', 'user_name': 'zhangzhang', 'user_paw': '123', 'user_sex': '男', 'user_age': '18',
'user_post': 'IT', 'user_pay': '100000'},
'123456': {'user_id': '123456', 'user_name': 'zhaozhao', 'user_paw': '123', 'user_sex': '男', 'user_age': '18',
'user_post': 'IT', 'user_pay': '100000'},
'112233': {'user_id': '112233', 'user_name': 'xiaolv', 'user_paw': '123', 'user_sex': '女', 'user_age': '18',
'user_post': 'IT', 'user_pay': '100000'}
} # 用户账户
state = 'wrong' # 用户登录状态
def outer(func):
def inner(*args, **kwargs):
res = func(*args, **kwargs)
return res
return inner
@outer
def login():
'''员工注册系统'''
while True:
administrator_name = input('请管理员账号(Q退出)>>>:').strip().lower()
if administrator_name == 'q':
break
administrator_paw = input('请输入管理员密码>>>:').strip()
administrator_name_paw = administrator_name + '|' + administrator_paw
if administrator_name_paw == Administrator:
global adm
adm = 'a'
user_id = input('请创建员工编号(Q退出)>>>:').strip().lower()
if user_id == 'q':
break
if not user_id.isdigit():
print('编号有误,只能是数字')
elif user_id in user_name_dict:
print('该编号已存在,请重新注册')
else:
user_name = input('请输入员工姓名>>>:').strip()
user_paw = input('请输入员工登录密码>>>:').strip()
user_sex = input('请输入员工性别>>>:').strip()
user_age = input('请输入员工年龄>>>:').strip()
user_post = input('请输入员工岗位>>>:').strip()
user_pay = input('请输入员工薪资>>>:').strip()
if not user_pay.isdigit() and not user_age.isdigit():
print('您输入的年龄或薪资有误,只能是纯数字')
else:
briefly_dict = {}
briefly_dict['user_id'] = user_id
briefly_dict['user_name'] = user_name
briefly_dict['user_paw'] = user_paw
briefly_dict['user_sex'] = user_sex
briefly_dict['user_age'] = user_age
briefly_dict['user_post'] = user_post
briefly_dict['user_pay'] = user_pay
user_name_dict[user_id] = briefly_dict
print(f'员工{user_name}添加完成')
break
else:
print('管理员账号或密码错误')
break
@outer
def adm_register():
'''管理登录系统'''
while True:
global adm
if adm == 'a':
print('管理员账户已登录,请勿重复登录')
break
adm_name = input('请输入管理员账号(Q退出)>>>:').strip().lower()
if adm_name == 'q':
break
adm_paw = input('请输入管理员登录密码>>>:').strip()
adm_name_paw = adm_name + '|' + adm_paw
if adm_name_paw == Administrator:
print('管理员用户登录成功')
adm = 'a'
break
else:
print('用户名或密码错误')
@outer
def register():
'''员工登录系统'''
while True:
if adm == 'a':
adm1 = input('已登录管理员账户,无法重复登录(Y:返回上一步)').strip().lower()
if adm == 'y':
break
global state
if state == 'correct':
print('已登录,请勿重复登录')
user_id = input('请输入您的用户编码(Q退出)>>>:').strip().lower()
if user_id == 'q':
break
user_paw = input('请输入您的登录密码>>>:').strip()
if user_id in user_name_dict and user_paw == user_name_dict[user_id]['user_paw']:
print(f"用户{user_name_dict[user_id]['user_name']}登录成功")
state = 'correct'
break
else:
print('用户名或密码错误')
@outer
def amend_pay():
'''修改薪资'''
while True:
if adm == 'a':
user_id = input('请输入员工编号(Q退出):').strip().lower()
if user_id == 'q':
break
if user_id in user_name_dict:
global user_pay
user_pay = input('请输入修改后的薪资>>>:').strip()
user_name_dict[user_id]['user_pay'] = user_pay
print(f"员工{user_name_dict[user_id]['user_name']}薪资成功修改为{user_pay}元")
break
else:
print('员工编号有误,请重新输入')
break
else:
print('管理员账户未登录,其余人员无权修改薪资')
break
@outer
def amend_post():
'''修改岗位'''
while True:
if adm == 'a':
user_id = input('请输入员工编号(Q退出):').strip().lower()
if user_id == 'q':
break
if user_id in user_name_dict:
global user_post
user_post = input('请输入调整后的岗位>>>:').strip()
user_name_dict[user_id]['post'] = user_post
print(f"员工{user_name_dict[user_id]['user_name']},岗位已调整为{user_post}")
break
else:
print('员工编号输入有误,请重新输入')
else:
print('管理员账户未登录,其余人员无权修改岗位')
break
@outer
def message():
'''查看员工信息'''
while True:
if adm == 'a' or state == 'correct':
user_id = input('请输入需要查看信息的员工编号(Q退出):').strip().lower()
if user_id == 'q':
break
if user_id in user_name_dict:
print(f'''
-----------------------------------
姓名:{user_name_dict[user_id]['user_name']}
编号:{user_id}
性别:{user_name_dict[user_id]['user_sex']}
年龄:{user_name_dict[user_id]['user_age']}
岗位:{user_name_dict[user_id]['user_post']}
薪资:{user_name_dict[user_id]['user_pay']}
-------------------------------------
''')
else:
print('系统未登录,请登陆后查看')
break
@outer
def logout():
'''注销登录功能'''
global adm, state
adm = 'b'
state = 'wrong'
print('退出登录成功')
execute_dict_ = {
'1': login,
'2': adm_register,
'3': register,
'4': amend_pay,
'5': amend_post,
'6': message,
'7': logout
}
def start():
while True:
print('''
------------------------------
1. 员工注册系统 (高级权限)
2. 管理员登录系统
3. 员工登录系统
4. 修改员工薪资 (高级权限)
5. 修改员工岗位 (高级权限)
6. 查看员工信息
7. 退出登录
------------------------------
''')
execute = input('请输入您需要执行的功能编号(Q退出)>>>:').strip().lower()
if execute in execute_dict_:
execute_dict_[execute]()
else:
print('您选择的编号有误,请重新输入')