模块介绍

一,模块介绍

 1.1 什么是模块?

一个函数封装一个功能,好比如今有一个软件,不可能将全部程序都写入一个文件,因此我们应该分文件,组织结构要好,代码不冗余,因此要分文件,可是分文件,分了5个文件,每一个文件里面可能都有相同的功能(函数),
怎么办?因此将这些相同的功能封装到一个文件中,谁用谁拿。 怎么拿?模块就是文件,存放一堆函数,谁用谁拿。 好比:我要策马奔腾共享人世繁华,应该怎么样?我应该骑马,你也要去浪,你是否是也要骑马。 模块是一系列经常使用功能的集合体,一个py文件就是一个模块。

1.2 为何要使用模块.

#一、从文件级别组织程序,更方便管理
随着程序的发展,功能愈来愈多,为了方便管理,咱们一般将程序分红一个个的文件,这样作程序的结构更清晰,方便管理。这时咱们不只仅能够把这些文件当作脚本去执行,还能够把他们当作模块来导入到其余的模块中,实现了功能的重复利用

#二、拿来主义,提高开发效率
一样的原理,咱们也能够下载别人写好的模块而后导入到本身的项目中使用,这种拿来主义,能够极大地提高咱们的开发效率,避免重复造轮子。

#ps:
若是你退出python解释器而后从新进入,那么你以前定义的函数或者变量都将丢失,所以咱们一般将程序写到文件中以便永久保存下来,须要时就经过python test.py方式去执行,此时test.py被称为脚本script。

二 ,import

2.1 import的使用。

 

#模块能够包含可执行的语句和函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入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 '''

2.2 第一次导入模块执行三件事。

#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

2.3 为模块起别名。

为模块起别名的做用: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()

2.5 导入多个模块

import sys,os,json # 能够这样写,可是不推荐

#推荐应该这样:
import sys
import os
import json

三,from ... import ...

3.1 from...import...使用

from 模块名  import  方法

3.2 from...import... 与import对比

#惟一的区别就是:使用from...import...则是将spam中的名字直接导入到当前的名称空间中,因此在当前名称空间中,直接使用名字就能够了、无需加前缀:tbjx.

#from...import...的方式有好处也有坏处
    好处:使用起来方便了
    坏处:容易与当前执行文件中的名字冲突

3.3 也支持as

from tbjx import read1 as read
read()

3.4 一行导入多个。

from tbjx import read1,read2,name

3.5 from ... import *

#from spam import * 把spam中全部的不是如下划线(_)开头的名字都导入到当前位置

#大部分状况下咱们的python程序不该该使用这种导入方式,由于*你不知道你导入什么名字,颇有可能会覆盖掉你以前已经定义的名字。并且可读性极其的差,在交互式环境中导入时没有问题

四,py文件的两种功能

#编写好的一个python文件能够有两种用途:
    一:脚本,一个文件就是整个程序,用来被执行
    二:模块,文件中存放着一堆功能,用来被导入使用


#python为咱们内置了全局变量__name__,
    当文件被当作脚本执行时:__name__ 等于'__main__'
    当文件被当作模块导入时:__name__等于模块名

#做用:用来控制.py文件在不一样的应用场景下执行不一样的逻辑(或者是在模块文件中测试代码)
    if __name__ == '__main__':

五,模块的搜索路径

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

#模块的查找顺序
1、在第一次导入某个模块时(好比spam),会先检查该模块是否已经被加载到内存中(当前执行文件的名称空间对应的内存),若是有则直接引用
    ps:python解释器在启动时会自动加载一些模块到内存中,可使用sys.modules查看
2、若是没有,解释器则会查找同名的内建模块
三、若是尚未找到就从sys.path给出的目录列表中依次寻找spam.py文件。
相关文章
相关标签/搜索