Python模块介绍
Python模块,是Python程序中的一种可重用的代码组织形式。通过模块,可以将一组函数、类或变量组织在一起,并封装在模块中,以便在其他程序中使用。
模块可以包含可执行代码、函数、类和变量等。在Python中,模块的创建通常是为了实现某种特定的功能或任务,例如数据处理、网络编程、图形界面开发等。
使用模块的好处包括:
- 重用代码:你可以使用别人已经编写好的模块,无需从头开始编写代码。这样可以节省时间和精力,提高开发效率。
- 代码组织:通过将相关的代码组织在一个模块中,可以使代码更加清晰、易于维护和调试。
- 加密和保护:通过将核心代码放在模块中,可以保护你的代码不被他人轻易查看或修改。
- 功能封装:可以将复杂的功能封装在模块中,使其成为一个独立的功能单元,方便其他程序调用。
Python模块的分类
Python模块主要可以分为以下三类1:
- 内置模块。Python自带的模块,如
os
、sys
、random
等。 - 第三方模块。由非官方制作发布的、供给大众使用的Python模块等,如
requests
、numpy
、scapy
等。 - 自定义模块。用户自己编写的模块,包含特定的函数、类和变量等。
在Python中,一个文件(以“.py”为后缀名的文件)就叫做一个模块,每一个模块在python里都被看做是一个独立的文件。使用模块可以让我们组织代码,使得代码更具有可读性、可维护性,也可以实现代码的重用。
Python导入模块的方式
有以下三种:
- import 。让程序员按整体取得一个模块,只在第一次载入并运行模块中的代码,如果后续还有import操作,不会重新运行模块代码。
- from 。让程序员从一个模块中取得某些特定的部分。从另一个模块中用from导入函数或者属性,我们只是得到了拷贝,而不是对源对象的连接。这个时候修改这些属性,是不会修改源文件中的内容。而用import恰好可以其相反的效果。
- reload 。提供了一种无需停止Python程序就可以重载模块代码的方法。Python会在模块第一次导入的时候,把模块编译成对应的字节码文件。
判断文件类型
# 执行一个py文件的方式:
# 在cmd执行,在python执行 : 直接执行这个文件 - 以脚本的形式运行这个文件
# 导入这个文件
# 都是py文件
# 直接运行这个文件 这个文件就是一个脚本
# 导入这个文件 这个文件就是一个模块
# 当一个py文件
# 当做一个脚本的时候 : 能够独立的提供一个功能,能自主完成交互
# 当成一个模块的时候 : 能够被导入这调用这个功能,不能自主交互
# 一个文件中的__name__变量
# 当这个文件被当做脚本执行的时候 __name__ == '__main__'
# 当这个文件被当做模块导入的时候 __name__ == '模块的名字'
名字的查找顺序
1. 先从内存中查找
2. 再从内置模块中查找
3. 最后去环境变量sys.path中查找
以后遇到模块找不到的情况:
1. 把模块所在的路径添加到sys.path中
import sys
sys.path.append(r'D:\Python27\day20\aaa\bbb')
2. 使用from...import句式
from aaa.bbb.ccc import m1
from aaa.bbb.ccc.m1 import f1
相对导入和绝对导入
"""在导入模块的时候,模块的查找始终以执行文件所在的路径为准"""
绝对导入:
它始终是以执行文件所在的sys.path路径为基准查找
相对导入:
"""
.(句点符)
. 代表的是当前路径
.. 代表的是上一级路径
"""
# 相对导入可以打破始终以执行文件及准的查找顺序
from .ccc import m2
from .ccc.ddd import m2
只要py文件中出现了相对导入语句(.开头的语句),那么,这个文件就不能当成执行文件了,只能被导入
包的使用
什么是包?
就是文件夹,其实就是文件夹中包含了一些列的py文件(模块)
# 包就是一些列模块的组合
包和模块有什么区别呢?
包中有一个特殊文件:__init__.py文件
直接导入包 ,需要通过设计init文件,来完成导入包之后的操作
导入一个包
不意味着这个包下面的所有内容都是可以被使用的
导入一个包到底发生什么了?
相当于执行了这个包下面的__init__.py文件
绝对导入 :
在执行一个py脚本的时候,这个脚本以及和这个脚本同级的模块中只能用绝对导入
缺点
所有的导入都要从一个根目录下往后解释文件夹之间的关系
如果当前导入包的文件和被导入的包的位置关系发生了变化,那么所有的init文件都要做相应的调整
相对导入 :
不需要去反复的修改路径
只要一个包中的所有文件夹和文件的相对位置不发生改变
也不需要去关心当前这个包和被执行的文件之间的层级关系
缺点
含有相对导入的py文件不能被直接执行
必须放在包中被导入的调用才能正常的使用
import urllib # urllib是一个包,单纯的导入一个包啥也不会发生,包中的request.py也不能用
urllib.request
from urllib import request
print(request)
如果我们希望导入包的时候,能够顺便把模块也导入进来
需要设计init文件
绝对目录的导入\相对目录的导入各有千秋
软件开发目录规范
软件开发目录规范就是跟项目中得文件夹起合适的名字的!
项目名:
bin
# 放启动文件的 run.py start.py manage.py...
如果你的启动文件只有一个,也可以不要bin文件夹,可以把启动文件写在项目的跟下
conf (config:配置)
# 放项目的配置文件
settings.py
'''就是一些初始化的数据'''
core # 核心的
# 写一些项目的核心逻辑
src.py
def login():
pass
def register():
pass
lib # library 库
# 这个里面一般写项目使用的公共代码
common.py
def outer():
pass
log
# 日志:就是记录一些在代码运行过程中发生的一些事情,可以是正确的,可以是异常的
log.log
db
# database
跟项目相关的数据存储都存在db、data
api/
# 接口层
# 当你自定义文件夹名字的时候,一定要是见名知意, 一定不能出现中文的
setup.py # 安装模块使用的 python setup.py ...
|-- requirements.txt # 目前用不到--->
taobao
time
os
requests
xml
...
# 命令:
reqeusts == 1.11.1
xml = 1.1.1
# 命令:
|-- README
# 就是项目的说明书