python模块


目录
  • 模块简介
    • import句式
    • from...import...句式
  • 导入模块扩展用法
  • 判断文件类型
  • 循环导入
    • 模块导入顺序

模块简介

1.什么是模块?
# 模块:是一系列功能的集合体,而函数是一个功能的集合体,因此模块可以看成是一堆函数的集合体。

一个py文件内部可以放一堆函数,因此一个py文件就可以看成一个模块。如果这个py文件名为 mod.py 的话,   模块名则为mod

2.为什么要用模块?
	使用模块即可以极大的提升开发效率
    
3.模块的三种来源
	1.内置的(python解释器自带的能够直接导入使用)
    2.第三方的:已经被编译为共享库,别人写好的发布在网上,需要先下载后使用
    3.自定义模块:自己编写的
        
4.模块的四种表现形式
	1. 使用python编写的代码(.py文件)
    2. 已被编译为共享库或dll的c或c++扩展
    3. 包好一组模块的包(文件夹)
    		#包其实就是多个py文件(模块)的集合
        		包里面通常会含有一个__init__.py文件
    4. 使用C编写并连接到python解释器的内置模块
    

import句式

# 在学习模块的时候 一定要区分谁是导入文件谁是模块文件

import time()

要用time模块 python就相当于手机,time相当于应用管家里的应用,想要用它就import

time.time()

多次导入相同的模块,只会执行一次

首次导入md模块发生的事情

1. 运行导入文件(import句式.py) 产生该文件的全局名称空间
2. 运行md.py文件
3. 产生md.py全局名称空间 运行md文件内代码 将产生的名字全部存档于md.py名称空间
4. 在导入文件名称空间产生一个md的名字指向md.py全局名称空间

import句式导入模块之后
	通过模块名.的方式就可以使用模块中所有的名字 并且肯定不会产生冲突

from...import...句式

from md import money,read1,change

'''
from...import...多次导入一直会导入一次
	1.先产生执行文件的全局名称空间
	2.执行模块文件,产生模块的全局名称空间
	3.将模块中执行之后产生的名字全部存档与模块名称空间中
	4.在执行文件中有一个money执行模块名称空间中money指向的值
	
from...import...指名道姓的导入某个名字
	在使用的时候直接写名字即可 但是当 当前名称空间有相同名字的时候
	这样就会产生冲突 使用的就变成的当前名称空间
'''

导入模块扩展用法

1. 起别名
	即可以给模块名起别名也可以给模块中某个名字起别名
    eg:
    	import ssdsdsdsdsdsdsdaasdwasc as s
        from sqwesargerasdasd import name as n
2. 连续导入
	import 模块名1,模块名2
    	可以联系导入多个模块 但是只有当多个模块功能相似或者属于同一个系列才推荐
        #  如果功能不同并且不属于一个系列  那么推荐分行导入
        import 模块名1 
        import 模块名2
      from 模块名1 import 名字1,名字2,名字3
    
3. 通用导入
	from md import *  # 将模块中所有的名字全部导入(*表示所有)
    print(名字1)
    print(名字2)
    print(名字3)
    __all__ = ['名字1','名字2']  # 在被导入的模块文件中可以使用__all__指定可以被导入使用的名字  此时只能用模块中的名字1 与 名字2  其他名字则不可以使用

判断文件类型

# 判断py文件是作为模块文件还是执行文件

###     __name__当文件是执行文件的时候会返回__main__
###      如果文件是被当作模块导入则返回文件名(模块名)

if __name__ == '__main__':
  	名字1()
# 在pycharm中可以直接敲 main按tab键即可自动补全if判断 

循环导入

什么是循环导入?
# 循环导入就是一个循环过程, 只要开始就没有结束
## m1.py

print('from m1.py')
from m2 import x
y = 'm1'
## m2.py
print('from m2.py')
from m1 import y
x = 'm2'
## run.py
import m2

# 我们在导入模块的时候如果出现的循环导入的情况 说明你程序设计的不合理
上述解决方法:
1.调换顺序
	将彼此导入的句式放在代码最后
    # 但是也不建议出现这种循环导入的情况

解决方法2:
函数形式
	将导入的句式放入函数体代码 等待所有的名字加载完毕之后再调用

模块导入顺序

模块其实就是一个文件,如果要执行文件,首先就需要找到模块的路径(摸个文件夹 ),如果模块的文件路径和执行文件不在同一个文件目录下,我们就需要指定文件的路径。

'''
模块的导入顺序为:
	1. 先从内存中查找
	2. 再去内置模块中查找
	3. 最后去sys.path系统路径查找(自定义模块)
	如果都没有找到则报错
'''

#   以后再给py文件命名的时候尽量不要与内置模块名冲突

import sys
print(sys.path)  # 结果中第一个元素永远是当前执行文件所在的路径

#####  如果我们在执行run.py 文件是快速删除run文件中导入的m1模块 ,此时run文件还会正常运行。而且不会报错  因为m1已经被导入到内存,如果我们在一次运行run.py文件时就会报错,因为m1此时已经被删除 
当某个自定义的模板查找不到的时候解决方案:
	1.自己手动将该模块所在的路径添加到sys.path中
    	import sys
        sys.path.append(r.'绝对路径')
    2.from...import...句式
    	from 文件夹名称.文件夹名称 import 模块名
        from 文件夹名称.模块名称 import 名字