一个函数封装一个功能,好比如今有一个软件,不可能将全部程序都写入一个文件,因此我们应该分文件,组织结构要好,代码不冗余,因此要分文件,可是分文件,分了5个文件,每一个文件里面可能都有相同的功能(函数),
怎么办?因此将这些相同的功能封装到一个文件中,谁用谁拿。
怎么拿?模块就是文件,存放一堆函数,谁用谁拿。
好比:我要策马奔腾共享人世繁华,应该怎么样?我应该骑马,你也要去浪,你是否是也要骑马。
模块是一系列经常使用功能的集合体,一个py文件就是一个模块。
#一、从文件级别组织程序,更方便管理 随着程序的发展,功能愈来愈多,为了方便管理,咱们一般将程序分红一个个的文件,这样作程序的结构更清晰,方便管理。这时咱们不只仅能够把这些文件当作脚本去执行,还能够把他们当作模块来导入到其余的模块中,实现了功能的重复利用 #二、拿来主义,提高开发效率 一样的原理,咱们也能够下载别人写好的模块而后导入到本身的项目中使用,这种拿来主义,能够极大地提高咱们的开发效率,避免重复造轮子。 #ps: 若是你退出python解释器而后从新进入,那么你以前定义的函数或者变量都将丢失,所以咱们一般将程序写到文件中以便永久保存下来,须要时就经过python test.py方式去执行,此时test.py被称为脚本script。
#模块能够包含可执行的语句和函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入import语句时才执行(import语句是能够在程序中的任意位置使用的,
且针对同一个模块很import屡次,为了防止你重复导入,python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载到内存中的模块对象
增长了一次引用,不会从新执行模块内的语句),以下 import spam #只在第一次导入时才执行spam.py内代码,此处的显式效果是只打印一次'from the spam.py',固然其余的顶级代码也都被执行了,只不过没有显示效果. 代码示例: ''' import tbjx import tbjx import tbjx import tbjx import tbjx ''' ''' 执行结果:只是打印一次: from the tbjx.py '''
#1.为源文件(tbjx模块)建立新的名称空间,在tbjx中定义的函数和方法如果使用到了global时访问的就是这个名称空间。 #2.在新建立的命名空间中执行模块中包含的代码,见初始导入import tbjx 提示:导入模块时到底执行了什么? In fact function definitions are also ‘statements’ that are ‘executed’; the execution of a module-level function definition enters the function name in the module’s global symbol table. 事实上函数定义也是“被执行”的语句,模块级别函数定义的执行将函数名放 入模块全局名称空间表,用globals()能够查看 #3.建立名字tbjx来引用该命名空间 这个名字和变量名没什么区别,都是‘第一类的’,且使用tbjx.名字的方式 能够访问tbjx.py文件中定义的名字,tbjx.名字与test.py中的名字来自 两个彻底不一样的地方。
ps:重复导入会直接引用内存中已经加载好的结果python
为模块起别名的做用:mysql
1,能够将过长的模块命名改为短的,便于操做。sql
import tbjx as sm sm.read1()
2,有利于代码的拓展,优化。 json
#mysql.py def sqlparse(): print('from mysql sqlparse') #oracle.py def sqlparse(): print('from oracle sqlparse') #test.py db_type=input('>>: ') if db_type == 'mysql': import mysql as db elif db_type == 'oracle': import oracle as db db.sqlparse()
import sys,os,json # 能够这样写,可是不推荐 #推荐应该这样: import sys import os import json
from 模块名 import 方法
#惟一的区别就是:使用from...import...则是将spam中的名字直接导入到当前的名称空间中,因此在当前名称空间中,直接使用名字就能够了、无需加前缀:tbjx. #from...import...的方式有好处也有坏处 好处:使用起来方便了 坏处:容易与当前执行文件中的名字冲突
from tbjx import read1 as read read()
from tbjx import read1,read2,name
#from spam import * 把spam中全部的不是如下划线(_)开头的名字都导入到当前位置 #大部分状况下咱们的python程序不该该使用这种导入方式,由于*你不知道你导入什么名字,颇有可能会覆盖掉你以前已经定义的名字。并且可读性极其的差,在交互式环境中导入时没有问题
#编写好的一个python文件能够有两种用途: 一:脚本,一个文件就是整个程序,用来被执行 二:模块,文件中存放着一堆功能,用来被导入使用 #python为咱们内置了全局变量__name__, 当文件被当作脚本执行时:__name__ 等于'__main__' 当文件被当作模块导入时:__name__等于模块名 #做用:用来控制.py文件在不一样的应用场景下执行不一样的逻辑(或者是在模块文件中测试代码) if __name__ == '__main__':
模块的查找顺序是:内存中已经加载的模块->内置模块->sys.path路径中包含的模块oracle
#模块的查找顺序 1、在第一次导入某个模块时(好比spam),会先检查该模块是否已经被加载到内存中(当前执行文件的名称空间对应的内存),若是有则直接引用 ps:python解释器在启动时会自动加载一些模块到内存中,可使用sys.modules查看 2、若是没有,解释器则会查找同名的内建模块 三、若是尚未找到就从sys.path给出的目录列表中依次寻找spam.py文件。