[Python] Python中的模組、包和內建函式
1.模組
python 模組簡單來說就是一個.py檔案,程式的目的是執行,而模組的目的是供其他程式匯入並且使用。
模組也有物件,每個模組物件都有一個特殊屬性:__dict__
,這是一個包含模組符號表的字典。
匯入模組
import importable
import imporable1,imporable2
import importabl as name #重新命名
import 語句並不是需要模組物件或直接操作模組物件,它僅僅是需要匯入模組的定義。
匯入某一模組中的物件
from os import path
from importable import object
from importable import object as name
from importable import (object1,obj2,...,obj3)
from importable import* #可能會有名稱衝突
如果使用最後那種格式,則將匯入所有的非私有的物件,或者變數all中存放的名稱列表。
匯入一個模組時,Python會在sys.path列表中的路徑中依次搜尋該模組,我的sys.path路徑如下:
path = [
'/home/jiayongqiang/Downloads/deb package/pycharm-community-2017.3.4/helpers' ,
'/usr/lib/python35.zip',
'/usr/lib/python3.5',
'/usr/lib/python3.5/plat-x86_64-linux-gnu',
'/usr/lib/python3.5/lib-dynload',
'/home/jiayongqiang/PycharmProjects/demo1/venv/lib/python3.5/site-packages',
'/home/jiayongqiang/PycharmProjects/demo1/venv/lib/python3.5/site-packages/setuptools-28.8.0-py3.5.egg',
'/home/jiayongqiang/PycharmProjects/demo1/venv/lib/python3.5/site-packages/pip-9.0.1-py3.5.egg' ,
]
如果自定義的模組和內建模組名稱相同,那麼會先使用自定義的模組,從而會導致一些問題,因此在自定義模組名時,不能和內建模組或其他Python庫中的名稱相同。
一般內建模組使用小寫字母命名,所以自定義模組第一個字母大寫,可以避免
可以在命令列使用如下命令檢測是否內建有對應名稱的模組,丟擲異常則說明沒有:
$ python -c "import sys"
$ python -c "import CustomModule"
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: No module named 'CustomModule'
$
在pytho載入某個模組時,首先會找該模組同名、以.pyo結尾的檔案,.pyo檔案表示最優化的位元組碼編譯版本,如果不存在該.pyo檔案,則查詢是否存在.pyc檔案,該檔案為非優化的位元組碼編譯版本,如果不存在,則會載入.py檔案,並將該檔案編譯成位元組碼編譯檔案。因此,無論哪種形式,Python都以位元組碼編譯的形式將檔案載入到記憶體中,從而在直譯器執行時,有更快的速度,只需要載入、執行程式碼,而不是載入、編譯、執行。
2.包
包是一個目錄,包含一組模組和__init__.py
檔案,支援多層巢狀。格式如下:
├── MyPackage
│ ├── Basketball.py
│ ├── Football.py
│ └── __init__.py
使用時,通過import匯入:
import MyPackage.Football
s = MyPackage.Football.play()
或者重新命名簡化模組名:
import MyPackage.Football as football
s = football.play()
或者使用from importable import …:
from MyPackage import Football
Football.play()
或者使from importable import*匯入,這種匯入方式需要在__init__.py
中建立一個__all__
變數儲存名稱,如:
__all__ =["Basketball","Football"]
再進行匯入:
import sys
from MyPackage import *
Football.play()
3.常用內建函式
Python中提供了一些常用內建函式,其中有些已經用的非常多了,在這裡進行下總結
3.1迭代操作
any(i)
:如果可迭代型別物件i(下同)中的任一項都為True,則返回True,否則返回False
all(i)
:如果i中的每一項都為True,則返回True,否則返回False
enumerate(i,start)
:常用於for…in…迴圈中,返回一個列舉物件,該物件也為一個迭代子,每次迭代會返回一個二元組,第一項為迭代次數,第二項為enumerate中的迭代項。索引起始值為0或start(如果指定),如:
>>> l = ["java","python","android"]
>>> for i,j in enumerate(l):
print(i,j)
0 java
1 python
2 android
>>>
len(x)
:返回x的長度,組合型別返回資料項個數,str型別返回字元個數
max(i,key)
:返回i中的最大項
min(i,key)
:返回i中的最小項
range(start,end,step)
:返回一個整數迭代子
reversed(i)
:反轉i,並作為一個迭代子返回
sorted(i,key,reversed)
:對i進行排序並返回,key用於提供DSU修飾排序,reversed如果為True,則排序以反序進行。
sum(i,start)
:求和,如果指定start,則加上start值
zip(i1,...,in)
:以一個或多個iterable為引數,返回一個迭代子,該迭代子將返回元組,第一個元組中存放每個iterable的第一個資料項,第二個元組中存放每個iterable的第二個資料項,以此類推,如:
>>> for t in zip(range(4),range(2,24,2),range(3,20,2)):
print(t)
(0, 2, 3)
(1, 4, 5)
(2, 6, 7)
(3, 8, 9)
>>>