模块
什么是模块?¶
模块就是一系列功能的集合体,分为三大类
- 内置模块
- 第三方模块
-
自定义模块(主要学习这部分的内容)
- 可以将程序的各部分功能提取出来放到一模块中为大家共享使用
- 好处是减少了代码冗余,程序组织结构更加清晰
模块的类型?(了解)¶
四种类型¶
- 一个python文件就是一个模块,文件名m.py,而模块名叫m
- 已被编译为共享库或DLL的C或C++扩展
- 把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,文件夹也可以称为包)
- 使用C编写并链接到python解释器的内置模块
Python文件的两种用途?¶
- 第一种:当成一个脚本直接来运行
- 第二种:当作模块倒入
import 导入模块¶
建议一行导入一个模块,不建议一行导入多个模块
导入顺序规范:
- 首选导入python的内置变量
- 第三方模块
- 自定义模块
!!! warning 命名规范: - 在 python3 中定义模块的命名应该采用纯小写+下划线的风格(在 python2 中有一些模块的命名是驼峰体)
模块别名
- import ... as ...
- import module as m (相当于m=module,使用场景: 当模块名字较为长就可以使用别名)
执行py文件与导入py文件的区别是什么?¶
- print(name),当做 module.py 文件被执行时候,这个值为__main__.
- print(name),当做 module.py 文件被模块导入时候,这个值为 module 模块名字
示例:
print(__name__) # 没有导入模块__name__ == '__main__'. 导入之后等于模块名称
if __name__ == '__main__':
get()
change()
else:
pass
优缺点¶
import 导入模块在使用时必须加前缀 ”模块.”
- 优点: 肯定不会和当前名称空间的名字冲突
- 缺点: 加前缀显得很麻烦
from...import.. 导入¶
import 导入模块在使用时不需要必须加前缀 ”模块.”
- 优点: 代码更精简
- 缺点: 容易与当前的名称空间混淆
补充¶
- from module import * (导入模块中所有名字)
- from mudule import m1,m2,,m3 (可以这么写,但是不推荐)
别名¶
- from module import foo as f 给 foo 起一个别名
模块查找优先级¶
优先级顺序:
- 内存
- 硬盘
import sys
print(sys.path) # 其中第一个文件夹永远都是 python 代码执行文件的文件夹
了解:
print(sys.modules) 查看内存中加载的模块
添加模块路径
# 将 module.py 的文件夹添加到环境变量中
sys.path.append(r'/Users/beiyiwangdejiyi/Desktop/lixie-work/python_lesson/module/modules')
import module
编写模块规范¶
#!/usr/bin/env python #通常只在类unix环境有效,作用是可以使用脚本名来执行,而无需直接调用解释器。
"The module is used to..." #模块的文档描述
import sys #导入模块
x=1 #定义全局变量,如果非必须,则最好使用局部变量,这样可以提高代码的易维护性,并且可以节省内存提高性能
class Foo: #定义类,并写好类的注释
'Class Foo is used to...'
pass
def test(): #定义函数,并写好函数的注释
'Function test is used to…'
pass
if __name__ == '__main__': #主程序
test() #在被当做脚本执行时,执行此处的代码
以下是一个关于模块的目录结构
$ tree code
code
└── module
├── main.py # 启动文件
└── mymodule.py # 自己写的模块
模块中会写一些自定义的函数功能.
$ cat code/module/mymodule.py
def greet(name):
return f"Hello, {name}!"
pi = 3.14159
启动文件中,直接 import 模块名称
,就可以调用模块中的函数方法
$ cat code/module/main.py
import mymodule
print(mymodule.greet("Barry"))
print(mymodule.pi)