Python基础概念_6_模块
模塊
7 模塊
7.1?簡介
在上一章里我們知道了如何創建和使用函數。如果你想要在其它程序中重用很多函數,那么你該如何實現呢?你可能已經猜到了,答案是使用本章要講的模塊。
模塊可以讓你能夠有邏輯的組織你的Python代碼段。通過把相關的代碼分配到一個模塊里能讓你的代碼更好用,更易懂。模塊就是一個保存了Python代碼的文件。模塊可以定義函數,類和變量,當然模塊里也能包含可執行的代碼。
7.2 ?import語句
如果python文件中想引用另外個文件,則可以使用import語句。這里給個例子:
1) 假設我們將之前的函數getRectangleArea保存成文件MyTools.py。
defgetRectangleArea(length,breadth=2):
??? return "形參里的長度是:"+str(length)+"\t形參里的寬度是"+str(breadth)+"\n當前長方形的面積是:"+str(length*breadth)
?
注:這里文件類型要是utf-8編碼。
2)我們再新建個文件加MyMain.py里面的內容是調用MyTools.py里定義的getRectangleArea函數。
import MyTools
print(MyTools.getRectangleArea(breadth=3,length=8))
?
這段代碼是怎么執行的呢?
首先Python遇到import會在.py文件的當前目錄找MyTools.py這個文件,
當執行到下一行時先會調用MyTools.py里定義的getRectangleArea方法。
最后通過print打印出函數的返回值,也就是3*8=24。
注:這里我們調用getRectangleArea函數時需要加上MyTools.不然會函數未定義的錯:
?
C:\PythonTest>python MyMain.py
Traceback (most recent call last):
? File"MyMain.py", line 2, in <module>
???print(getRectangleArea(breadth=4,length=9))
NameError: name 'getRectangleArea' is notdefined
3)我們在命令行里通過python MyMain.py來驗證:
結果:
形參里的長度是:8??????? 形參里的寬度是3
當前長方形的面積是:24
7.3 from…import 語句
該語句是允許你從模塊中一個指定的部分到當前命名空間中,語法如下:
from modname import name1[, name2[, ...nameN]]
所以上一節我們可以這么寫:
fromMyTools import getRectangleArea
print(getRectangleArea(breadth=4,length=9))
注:這里我們不需要再加MyTools.getRectangleArea
7.4 from…import* 語句
如果想把一個模塊的所有內容都導入到當前的命名空間就可以用該語句。
?
7.5?定位模塊
當我們導入一個模塊,Python解析器對模塊位置的搜索順序是:
?? 當前目錄
?? PYTHONPATH下的每個目錄,這里是Python的環境變量。
?? 默認路徑,如:UNIX下一般為/usr/local/lib/python/
?
7.6 dir函數
如果想了解一個模塊定義的標識符,可以通過dir函數進行查看,這里的標識符有函數、類和變量。比如我們看系統內的sys模塊,可以在python命令行里這么做:
>>>import sys
>>>dir(sys)
結果:
['__displayhook__','__doc__', '__excepthook__', '__interactivehook__', '__loade
r__', '__name__','__package__', '__spec__', '__stderr__', '__stdin__', '__stdou
t__','_clear_type_cache', '_current_frames', '_debugmallocstats', '_enablelegac
ywindowsfsencoding','_getframe', '_home', '_mercurial', '_xoptions', 'api_versi
on', 'argv','base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteord
er', 'call_tracing','callstats', 'copyright', 'displayhook', 'dllhandle', 'dont
_write_bytecode','exc_info', 'excepthook', 'exec_prefix', 'executable', 'exit',
?'flags', 'float_info', 'float_repr_style','get_asyncgen_hooks', 'get_coroutine
_wrapper','getallocatedblocks', 'getcheckinterval', 'getdefaultencoding', 'getf
ilesystemencodeerrors','getfilesystemencoding', 'getprofile', 'getrecursionlimi
t', 'getrefcount','getsizeof', 'getswitchinterval', 'gettrace', 'getwindowsvers
ion', 'hash_info','hexversion', 'implementation', 'int_info', 'intern', 'is_fin
alizing', 'last_traceback','last_type', 'last_value', 'maxsize', 'maxunicode',
'meta_path','modules', 'path', 'path_hooks', 'path_importer_cache', 'platform',
?'prefix', 'ps1', 'ps2', 'set_asyncgen_hooks','set_coroutine_wrapper', 'setchec
kinterval','setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace',
'stderr', 'stdin','stdout', 'thread_info', 'version', 'version_info', 'warnopti
ons', 'winver']
?
?
看上去有點復雜,這些都是Python系統預定義的函數或者類。我們還是以求面積的函數為例來講解下dir函數。不過在MyTools.py的getRectangleArea函數后再加個函數MyName,具體內容見下:
defgetRectangleArea(length,breadth=2):
??? return "形參里的長度是:"+str(length)+"\t形參里的寬度是"+str(breadth)+"\n當前長方形的面積是:"+str(length*breadth)
defgetMyName(firstName,LastName):
??? return "我的名字是"+firstName+"\t"+LastName
?
importMyTools
print(dir(MyTools))
?
結果:
我的名字是james bond
['__builtins__','__cached__', '__doc__', '__file__', '__loader__', '__name__',
'__package__','__spec__', 'getMyName','getRectangleArea']
注:這里dir查到的函數就是getMyName和getRectangleArea。
7.7?模塊的__name__
上一節我們執行dir函數查找模塊的標識符時會看到__name__,它是每個模塊內置的屬性,記錄著模塊的名字。所以我們在執行MyMain.py時會有這樣的結果:
MyMain.py文件內容:
importMyTools
print(MyTools.__name__)
print(__name__)
C:\PythonTest>python MyMain.py
結果:
MyTools
__main__
7.8?包
包是一個分層次的文件目錄結構,它定義了一個由模塊及子包下的模塊的組成結構。眾所周知世界分5大洲,其中有亞洲,亞洲里包含中國、印度,它們的首都分別是北京和新德里。我們就通過python代碼結合這個層次來演示下包的概念,它們的層次可表示為下圖樹形結構:
C:\PythonTest>tree /f
注:
1這里為了演示方便僅貼出了MyPackage.py和beijing.py的代碼因為它們的內容大同小異。
2 這里tree是windows/linux里的命令,可以顯示目錄的樹形結構。通過上面可以看出文件夾china和india是一級的。
MyPackage.py代碼:
importworld.asia.china.beijing as beijing
importworld.asia.india.newdelhi as newdelhi
importworld.asia.indiadesc as india
importworld.asia.chinadesc as china
importworld.asiadesc as asia
importworlddesc as world
if__name__ == '__main__':
??? print(beijing.getCurrentLevelName())
??? print(newdelhi.getCurrentLevelName())
??? print(india.getCurrentLevelName())
??? print(china.getCurrentLevelName())
??? print(asia.getCurrentLevelName())
??? print(world.getCurrentLevelName())
beijing.py代碼:
defgetCurrentLevelName(LevelName='beijing'):
??? return "我在第"+str(4)+"層,我是:"+LevelName+"(北京)"+"。我的上層是china(中國)"
?
執行MyPackage.py
C:\PythonTest>python MyPackage.py
結果:
我在第4層,我是:beijing(北京)。我的上層是china(中國)
我在第4層,我是:newdelhi(新德里)。我的上層是india(印度)
我在第3層,我是:india(印度)我的上層是asia(亞洲)
我在第3層,我是:china(中國)我的上層是asia(亞洲)
我在第2層,我是:asia(亞洲)我的上層是world(世界)
我在第1層,我是:world(世界),我的上層沒了
注:
1需要注意個細節,包同一級內的文件夾里不能再存在和包相同的py文件,如果存在了也不能引用里面的模塊。
2 部分源代碼見下:chinadesc.py及indiadesc.py方法與外圍的worlddesc.py方法類似,打印的名字不同而已.以下以MyPackage.py和worlddesc.py為例:
MyPackage.py源碼:
import world.asia.china.beijing as beijing import world.asia.india.newdelhi as newdelhi import world.asia.indiadesc as india import world.asia.chinadesc as china import world.asiadesc as asia import worlddesc as world if __name__ == '__main__':print(beijing.getCurrentLevelName())print(newdelhi.getCurrentLevelName())print(india.getCurrentLevelName())print(china.getCurrentLevelName())print(asia.getCurrentLevelName())print(world.getCurrentLevelName()) ? worlddesc.py源碼: def getCurrentLevelName(LevelName='world'):return "我在第"+str(1)+"層,我是:"+LevelName+"(世界)"+",我的上層沒了"完整示例代碼詳見資源:
http://download.csdn.net/detail/shenliang1985/9874376
7.9?總結
通過本章的學習我們知道了模塊可更好將函數封裝起來,還知道了如何自己定義一個模塊,以及自己通過包的方式管理模塊,以及怎么看模塊的內置屬性。接下來,來了解另外個概念數據結構。
? 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Python基础概念_6_模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鸿星尔克遭网友取关 每天流失上万粉丝
- 下一篇: 万能险部分领取是什么意思