函數+類->模塊 模塊+模塊->包 函數+類+模塊+包=Pythonpython
python的程序由包(package)、模塊(module)和函數組成。模塊是處理某一類問題的集合,模塊由函數和類組成。包是由一系列模塊組成的集合。如圖所示:程序員
包就是一個完成特定任務的工具箱,python提供了許多有用的工具包,如字符串處理、圖形用戶接口、Web應用、圖形圖像處理等。使用自帶的這些工具包,能夠提升程序員的開發效率,減小編程的複雜度,達到代碼重用的效果。這些自帶的工具包和模塊安裝在Python的安裝目錄下的lib子目錄中。編程
例如,lib目錄中的xml文件夾。xml文件夾就是一個包,這個包用於完成XML的應用開發。xml包中有幾個子包:dom、sax、etree和parsers。文件__init__.py是xml包的註冊文件,若是沒有該文件,Python將不能識別xml包。在系統字典表中定義了xml包。vim
注意:包必須至少含有一個__init__.py文件。__init__.py文件的內容能夠爲空,它用於識別當前文件夾是一個包。數組
模塊是python中重要的概念,python的程序是由一個個模塊組成的。前面已經接觸到了模塊,一個python文件就是一個模塊。app
5.2.1 模塊的建立dom
模塊把一組相關的函數或代碼組織到一個文件中。一個文件便是一個模塊。模塊由代碼、函數或類組成。建立一個名爲myModule.py的文件,即定義了一個名爲myModule的模塊。在myModule模塊中定義一個函數func()和一個類MyClass 。MyClass類中定義一個方法myFun()。函數
#!/usr/bin/env python #vim myModule.py #自定義模塊 def func(): #函數 print("MyModule.func()") class MyClass: #類 def myFunc(self): print("MyModule.MyClass.myFunc()")
#!/usr/bin/env python #vim call_myModule.py #調用自定義模塊的類和函數 import myModule myModule.func() myClass=myModule.MyClass() myClass.myFunc()
[root@Dannyserver danny]# python call_myModule.py
MyModule.func()
MyModule.MyClass.myFunc()
注意:模塊myModule.py和call_myModule.py須要在同一目錄下,或放在sys.path所列出的目錄下;不然python解釋器找不到自定義的模塊工具
當python導入一個模塊時,python首先查找當前路徑,而後查找lib目錄、site-packages目錄(Python\Lib\site-packages)和環境變量PYTHONPATH(pythonpath)設置的目錄。若是導入的模塊沒有找到,在以上路徑搜索下是否含有這個模塊。能夠經過sys.path語句搜索模塊的查找路徑。測試
5.2.2 模塊的導入
在使用一個模塊的函數或類以前,首先要導入該模塊。模塊的導入使用import語句,如:
import module_name
這條語句能夠直接導入一個模塊。調用模塊的函數或類時,須要以模塊名做爲前綴,其格式以下:
module_name.func()
若是不想在程序中使用前綴符,能夠使用from...import...語句導入。格式以下:
from module_name import function_name
後面調用function_name就等同於調用module_name.function_name
導入模塊下全部的類和函數,能夠使用以下格式:
from module_name import *
此外,同一個模塊文件支持多條import語句。例如,定義一個名爲myModule的模塊。該模塊定義一個全局變量count和一個函數func()。每次調用函數func(),使變量count的值加1。
#vim myModule.py count=1 def func(): global count count=count+1 return count
#vim a.py
import myModule print("count=", myModule.func()) myModule.count=10 print("count=",myModule.count) import myModule print("count=",myModule.func())
[root@Dannyserver test2]# python a.py count= 2 count= 10 count= 11
python中的import語句比Java的import語句更加靈活。python的import語句能夠置於程序中任意的位置,甚至能夠放在條件語句中,在上面的代碼段添加以下語句:
if myModule.count>1: myModule.count=1 else: import myModule print("count=", myModule.count)
輸出結果
[root@Dannyserver test2]# python a.py count= 2 count= 10 count= 11 count= 1
5.2.3 模塊的屬性
模塊有一些內置屬性,用於完成特定的任務,如__name__、__doc__。每一個模塊都有一個名稱,例如,__name__用於判斷當前模塊是不是程序的入口,若是當前程序正在被使用,__name__的值爲「__main__」。一般給每一個模塊都添加一個條件語句,用於單獨測試該模塊的功能。例如,建立一個模塊myModule。
if __name__=="__main__": print("myModule做爲主程序運行") else: print("myModule被另外一個模塊調用")
單獨運行該模塊輸出結果:
[root@Dannyserver test2]# python a.py
myModule做爲主程序運行
建立另外一個模塊call_myModule。這麼模塊很簡單,只要導入模塊myModule便可
import myModule print(__doc__) #調用了模塊另外一個屬性__doc__。因爲該模塊沒有定義文檔字符串,因此輸出None
[root@Dannyserver test2]# python call_myModule.py
myModule被另外一個模塊調用
None
5.2.4 模塊的內置函數
Python提供了一個內聯模塊buildin。內聯模塊定義了一些開發中常常使用的函數,利用這些函數能夠實現數據類型的轉換、數據的計算、序列的處理等功能。下面將介紹內聯模塊中經常使用的函數。
1. apply()
python3中移除了apply函數,因此再也不可用了。調用可變參數列表的函數的功能只能使用在列表前添加*來實現。
2. filter()
filter()能夠對某個序列作過濾處理。判斷自定義函數的參數返回的結果是否爲真來過濾,並一次性返回處理結果。filter()的聲明以下所示
class filter(object)
filter(function or None,iterable) -->filter object
filter()過濾序列的功能示例:
def func(x): if (x>0): return x print (filter(func,range(-9,10))) #調用filter函數,返回的是filter對象 print(list(filter(func,range(-9,10)))) #將filter對象轉換爲列表
[root@Dannyserver test2]# python a.py <filter object at 0x7fd4f762a160> #直接打印出的是filter對象,沒法看到內容 [1, 2, 3, 4, 5, 6, 7, 8, 9] #將filter對象轉換爲列表
說明:第三行代碼,使用range()生成待處理的列表,而後把該列表的值依次傳入func()。func返回結果給filter(),最後將結果生成一個可迭代對象返回,能夠進行遍歷。
注意:filter()中的過濾函數func()的參數不能爲空。不然,沒有能夠存儲序列(sequence)元素的變量,func()也不能處理過濾。
3.reduce()
對序列中元素的連續操做能夠經過循環來處理。例如,對某個序列中的元素累加操做。Python提供的reduce()也能夠實現連續處理的功能。在python2中reduce()存在與全局空間中,能夠直接調用。而在python3中將其移到了functools模塊中,因此使用以前須要先引入。reduce()的聲明以下所示:
reduce(func,sequence[ , initial]) ->value
說明:
參數func是自定義的函數,在函數func()中實現對參數sequence的連續操做。
參數sequence是待處理的序列
參數inital能夠省略,若是inital不爲空,則inital的值將首先傳入func()進行計算。若是sequence爲空,則對initial的值進行處理。
reduce()的返回值是func()計算後的結果。
下面實現了對一個列表的數字進行累加的操做。
def sum(x,y): return (x+y) from functools import reduce #引入reduce print(reduce(sum,range(0,10))) #0+1+2+3+4+5+6+7+8+9 print(reduce(sum,range(0,10),10)) #10+0+1+2+3+4+5+6+7+8+9 print(reduce(sum,range(0,0),10)) #range(0,0)返回0,因此直接返回後面的10
[root@Dannyserver test2]# python a.py 45 55 10
注:reduce()還能夠對數字進行乘法、階乘等複雜的累計計算。若是用reduce()進行累計計算,必須在sum中定義兩個參數,分別對應加法運算符兩側的操做表。
4.map()
map()能夠對tuple元組進行「解包」操做,調用時設置map()的第一個參數爲None。map()的功能很是強大,能夠對多個序列的每一個元素都執行相同的操做,並返回一個map對象。map()的聲明以下所示:
class map(object)
map(func,*iterables) -->map object
說明:
參數func()是自定義的函數,實現對序列每一個元素的操做
參數iterables是待處理的序列,參數iterables的個數能夠是多個
map()的返回值是對序列元素處理後的列表。
下面這段代碼實現了列表中數字的冪運算
def power(x): return (x**x) print(map(power,range(1,5))) #打印map對象 print(list(map(power,range(1,5)))) #轉換爲列表輸出 def power2(x,y): return (x**y) print(map(power2,range(1,5),range(5,1,-1))) #打印map對象 print(list(map(power2,range(1,5),range(5,1,-1)))) #轉換爲列表輸出,提供兩個列表參數。依次計算1^五、2^四、3^三、4^2
[root@Dannyserver test2]# python a.py <map object at 0x7f3d35d97208> [1, 4, 27, 256] <map object at 0x7f3d35d97240> [1, 16, 27, 16]
注意:若是map()中提供多個序列,則每一個序列中的元素一一對應進行計算,如上。若是每一個序列的長度不一樣,則短的序列後補充None再進行計算。