模块的导入,
什么事模块?已经写好的一组功能的集合
别人写好的函数,变量 方法 放在一个文件里(这个文件可以被直接使用) 这个 文件就是个模块
1如何自己写模块
一般分为3种 py文件 dll文件 zip 文件
如何自己写一个模块创建一个py文件,给它起一个符合变量名命名规则的名字,这个名字就是模块名
import 模块名,和正常导入模块一样 不要带。py
导入一个模块就是执行一个模块
使用: 打印东西直接print 变量名(模块名)。变量名 print(变量名(模块名)。函数名)内存地址 print变量名。函数名() 打印函数
import 命名空间
变量=xxx
print 变量 这个变量打印的是xxx 而如果变量名重复了,要打印模块里的该变量 要print变量(模块名)。变量
模块和当前文件在不同的命名空间
# 模块导入的过程中发生了什么?
# 找到这个模块
# 判断这个模块是否被导入过了
# 如果没有被导入过
# 创建一个属于这个模块的命名空间
# 让模块的名字 指向 这个空间
# 执行这个模块中的代码
怎么判断这个模块是不是导入过了
import sys 所有被导入过的模块都会在这里存上
print (sys。modules) 这个打印出来可以看一看是否被导入过 拿名字去查一下
给模块起别名, 起了别名之后 之后也都使用别名来引用变量了
import 变量名(模块名)as m
# json pickle
# dumps loads
# def func(dic,t = 'json'):
# if t == 'json':
# import json
# return json.dumps(dic)
# elif t == 'pickle':
# import pickle
# return pickle.dumps(dic)
#
# def func(dic, t='json'):
# if t == 'json':
# import json as aaa
# elif t == 'pickle':
# import pickle as aaa
# return aaa.dumps(dic) 起别名的另一种用法,简化代码 相同的代码写一个就行
导入多个模块
# 导入多个模块
# import os,time
# import os as o,time as t
# 规范建议 模块应该一个一个的导入 : 自定义模块,第三方模块,内置模块
# 内置模块
# 扩展(第三方)模块
自定义模块 正常是不分顺序的,各自内存地址,但是你看别人代码,或别人看你代码,大家都方便
模块的导入 fromimport
from 模块名 import 变量名 引入模块中的这个变量
如何使用 fromimport
需要从一个文件中使用哪个变量,就把这个名字导入进来
from import 过程中仍然会执行这个被导入的文件
from 模块名 import 函数名 你这里哪个函数名,就只用哪个函数
这个函数里有 模块里的变量,正常使用,所以我怀疑,固定了一个函数名,就除了这个函数,其他函数不调用,其他都调用,但是外面不能用变量
当前文件的命名空间和模块的命名空间的问题
from 模块名 import 函数名 下面也有同一个函数名的话,就会把上面的覆盖,执行下面自己写的函数
from 模块名 import 函数名2 再饮用一次的话,并不会打印出之前的文件
from import 导入过程中的事
1.找到要被导入的模块
2.判断这个模块是否被导入过
3.如果这个模块没被导入过
创建一个属于这个模块的命名空间 1
执行这个文件 2 如果模块被导入过这两点直接过
找到你要导入的变量
给你要导入的变量创建一个引用,指向要导入的变量
导入多个名字
from 模块名 import 函数名1,函数名2这样就两个模块都能用了
给导入的模块起别名 老套路 函数名1 as xx bj4 这样就和新创建的函数名不冲突了
from 模块名 import * 直接import 模块名,也能用 不过那就是 模块名。什么,模块名。什么 了
这样你就直接使用 模块里的变量,函数名就行了
*的话也是把里面的做成一个内存地址,你如果再写一个变量,函数 还是会覆盖
*和__all__ all 后面只能跟列表
*会参考 模块名里的 all 如果没有all 会导入所有东西 如果all 里只有1个值 就只打印这一个值 里面有几个值,打几个值
all 只会约束星 如果 from 模块名 import 一个all里没有的, 也是会打印
模块引用的情况
1模块的循环引用 ***
一个纯的 函数组成的 多个模块之间 不能形成循环引用
2模块的加载与修改 *
已经被导入的模块发生了修改是不会被感知到的 import time
importlib
模块名
time。sleep (20) 默认是秒
importlib。reload(模块名) 重新导入一次
模块名。函数名()这时候 你在这20秒里怎么改函数,函数20秒后都打印出来是你改的最新的
要想修改的模块被正在运行中的程序感知到,也就只能重启这个程序了
3把模块当成脚本执行 *****
执行一个文件的方式 1在cmd里执行,在pycharm执行,-以脚本的形式运行这个文件
2 导入这个文件
都是py文件
直接运行这个文件,这个文件就是一个脚本
导入一个文件,那这个文件就是一个模块 希望文件在导入的过程中没有输出
当一个py文件当成一个脚本使用的时候,能够独立的提供一个功能 能自主交互
当成1个模块的时候,能够被导入调用这个功能 等被调用再交互
一个文件中的__name___变量
当这个文件被当作脚本执行的时候这个变量就等于main
当这个文件被当作模块执行的时候这个变量就等于模块名 可以在模块里写上,if __name__==‘__main__' 下面再来条件,这样就执行的时候才输出
if __name__==‘__main__'
代码
写在这里面的代码只有被当作脚本执行的时候才执行
tips main写完直接按下tap键就 完了 不用再打印了
4.模块的搜索路径 *****这个和写项目完全挂钩
和被当作脚本执行的文件 同目录下的模块 可以被直接导入
除此之外其他路径下的模块,在被导入的时候需要自己修改sys。path列表
import sys
import 模块名 这个模块不在同一目录
print(sys。path) 这就是查看现在的目录
path=r 文件目录 加r是防止转义
sys。path 。append (path) 这个path就是上一行写的文件目录 sys。path 就是一个列表
这样你在impor 模块名 就OK了