day14 模块
课程目标:掌握Python中常用模块的使用方法。
今日概要:
- 自定义模块(包)
- 第三方模块
- 内置模块【1/2】
1. 自定义模块
1.1 模块和包
import hashlib
def encrypt(data):
""" 数据加密 """
hash_object = hashlib.md5()
hash_object.update(data.encode('utf-8'))
return hash_object.hexdigest()
user = input("请输入用户名:")
pwd = input("请输入密码:")
md5_password = encrypt(pwd)
message = "用户名:{},密码:{}".format(user, md5_password)
print(message)
在开发简单的程序时,使用一个py文件就可以完成,但如果程序比较庞大,此时为了代码结构清晰,将功能按照某种规则拆分到不同的py文件中,使用时再去导入即可。另外,当其他项目也需要此项目的某些模块时,也可以直接进行调用,增加重用性。
如果按照某个规则进行拆分,发现拆分到 commons.py
中函数仍然太多,也可以通过文件夹来进行再次拆分,例如:
├── commons
│ ├── convert.py
│ ├── page.py
│ └── utils.py
└── run.py
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pAfNFp3t-1648881373964)(assets/image-20220401205537647.png)]
在Python中一般对文件和文件夹的称呼:
- 一个py文件:模块(module)。
- 含多个py文件的文件夹:包(package)。
注意:在包(文件夹)中有一个默认内容为空的__init__.py
的文件,一般用于描述当前包的信息,另外,在导入它下面的模块时,__init__.py
也会自动加载。
- Python2 中必须要有
__init__.py
文件,否则将无法正常导入包。 - Python3 中
__init__.py
文件可有可无。
1.2 导入
当定义好一个模块或包之后,如果想要使用其中定义的功能,必须要先导入,才能使用。
导入,其实就是将模块或包加载的内存中,以后再去内存中去取。
1.2.1 关于导入模块或包时的路径:
在Python内部默认设置了一些路径,导入模块或包时,都会按照指定顺序逐一去特定的路径查找。
# 通过输出sys.path可以指定系统默认寻找的路径有哪些:
import sys
print(sys.path)
>>输出结果:
[
'C:\\Pycharm_files\\pythonProject\\day14',
'C:\\pythonpath',
'C:\\Program Files\\Python39\\python39.zip',
'C:\\Program Files\\Python39\\DLLs',
'C:\\Program Files\\Python39\\lib',
'C:\\Program Files\\Python39',
'C:\\Program Files\\Python39\\lib\\site-packages',
'C:\\Program Files\\Python39\\lib\\site-packages\\win32',
'C:\\Program Files\\Python39\\lib\\site-packages\\win32\\lib',
'C:\\Program Files\\Python39\\lib\\site-packages\\Pythonwin'
]
如果想要导入任意的模块和包,都必须写在以上的路径下,才能被找到。当然,如果模块或包不在该路径,也可以手动在 sys.path 中添加指定路径,然后再导入:
# 导入路径A下的一个xxxx.py文件
import sys
sys.path.append("路径A")
import xxxxx
注意:
-
创建自定义模块名称时,千万不能和内置模块或第三方模块的同名,否则容易导致模块冲突而报错。
-
项目执行文件一般都在项目根目录,如果执行文件在根目录下嵌套的其他目录中,就需要手动在 sys.path 中添加路径,否则无法导入模块或包。
-
pycharm中默认会将项目的根目录加入到 sys.path 中
1.2.2 关于导入的方式:
导入本质上是将某个文件中的内容先加载到内存中,然后再从内存中去取用。而在Python开发中常用的导入的方式有两种,每种方式又有多种情况:
1.2.2.1 第一类:import xxxx(一般多用于导入 sys.path 目录下的一个py文件)
-
模块级别
├── commons │ ├── __init__.py │ ├── convert.py │ ├── page.py │ ├── tencent │ │ ├── __init__.py │ │ ├── sms.py │ │ └── wechat.py │ └── utils.py ├── many.py └── run.py
-
包级别
├── commons │ ├── __init__.py │ ├── convert.py │ ├── page.py │ └── utils.py ├── third │ ├── __init__.py │ ├── ali │ │ └── oss.py │ └── tencent │ ├── __init__.py │ ├── __pycache__ │ ├── sms.py │ └── wechat.py └── run.py
1.2.2.2 第二类:from xxx import xxx(一般适用于导入包中嵌套的某个模块或导入模块中嵌套的某个功能)
-
功能级别
├── commons │ ├── __init__.py │ ├── convert.py │ ├── page.py │ └── utils.py ├── many.py └── run.py
提示:基于from模式也可以支持 from many import *
,即:导入一个模块中所有的功能(可能会重名,所以用的少)。
-
模块级别
├── commons │ ├── __init__.py │ ├── convert.py │ ├── page.py │ └── utils.py ├── many.py └── run.py
-
包级别
├── commons │ ├── __init__.py │ ├── convert.py │ ├── page.py │ ├── tencent │ │ ├── __init__.py │ │ ├── sms.py │ │ └── wechat.py │ └── utils.py ├── many.py └── run.py