模塊

一.模塊的引入

在Python中用關鍵字import來引入某個模塊,比如要引用模塊math,就可以在文件最開始的地方用import math來引入。在調用math模塊中的函數時,必須這樣引用:

模塊名.函數名

爲什麼必須加上模塊名這樣調用呢?因爲可能存在這樣一種情況:在多個模塊中含有相同名稱的函數,此時如果只是通過函數名來調用,解釋器無法知道到底要調用哪個函數。所以如果像上述這樣引入模塊的時候,調用函數必須加上模塊名。


import math

#這樣會報錯
print sqrt(2)

#這樣才能正確輸出結果
print math.sqrt(2)

有時候我們只需要用到模塊中的某個函數,只需要引入該函數即可,此時可以通過語句

from 模塊名 import 函數名1,函數名2…

來實現,當然可以通過不僅僅可以引入函數,還可以引入一些常量。通過這種方式引入的時候,調用函數時只能給出函數名,不能給出模塊名,但是當兩個模塊中含有相同名稱函數的時候,後面一次引入會覆蓋前一次引入。也就是說假如模塊A中有函數function( ),在模塊B中也有函數function( ),如果引入A中的function在先、B中的function在後,那麼當調用function函數的時候,是去執行模塊B中的function函數。

如果想一次性引入math中所有的東西,還可以通過from math import *來實現,但是不建議這麼做。

二.定義自己的模塊

在Python中,每個Python文件都可以作爲一個模塊,模塊的名字就是文件的名字。

比如有這樣一個文件test.py,在test.py中定義了函數add:

#test.py

def add(a,b):
    return a+b

那麼在其他文件中就可以先import test,然後通過test.add(a,b)來調用了,當然也可以通過from test import add來引入。

三.在引入模塊的時候發生了什麼

先看一個例子,在文件test.py中的代碼:


#test.py

def display():
    print 'hello world'
    
display()
    

在test1.py中引入模塊test:

#test1.py

import test

然後運行test1.py,會輸出"hello world"。也就是說在用import引入模塊時,會將引入的模塊文件中的代碼執行一次。但是注意,只在第一次引入時纔會執行模塊文件中的代碼,因爲只在第一次引入時進行加載,這樣做很容易理解,不僅可以節約時間還可以節約內存。
  (以上內容轉載於http://www.cnblogs.com/dolphin0520/ 作者:Matrix海子)

導入模塊詳情

Python允許“導入”其它模塊以實現代碼重用,從而也實現了將獨立的代碼文件組織成更大的程序系統。模塊是被導入的,但模塊也可以導入和使用其他模塊,這些模塊可以用Python或其他編程語言寫成。
  在導入模塊時只能使用模塊名,而不是使用帶.py後綴的模塊文件名

1. import 語句, 用於導入整個模塊

import module1, module2… # 建議一個import語句只導入一個模塊
import module as module_alias # 別名(也就是自定義的模塊名稱空間)

>>> import sys,os

>>> import random as rd

2. from-import 語句 , 常用於只導入指定模塊的部分屬性或模糊導入

from module import name1,name2…

from pack1.pack2 import *
>>> from random import choice,random,seed

import和from import是賦值語句。
import和from可執行語句,類似於def,因此,它們可以嵌套在if測試中,出現於def中等等。
Python執行到這些語句時纔會對其進行解析,這意味着,所有來自模塊的屬性僅在import語句執行後才能使用。

import的工作機制

import語句導入指定的模塊時會執行3個步驟

    1. 找到模塊文件:在模塊搜索路徑下搜索模塊文件
        程序的主目錄
        PYTHONPATH目錄
        標準鏈接庫目錄
  • 2.編譯成字節碼:文件導入時會編譯,因此,頂層文件的.pyc字節碼文件在內部使用後會被丟棄,只有被導入的文件纔會留下.pyc文件。

  • 3.執行模塊的代碼來創建其所定義的對象:模塊文件中的所有語句從頭至尾依次執行,而此步驟中任何對變量名的賦值運算,都會產生所得到的模塊文件的屬性。
    注意:模塊只在第一次導入時纔會執行如上步驟,後續的導入操作只不過是提取內存中已加載的模塊對象,reload()可用於重新加載模塊。
    (以上內容轉載於https://www.cnblogs.com/bobo0609/p/6938012.html)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章