14.Python略有小成(模塊)

Python(模塊)

1、模塊定義與分類

​ 咱們說一個函數就是一個功能,那麼把一些經常使用的函數放在一個py文件中,這個文件就稱之爲模塊,模塊,就是一些列經常使用功能的集合體,模塊就是文件,存放一堆經常使用的函數,一個模塊就是一個py文件,這個模塊存儲不少類似的函數集合體python

​ 10個文件有50個函數,有一些相同功能或者類似功能的函數,代碼冗餘,重複,咱們應該將這10個函數提取出來,放在一個文件中.mysql

  1. 節省代碼
  2. 容易維護,組織結構更清晰

模塊分類sql

  • 內置模塊,標準庫python解釋器自帶的有200多種json

  • 第三方庫(模塊),各類大神些的一些模塊,經過pip install...安裝,6000種oracle

  • 自定義模塊,咱們本身在項目中定義的一些模塊函數

    # 定義一個模塊,定義一個模塊其實很簡單就是寫一個文件
    print('from the tbjx.py')
    name = '張三丰'
    def read1():
        print('tbjx模塊:',name)
    def read2():
        print('tbjx模塊')
        read1()
    def change():
        global name
        name = 'barry'

2、import

  • import(導入的意思),模塊能夠包含可執行的語句和函數的定義,這些語句的目的是初始化模塊,它們只在模塊名第一次遇到導入import語句時才執行測試

  • import語句是能夠在程序中的任意位置使用的,且針對同一個模塊,爲了防止你重複導入,python的優化手段是:第一次導入後就將模塊名加載到內存了,後續的import語句僅是對已經加載到內存中的模塊對象增長了一次引用,不會從新執行模塊內的語句)優化

    # 注意 : 那個文件執行文件,哪一個文件是被執行模塊。   
    代碼示例:
    import tbjx
    import tbjx
    import tbjx
    import tbjx
    import tbjx
    # import tbjx 只在第一次導入時才執行tbjx.py內代碼,此處的顯式效果是隻打印一次,固然其餘的頂級代碼也都被執行了,只不過沒有顯示效果.

3、第一次導入模塊發生的三件事

  1. 將tbjx.py文件加載到內存
  2. 在內存中建立一個以tbjx命名的名稱空間
  3. 經過tbjx名稱空間的名字,等方式引用此模塊的名字(變量,函數名,類名等等)

注意 : 重複導入會直接引用內存中已經加載好的結果spa

4、被導入模塊有獨立的名稱空間

​ 每一個模塊都是一個獨立的名稱空間,定義在這個模塊中的函數,把這個模塊的名稱空間當作全局名稱空間,這樣咱們在編寫本身的模塊時,就不用擔憂咱們定義在本身模塊中全局變量會在被導入時,與使用者的全局變量衝突code

# 模塊名字 lern.py 模塊內以下信息 
print("乾坤")
name="張三丰"
---------------------------------
import lern # 執行結果 乾坤
name="張無忌"
print(lern.name) # 打印結果 張三丰

5、爲模塊起別名

  1. 將一個比較長的模塊名化簡成簡單的

    import tbjx as t
    t.read1()
  2. 有利於代碼的擴展和優化

    #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()

6、導入多個模塊

​ 咱們之後再開發過程當中,免不了會在一個文件中,導入多個模塊,

  • 注意 : 推薦寫法是一個一個導入

    import os,sys,json   # 這樣寫能夠可是不推薦
    ---------------------------------
    # 推薦寫法
    import os
    import sys
    import json

7、from...import...

  1. form...import...的使用

    # 模塊名字 lern.py 模塊內以下信息 
    print("乾坤")
    name="張三丰"
    def read1():
     print("丐幫")
    ---------------------------------
     # from ... import ... 的使用示例。
    from lern import name, read1 # 執行結果 乾坤
    print(name) # 張三丰
    read1() # 丐幫
  2. form...import...與import對比

    ​ 惟一的區別就是:使用from...import...則是將spam中的名字直接導入到當前的名稱空間中,因此在當前名稱空間中,直接使用名字就能夠了、無需加前綴

    ​ from...import...的優缺點

    • 優勢 : 使用起來方便了
    • 容易與當前執行文件中的名字衝突

    注意1 : 執行文件有與模塊同名的變量或者函數名,會有覆蓋效果,例子以下

    # 模塊名字 lern.py 模塊內以下信息 
    name = '武當'
    def read1():
        print('tbjx模塊:',name)
    def read2():
        return read1()
    def change():
        global name
        name = 'barry'
    ---------------------------------
    name = 'oldboy'
    from lern import name, read1, read2
    print(name) # 武當
    ---------------------------------
    from lern import name, read1, read2
    name = 'oldboy'
    print(name) # oldboy
    ---------------------------------
    def read1():
        print(666)
    from lern import name, read1, read2
    read1() # tbjx模塊:武當
    ---------------------------------
    from lern import name, read1, read2
    def read1():
        print(666)
    read1() # 666

    注意2 : 當前位置直接使用read1和read2就行了,執行時,仍然以lern.py文件全局名稱空間

    # 模塊名字 lern.py 模塊內以下信息 
    name = '武當'
    def read1():
        print('tbjx模塊:',name)
    def read2():
        return read1()
    def change():
        global name
        name = 'barry'
    ---------------------------------
    from lern import read1
    name = 'alex'
    read1() # tbjx模塊: 武當
    ---------------------------------
    from lern import read2
    def read1():
        print('==========')
    read2() # tbjx模塊:武當
    ---------------------------------
     # 同時經過這種方式引用的模塊也能夠對模塊進行更名。
    from tbjx import read1 as read
    read()
  3. form...import*

    • from spam import * 把tbjx中全部的不是如下劃線(_)開頭的名字都導入到當前位置

    • 大部分狀況下咱們的python程序不該該使用這種導入方式,由於*你不知道你導入什麼名字,頗有可能會覆蓋掉你以前已經定義的名字。並且可讀性極其的差,在交互式環境中導入時沒有問題。

    • 可使用__ all __來控制(用來發布新版本),在lern.py中新增一行

      __all__=['money','read1'] #這樣在另一個文件中用from spam import *就這能導入列表中規定的兩個名字

8、一行導入多個

from tbjx import read1,read2,name

9、py文件的兩種功能

  1. 編寫好的一個python文件能夠有兩種用途:
    • 腳本,一個文件就是整個程序,用來被執行(好比模擬博客園的登陸)
    • 模塊,文件中存放着一堆功能,用來被導入使用
  2. python爲咱們內置了全局變量__ name __
    • 當文件被當作腳本執行時:__ name __ 等於__ main __
    • 當文件被當作模塊導入時:__ name __等於模塊名

做用:用來控制.py文件在不一樣的應用場景下執行不一樣的邏輯(或者是在模塊文件中測試代碼)

10、模塊的搜索路徑

當你引用一個模塊時,不見得每次均可以import到

  • Python中引用模塊是按照必定的規則以及順序去尋找的,這個查詢順序爲:先從內存中已經加載的模塊進行尋找找不到再從內置模塊中尋找,內置模塊若是也沒有,最後去sys.path中路徑包含的模塊中尋找。它只會按照這個順序從這些指定的地方去尋找,若是最終都沒有找到,那麼就會報錯。
  • 內存中已經加載的模塊->內置模塊->sys.path路徑中包含的模塊

模塊的查找順序

  1. 在第一次導入某個模塊時(好比lern),會先檢查該模塊是否已經被加載到內存中(當前執行文件的名稱空間對應的內存),若是有則直接引用(ps:python解釋器在啓動時會自動加載一些模塊到內存中,可使用sys.modules查看)
  2. 若是沒有,解釋器則會查找同名的內置模塊
  3. 若是尚未找到就從sys.path給出的目錄列表中依次尋找lern.py文件。

注意:咱們自定義的模塊名不該該與系統內置模塊重名。

相關文章
相關標籤/搜索