Python基础之模块:1、模块的导入和使用
一、模块
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('您选择的编号有误,请重新输入')
Python基础之模块:1、模块的导入和使用的更多相关文章
- Python基础(十)-模块
模块初识 一般把不同功能代码放到不同py文件,一个py文件就是一个模块 三种模块库: 1.Python标准库 2.第三方库 3.自定义库 导入模块:import 库名 (Python解释器只认识执行文 ...
- 第六章:Python基础の反射与常用模块解密
本课主题 反射 Mapping 介绍和操作实战 模块介绍和操作实战 random 模块 time 和 datetime 模块 logging 模块 sys 模块 os 模块 hashlib 模块 re ...
- python基础学习十 logging模块详细使用【转载】
很多程序都有记录日志的需求,并且日志中包含的信息既有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,主要用于输出 ...
- python基础(10)--模块
模块(module) 模块,用一坨代码实现了某个功能的代码集合 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来 ...
- Python基础(12)--模块
本文地址:http://www.cnblogs.com/archimedes/p/python-modules.html,转载请注明源地址. 模块简介 如果你退出 Python 解释器重新进入,以前创 ...
- python基础8之自定义模块、if __name__==__main__:解释
一.自定义模块与使用 python模块说明:类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...
- Python基础系列讲解——random模块随机数的生成
随机数参与的应用场景大家一定不会陌生,比如密码加盐时会在原密码上关联一串随机数,蒙特卡洛算法会通过随机数采样等等.Python内置的random模块提供了生成随机数的方法,使用这些方法时需要导入ran ...
- python基础教程总结9——模块,包,标准库
1. 模块 在python中一个文件可以被看成一个独立模块,而包对应着文件夹,模块把python代码分成一些有组织的代码段,通过导入的方式实现代码重用. 1.1 模块搜索路径 导入模块时,是按照sys ...
- Python基础语法05--函数模块
Python 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也 ...
- Python基础学习之常用模块
1. 模块 告诉解释器到哪里查找模块的位置:比如sys.path.append('C:/python') 导入模块时:其所在目录中除源代码文件外,还新建了一个名为__pycache__ 的子目录,这个 ...
随机推荐
- 【java】学习路径42-六种字符流使用实例
第一种 OutputStreamWriter OutputStreamReader 第二种 FileWriter FileReader 第三种 BufferedWriter BufferedReade ...
- bat-CSV文件转MD文件
目录 1. bat文件里面写死文件名 2. 拖入文件 1. bat文件里面写死文件名 @echo off & setlocal enabledelayedexpansion SET filep ...
- Spring_事务总结
Spring 事务总结 rollbackFor 设为 Exception.class场景下 如果在函数内部catch住异常消费掉,没有再抛出的话,不会回滚 如果catch住 然后原封不动抛出,会回滚 ...
- pat乙级每日习题
欢迎加入我们:qq群:1054587486 1:https://pintia.cn/problem-sets/994805260223102976/problems/99480532591848652 ...
- 系统无法启动inaccessible boot device
近日有一台Windows 2016遇到了系统无法启动的问题,出现错误inaccessible boot device.发现系统可以进入故障恢复模式,看来问题还不大.因为进入故障恢复模式的时候自动识别的 ...
- 跟羽夏学 Ghidra ——调试
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...
- 【gRPC】C++下使用CMakeLists快速构建项目
在gRPC中,编写.proto文件(protocol buffer文件)来定义RPC服务的接口是第一步 先通过proto的代码生成器编译生成pb.h.pb.cc.grpc.pb.h.grpc.pb.c ...
- MySQL主从同步报错故障处理记录
从库上记录删除失败,Error_code: 1032 问题描述:在master上删除一条记录,而slave上找不到,导致报错 Last_SQL_Error: Could not execute Del ...
- 添加 K8S CPU limit 会降低服务性能
文章转载自:https://mp.weixin.qq.com/s/cR6MpQu-n1cwMbXmVaXqzQ
- Beats:使用 Filebeat 导入 JSON 格式的日志文件
转载自:https://blog.csdn.net/UbuntuTouch/article/details/108504014 在今天的文章中,我来用另外的一种方式来展示如何导入一个 JSON 格式的 ...