什么是模块
模块是一系列功能的集合体,而函数是某一个功能的集合体,因此模块可以看成是一堆函数的集合体。一个py文件内部就可以放一堆函数,因此一个py文件就可以看成一个模块。如果这个py文件的文件名为module.py,模块名则是module。
模块的四种方式
Python中,总共有以下四种形式的模块: 自定义模块:如果你自己写一个py文件,在文件内写入一堆函数,则它被称为自定义模块,即使用python编写的.py文件 第三方模块:已被编译为共享库或DLL的C或C++扩展 内置模块:使用C编写并链接到python解释器的内置模块 包:把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)
为什么要用模块
用第三方或者内置的模块是一种拿来主义,可以极大地提升开发效率。
自定义模块,将我们自己程序中用到的公共功能,写入一个python文件,然后程序的各部分组件可以通过导入的方式来引用自定义模块的功能。
如何用模块
一般我们使用import和from...import...导入模块。
import 模块名
import首次导入模块发生了3件事:
- 以模块为准创造一个模块的名称空间
- 执行模块对应的文件,将执行过程中产生的名字都丢到模块的名称空间
- 在当前执行文件中拿到一个模块名
模块的重复导入会直接引用之前创造好的结果,不会重复执行模块的文件,即重复导入会发生:spam=spam=模块名称空间的内存地址
导入模块的规范
""" 1.只要你能拿到函数名 无论在哪都可以通过函数加括号来调用这个函数(会回到函数定义阶段 依次执行代码) 2.函数在定义阶段 名字查找就已经固定死了 不会因为调用位置的变化而改变 使用import导入模块 访问模块名称空间中的名字统一句势:模块名.名字 1.指名道姓的访问模块中的名字 永远不会与执行文件中的名字冲突 2.你如果想访问模块中名字 必须用模块名.名字的方式 """ """ 只要当几个模块有相同部分或者属于用一个模块,可以使用上面的方法 当几个模块没有联系的情况下 应该分多次导入 import os import time import md ps:通常导入模块的句式会写在文件的开头 """ """ 当模块名字比较复杂的情况下 可以给该模块名取别名 """
from ... import ...
- 以模块为准创造一个模块的名称空间
- 执行模块对应的文件,将执行过程中产生的名字都丢到模块的名称空间
- 在当前执行文件的名称空间中拿到一个名字,该名字直接指向模块中的某一个名字,意味着可以不用加任何前缀而直接使用
- 优点:不用加前缀,代码更加精简
- 缺点:容易与当前执行文件中名称空间中的名字冲突
# 导入其他py内的所有功能,但会受限制于__all__ ,只允许导入被导入文件 __all__文件里规定的功能(比如变量、函数), 不设置则可全导入
import 和 from ... import ... 的异同
相同点:
- 两者都会执行模块对应的文件,两者都会产生模块的名称空间
- 两者调用功能时,需要跑到定义时寻找作用域关系,与调用位置无关
不同点
- import需要加前缀;from...import...不需要加前缀
循环导入问题以及解决思路
m1.py
# print('正在导入m1') # from m2 import y # 首次导入m2 # # # x = 'm1'
m2.py # print('正在导入m2') # from m1 import x # 第二次导m1 # y = 'm2'
from dir1.dir import m1
m1.f1()
解决方式1: 通过函数的定义阶段只检查代码,只执行语法,不执行代码特点
# m1.py
print('正在导入m1')
def f1():
from dir1.dir.m2 import y,f2
print('m1.f1>>>y:',y)
f2()
x = 'm1'
# m2.py
print('正在导入m2')
def f2():
from dir1.dir.m1 import x
print('m2.f2>>>x:',x)
y = 'm2'
# run.py import m1
解决方式2: 把模块导入环节放到文件最后,意思为所有变量创建后再导入
# m1.py print('from m1.py') y = 'm1' from m2 import x
# m2.py print('from m2.py') x = 'm2' from m1 import y
# run.py import m1
总结
如果出现循环导入问题 那么一定是你的程序设计的不合理 循环导入问题应该在程序设计阶段就应该避免 解决循环导入问题的方式 1.方式1 将循环导入的句式写在文件最下方() 2.方式2 函数内导入模块 """
__name__ 用法
# 当文件被当做执行文件执行的时候__name__打印的结果是__main__ # 当文件被当做模块导入的时候__name__打印的结果是模块名(没有后缀)
模块的查找顺序
"""
模块的查找顺序
1.先从内存中找
2.内置中找
3.sys.path中找(环境变量):
一定要分清楚谁是执行文件谁是被导入文件(******)
是一个大列表,里面放了一对文件路径,第一个路径永远是执行文件所在的文件夹
"""
# 注意py文件名不应该与模块名(内置的,第三方)冲突
py文件名与模块名冲突或者找不到py文件怎么办?
解决方法
通过导入sys模块,os模块
os.path.dirname() 获取当前文件位置上层位置
sys.path.append() 把当前文件位置添加入环境变量
__file__ 当前文件的所处在的位置
sys.path 获得当前文件的环境变量
import sys
sys.path.append(r'D:\Python项目\day14\dir1')
# print(sys.path)