#什么是模块? python代码的文件
#代码的可读性差,且重复的代码多,写代码困难大
#将一些复杂的需要重复使用的功能进行归类,分别放到同一个py文件中。
# 需要调用的时候直接拿来用就可以了。

 

实验前先建一个xiaomei.py ,作为一个自定义模块。模块内容如下

print('小司机')
price = '三十块钱一位'
def drive():
    print('快上车')

# import xiaomei
#一、导入模块时做的事
#1.看看自己的内存里有没有
    #有就不干活,没有再倒进来
#2.创建一个命名空间,在这个命名空间中执行代码
#3.创建了一个xiaomei这个名字,给命名空间中变量和xiaomei绑定在一起
#4.import方式导入模块中的内容和自己文件中的内容不会冲突

def drive():pass
# xiaomei.drive()  #执行模块里的函数
# print(xiaomei.price)

#二、import ... as:给模块重命名,重命名之后之前的名字就失效了,新名字可以直接使用
# import xiaomei as xm  #import的名字太长我嫌弃
# xm.drive()

 

#当import的模块名和我文件中的变量名重名的时候,将模块重命名。保证模块和变量都可以调用(模块要使用新名字调用)
# import xiaomei as xm  
# def xiaomei():
#     print(123)
# xm.drive()

 

调用数据库:
# if 是mysql数据库:    #当兼容多个模块的相同操作的时候
#     import mysql as db
# elif 是oracle数据库:
#     import oracle as db
# db.open
# db.write

 

 

#三、import 多个模块(同时调用多个模块,分别导入)
# import os,re,time
#
# os.getcwd()
# re.findall()
# time.time()
# import os
# import re
# import time
#
# import requests
#
# import xiaomei
#先导入内置的模块
#再导入扩展模块 :requests beautifulsoup django selenium paramiko
#最后导入自定义的模块

 

from……import……的用法
# from xiaomei import drive,price
# from xiaomei import drive as d,price as p
# from import的用法 会直接将导入的内容放在全局,如果dirve中用到的变量在模块和代码中都有,但是dirve中用到的变量和drive方法是一种绑定关系,调用时还是要使用自己模块中的变量。
# 如果有同名,就会发生覆盖,(后出现的覆盖新出现的)

 

import的三种方式:
一、
# import xiaomei
这个时候使用 xiaomei 中变量和函数时:
xiaomei.drive()
xiaomei.price
二、
# from xiaomei import *    #xiaomei 中的函数跟变量都可以直接使用了
这时候使用能够xiaomei 中的变量和函数
# drive()
# print(price)
三、
# from xiaomei import drive,price
# drive()
# print(price)

当要使用之歌模块中的多个方法时候,使用第一种,import 模块名
当只是使用模块中年的一个或二个的时候,使用from模块名 import 函数名
不推荐使用from import *

#from .. import *
#*受到__all__的限制,如果不定义__all__就默认引入所有

 

代码执行时,一旦引入了一个模块,这时候模块中的内容改变了,也对代码的执行没有影响。

把模块当做脚本执行 在自定义模块中添加: if__name__="__main__":

在自定义模块中调试时,将函数和变量都放到这句话下, 为的是,在直接执行代码的时候,代码能够直接执行,跟不写这句话直接调用没有区别。

在模块文件中__name__ 的值是 "__main__"

 

在程序中调用这个模块时,这句话下面(或者说里面)的代码就不会执行 在程序中__name__ 的值是 'xiaomei'

总而言之,只要是函数的调用,在模块文件中就该放到if__name__="__main__":下

当做脚本运行: __name__ 等于'__main__'

当做模块导入: __name__= 模块名

 

模块搜索路径 python解释器在启动时会自动加载一些模块,可以使用sys.modules查看

在第一次导入某个模块时(比如my_module),会先检查该模块是否已经被加载到内存中(当前执行文件的名称空间对应的内存),如果有则直接引用

如果没有,解释器则会查找同名的内建模块,如果还没有找到就从sys.path给出的目录列表中依次寻找my_module.py文件。

所以总结模块的查找顺序是:内存中已经加载的模块->内置模块->sys.path路径中包含的模块

需要特别注意的是:我们自定义的模块名不应该与系统内置模块重名。

 

#执行python解释器,已经在内存中加载了一些内置的模块了 #导入模块的时候,如果模块不存在在sys.modules,才从sys.path给的路径中依次去查找 #sys.path完全可以决定某个模块能不能被找到(除了已经在内存中加载的一些内置模块)

#import xiaomei #当一个py文件被当做一个模块导入的时候,会自动生成一个pyc文件 #pyc文件是这个代码编译之后的文件,节省了每一次导入代码之后还要编译的时间