python3之模塊


1、python3模塊

模塊是一個包含所有你定義的函數和變量的文件,其后綴名是.py。模塊可以被別的程序引入,以使用該模塊中的函數等功能。這也是使用 python 標准庫的方法。

模塊讓你能夠有邏輯地組織你的python代碼段;把相關的代碼分配到一個模塊里能讓你的代碼更好用,更易懂。

模塊能定義函數,類和變量,模塊里也能包含可執行的代碼。

#新建模塊文件modle_1.py,內容如下:
def p_func(arg):
    print('hello',arg)
    return

#新建主模塊文件main.py,內容如下:
from modle_1 import p_func   #導入模塊modle_1中的p_func函數

if __name__ == "__main__":   #判斷是否為主程序執行口
    p_func('python')


#output:
hello python    

2、模塊的引入

模塊定義好后,可以使用import語句來引入模塊,語法如下:

import module1,[module2[,.........moduleN]]

比如要引用模塊math,就可以在文件最開始用import math來引入,在調用math模塊中的函數時,必須使用:模塊名.函數名,來使用函數。

一個模塊只會被導入一次,不管執行了多少次import,這樣可以防止導入模塊被重復執行。

from  ...   import語句:

python中的from語句讓你從模塊中導入一個指定的部分到當前命名空間中,語法如下:

from modname import name1,name2..........nameN

from mod import  func_1    #導入mod模塊中的func_1函數 

這個聲明不會把整個mod模塊導入到當前命名空間中,它只會將mod里的func_1單個引入到執行這個聲明的模塊的全局符號表。

from ... import *  :這樣會把模塊中的所有內容導入到當前命名空間,一般不建議使用,消耗內存空間,也容易出現未預知的問題。

3、搜索路徑

當導入一個模塊后,python解析器對模塊位置的搜索順序是:

當前目錄----shell變量PYTHONPATH下的每個目錄----------python模塊路徑目錄

模塊的搜索路徑存儲在system模塊的sys.path變量中,包括當前目錄,pythonpath和安裝過程決定的默認目錄。

>>> import sys
>>> print(sys.path)
['', '/usr/local/python35/lib/python35.zip', '/usr/local/python35/lib/python3.5', '/usr/local/python35/lib/python3.5/plat-linux', '/usr/local/python35/lib/python3.5/lib-dynload', '/usr/local/python35/lib/python3.5/site-packages']

 其中的空字符串表示當前工作目錄,當安裝第三方模塊的時候,如果不是按照標准方式安裝,則為了能夠引用這些模塊,必須將這些模塊的安裝路徑添加到sys.path中,有以下幾種方法:

1)最簡單的方法,是在sys.path的某個目錄下添加路徑配置文件,最常見的就是在..../site-package/目錄下,路徑配置文件的擴展名為'.pth',其中的每一行包含一個單獨的路徑,該路徑會添加到sys.path列表中,“.pth”中的路徑可以是絕對路徑也可以是相對路徑,如果是相對路徑則相對於包含".pth"文件的路徑而言的。

>>> import sys
>>> print(sys.path)     #默認搜索路徑
['', '/usr/local/python35/lib/python35.zip', '/usr/local/python35/lib/python3.5', '/usr/local/python35/lib/python3.5/plat-linux', '/usr/local/python35/lib/python3.5/lib-dynload', '/usr/local/python35/lib/python3.5/site-packages']

[root@python site-packages]# vim /media/aa.py  #在site-packages下新建配置文件system.th內容為需要添加的模塊路徑
[root@python site-packages]# cat system.pth 
/media
#在/media目錄下新建模塊aa.py
[root@python site-packages]# cat /media/aa.py 

def munit(x,y):
    print('sun:',x+y)
    return x+y

>>> sys.path
['', '/usr/local/python35/lib/python35.zip', '/usr/local/python35/lib/python3.5', '/usr/local/python35/lib/python3.5/plat-linux', '/usr/local/python35/lib/python3.5/lib-dynload', '/usr/local/python35/lib/python3.5/site-packages', '/media'] #默認路徑下增加了一個/media搜索路徑
>>> import aa   #導入模塊aa
>>> aa.munit(1,2)   #執行模塊中的函數
sun: 3
3

2)另一種方法就是在Python標准庫中修改site.py文件,並編輯sys.path。除非使用了-S開關選項,否則site.py在Python解釋器加載時會自動被引入(執行),作用是加載site-packages中的包和模塊到python的sys.path里面。所以,可以編輯site.py,然后加上下面的兩行內容即可:

>>> import aa
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'aa'
>>> import sys
>>> sys.path
['', '/usr/local/python35/lib/python35.zip', '/usr/local/python35/lib/python3.5', '/usr/local/python35/lib/python3.5/plat-linux', '/usr/local/python35/lib/python3.5/lib-dynload', '/usr/local/python35/lib/python3.5/site-packages']
>>> import sys
>>> sys.path.append("/media")   #添加模塊路徑到搜索路徑中
>>> sys.path
['', '/usr/local/python35/lib/python35.zip', '/usr/local/python35/lib/python3.5', '/usr/local/python35/lib/python3.5/plat-linux', '/usr/local/python35/lib/python3.5/lib-dynload', '/usr/local/python35/lib/python3.5/site-packages', '/media']
>>> import aa
>>> aa.munit(2,3)
sun: 5
5

3)修改PYTHONPATH環境變量,一般不推薦使用此方法。

set PYTHONPATH =/usr/local/lib/python

4、命名空間和作用域

變量是擁有匹配對象的名字(標識符)。命名空間是一個包含了變量名稱們(鍵)和它們各自相應的對象們(值)的字典。

一個 Python 表達式可以訪問局部命名空間和全局命名空間里的變量。如果一個局部變量和一個全局變量重名,則局部變量會覆蓋全局變量。

每個函數都有自己的命名空間。類的方法的作用域規則和通常函數的一樣。

Python 會智能地猜測一個變量是局部的還是全局的,它假設任何在函數內賦值的變量都是局部的。

因此,如果要給函數內的全局變量賦值,必須使用 global 語句。

global VarName 的表達式會告訴 Python, VarName 是一個全局變量,這樣 Python 就不會在局部命名空間里尋找這個變量了。

例如,我們在全局命名空間里定義一個變量 Money。我們再在函數內給變量 Money 賦值,然后 Python 會假定 Money 是一個局部變量。然而,我們並沒有在訪問前聲明一個局部變量 Money,結果就是會出現一個 UnboundLocalError 的錯誤。取消 global 語句的注釋就能解決這個問題。

Money = 2000    #定義全局變量

def addmoney():
    #global Money
    Money = Money +1   #函數內不能直接調用全局變量,必須用global來聲明全局變量


print(Money)
addmoney()
print(Money)

5、dir()函數

dir() 函數一個排好序的字符串列表,內容是一個模塊里定義過的名字。

返回的列表容納了在一個模塊里定義的所有模塊,變量和函數。

import TEST
print(TEST.add(8,9))
con = dir(TEST)
print(con)

['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'add']

#特殊字符串變量__name__指向模塊的名字,__file__指向該模塊的導入文件名,add為函數名。

6、globals()和locals()函數

根據調用地方的不同,globals() 和 locals() 函數可被用來返回全局和局部命名空間里的名字。

如果在函數內部調用 locals(),返回的是所有能在該函數里訪問的命名。

如果在函數內部調用 globals(),返回的是所有在該函數里能訪問的全局名字。

兩個函數的返回類型都是字典。所以名字們能用 keys() 函數摘取。

7、reload() 函數

當一個模塊被導入到一個腳本,模塊頂層部分的代碼只會被執行一次。

因此,如果你想重新執行模塊里頂層部分的代碼,可以用 reload() 函數。該函數會重新導入之前導入過的模塊。

8、python中的包

包是一個分層次的文件目錄結構,它定義了一個由模塊及子包,和子包下的子包等組成的 Python 的應用環境。

簡單來說,包就是文件夾,但該文件夾下必須存在 __init__.py 文件, 該文件的內容可以為空。__int__.py用於標識當前文件夾是一個包。

#首先在根目錄下創建兩個目錄,分別創建模塊aa,bb
[root@python media1]# ls /media/
aa.py __pycache__
[root@python media1]# ls /media1/
bb.py  __pycache__
#在aa和bb模塊下創建函數:
[root@python media1]# cat /media/aa.py 

def munit(x,y):
    print('sun:',x+y)
    return x+y
[root@python media1]# cat /media1/bb.py 

def mule(x,y):
    return x**y

#調用模塊
[root@python ~]# cat init.py
import sys
sys.path.append("/media")
from aa import munit
print(sys.path)
s = munit(3,4)
print(s)


[root@python ~]# python35 init.py 
['/root', '/usr/local/python35/lib/python35.zip', '/usr/local/python35/lib/python3.5', '/usr/local/python35/lib/python3.5/plat-linux', '/usr/local/python35/lib/python3.5/lib-dynload', '/usr/local/python35/lib/python3.5/site-packages', '/media']
sun: 7
7


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM