模块-初识
作者:互联网
模块
1、什么是模块
模块就是一系列功能的集合体
模块分为四种类别:
1、一个py文件就可以是一个模块
2、包:就是一个存放有__ init__.py文件的文件夹
3、使用C编写并链接到python解释器的内置模块
4、已被编译为共享库或DDL的C或C++扩展
模块有三种来源:
1、python解释器自带的
内置库 # import time
标准库 # import os
2、第三方的库
3、自定义的库
2、为何要用模块
1、拿来主义,极大的提升开发效率
2、解决代码冗余
3、如何用模块
3.1、导入语法
import首次导入模块会发生三件事:
import spam
1、会触发spam.py运行,所以会产生一个模块的名称空间
2、运行spam.py的代码,将运行过程中产生的名字都丢到模块的名称空间中
3、在当前执行文件的名称空间中拿到一个名字spam,该名字就是指向模块的名称空间
ps:后续的导入直接引用首次导入的成果
# spam.py
print('from spam')
money = 1000
def read1():
print(1)
def read2():
print(2)
def change():
print(cha)
# run.py
import m1
import m1
import m1
# 只会输出一次from spam,后面导入模块会直接引用首次导入的成果,访问里面方法和变量需要加入前缀
print(spam.money) # 1000
from import 首次导入模块会发生三件事:
from spam import money
1、会触发spam.py运行,所以会产生一个模块的名称空间
2、运行spam.py的代码,将运行过程中产生的名字都丢到模块的名称空间中
3、在当前执行文件的名称空间中拿到一个名字money,该名字就是指向模块的名称空间对应的名字
ps:后续的导入直接引用首次导入的成果
# spam.py
print('from spam')
money = 1000
def read1():
print(1)
def read2():
print(2)
def change():
print(cha)
# run.py
from spam import money
from spam import money
# 也只是输出一次from spam,后续的导入直接引用首次导入的成果,不需要加入前缀
print(money) # 1000
导入模块可以起别名:
import span as a
from span import money as b
同时导入多个模块:
import span,os,time
import span as a,os,time as tm
from span import read,func
from span import * # (导入模块中所有函数)
# * 是个双刃剑,容易和当前名称空间的名称冲突 可以通过__ all __ =[ ] 来控制 * 导入的函数
3.2、循环导入问题
# m1.py
print('from m1')
from m2 import y
x = 'm1'
#m2.py
print('from m2')
from m1 import x
y = 'm2'
# run.py
import m1
# 运行run.py ,会先导入m1模块,输出from m1 ,然后from m2 import y导入m2模块去找y,执行m2模块,先输出from m2,接着from m1 import x会去m1模块找x,由于m1模块已经导入过,不会重复导入,此时的m1中的x还没有加载,所以会报错
解决方案:
1、把存在循环导入问题的导入语句放在一个函数里
2、不要出现循环导入,把要用的数据放在第三方模块
3.3、模块的搜索路径
优先级:
1、内存
2、内置
3、sys.path 强调:sys.path是以执行程序为准
模块的查找顺序:
1、在第一次导入某个模块时(比如spam),会先检查该模块是否已经被加载到内存中(当前执行文件的名称空间对应的内存),如果有则直接引用
ps:python解释器在启动时会自动加载一些模块到内存中,可以使用sys.modules查看
2、如果没有,解释器则会查找同名的内置模块
3、如果还没有找到就从sys.path给出的目录列表中依次寻找spam.py文件。
PS:
我们自定义的模块名不应该与系统内置模块重名。
import sys
# 找foo.py就把foo.py的文件夹添加到环境变量中
sys.path.append('/Users/linhaifeng/PycharmProjects/s14/day21/aa')
import foo
编写模块模板:
"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() #在被当做脚本执行时,执行此处的代码
标签:spam,py,导入,初识,m1,模块,import 来源: https://www.cnblogs.com/BaiJiaZhengMing/p/14605432.html