模塊介紹

一,模塊介紹

 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文件。
相關文章
相關標籤/搜索