模块的导入, 

什么事模块?已经写好的一组功能的集合

别人写好的函数,变量   方法   放在一个文件里(这个文件可以被直接使用) 这个 文件就是个模块

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了