模块的导入
老师博客链接:http://www.cnblogs.com/Eva-J/articles/7292109.html#_label2
模块出现的原因:
如果一些通用功能,每次都重复写或者复制粘贴的话,太复杂,而且程序的维护也会变得非常复杂;那么如果可以通过某种方式将写好的功能调用,就可以大大减轻工作量。能够实现特殊功能的程序就叫做模块。
演示
先新建一个名为demo的py文件:其代码如下
print('in demo.py') def read(): print('in123')
那么在任意一个py文件中,就能够导入一个自己定义的demo模块
import demo#导入demo模块 demo.read()#利用demo的read方法
导入模块过程中发生的过程:
1、找到模块
2、创建这个模块的专属命名空间
3、把文件中的名字都放在命名空间内
为何import虽然写多次,但是实际上只导入了一次
因为:每次import的时候,程序会从sys.modules中查看该模块是否存在
如果没有被导入,则依据sys.path路径查找到该模块,并导入
如果已经被导入,则不再重新导入
给模块起别名:
比如import time as t,给time模块起别名t;此后只能用t.time();不能time.time()
比如oracle 和mysql有同样的功能,如果在使用的过程中,首先需要判断是oracle数据库还是mysql数据库,然后才能操作;那么可以将oracle和mysql模块改为同一个名字,这样就能够用一个名字实现对两个数据库的操作。这样能够提到代码的兼容性。
模块的导入顺序:内置模块、扩展模块(比如django)、最后是自己写的模块
from 模块名称 import 函数名称
使用import demo的这种形式去导入demo后,就会创建一个全局的变量名,这样即使是当前文件中含有与demo文件中同名的函数,那么在调用的该函数的时候,依然调用的是demo模块中的这个函数,而非当前文件中的这个函数;
from demo import read 则恰好相反,它实现了直接从demo模块中直接调用read 函数,创建了一个全局的变量名;但是如果当前文件中还有同名的函数的时候,就会执行当前文件中的这个函数,而非demo模块中的函数。
import demo#导入demo模块 money=300#虽然这里money是200,但是实际上仍然调用的是demo中的money demo.read()#利用demo的read方法
import demo:如果demo中含有大量的变量名,如果执行这个操作以后,那么demo中所有的变量名都会依次被导入内存中,占用内存。
与此相对,from demo import 变量名,是直接导入demo中的变量名,不占用内存空间,但是如果在当前文件中,再写入与demo中同名的变量名以后,那么就会覆盖demo中的变量名。所以两种方法各有千秋。
from demo imort *
from demo import *#导入demo中所有的内容 print(money) read()
注意使用这种方式不太安全,如果现有代码中含有与demo中重复的变量名。那么demo中的变量名将会被覆盖。
from math import pi#由于math方法中有非常多的变量,我们只需要用到pi,所以这里就只导入pi print(pi)#结果是圆周率 pi=3 print(pi)#由于pi被赋值3,所以结果就是3
总结
所有的模块导入都应该尽量往上写,且顺序:内置模块>扩展模块>自定义模块
模块不会被重复被导入:因为sys.moudles
从哪导入:sys.path
包:就是众多模块的集合。
sys.modules中记录了所有被导入的模块。
sys.path记录了导入包的时候寻找的所有路径
模块导入有两种方式:import 模块名和from import
两种方式都支持as重命名,都支持多名字导入。
import 模块名
模块名.变量名 和本文件中的变量名完全不冲突
import 模块名 as 重命名的模块名:提高代码的兼容性
import 模块1,模块2
from import
from 模块名 import变量名:直接使用变量名就可以完成操作;如果本文件中含有相同的变量名就会发生冲突
from 模块名 import 变量名 as 重命名变量名
from 模块名 import 变量名1, 变量名2
from 模块名 import *:将模块中的所有的变量名都放到内存中,但是本文件中有相同的变量名会发生冲突
from 模块名 import * he _all_ 是一对:如果all中没有这个变量,就会导入所有的名字;如果有all,只导入all列表中的名字
包:就是一大堆模块的集合,
_name_=='_main_'
在模块中,有一个变量_name_;当我们直接执行这个模块的时候,_name_=='_main_'
当我们执行其他模块,在其他模块中引用这个模块的时候,这个模块中的_name_=='模块的名字'
也就是说:我们在写完一个程序,能够实现某项功能以后,那么这个程序就可以作为一个简单的模块,被其他程序调用;但是我们在当前程序中可能需要打印输出功能,而将其作为模块调用的时候,我们只需要该模块的功能,而不需要其输出的结果,所以这里就需要用到_name_这个功能。
在当前程序中,我们写
if _name_=='_main_':#表示从此开始,以后的代码只在当前页面有效,当该程序被作为模块调用的时候,这段代码以后的代码将不会被执行。
执行打印等其他功能。
示例:
demo程序的代码:
money=200 def read(): print('in123',money) print(__name__)#执行代码后结果是__main__,需要注意这里是双下划线
当执行demo程序的代码后,print(__name__)的结果是__main__
将demo程序作为模块被调用
import demo#运行后,结果是demo,也就是被导入模块的函数名
那么我们可以依次来做文章
就是利用 if __name__==‘__main__’
如果这个判断为真,则表示,处于当前页面,继续执行下面的打印输出等代码;如果这个结果为假,则表示处于导入模块的页面,就不继续执行下面的打印输出等代码。