其他分享
首页 > 其他分享> > 模块-初识

模块-初识

作者:互联网

模块

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