Python中的模塊是能夠將代碼量較大的程序分割成多個有組織的、彼此獨立但又能互相交互的代碼片斷,這些自我包含的有組織的代碼段就是模塊。Python容許「導入」其餘模塊以實現代碼重用,從而也實現了將獨立的代碼文件組織成更大的程序系統。Python中,模塊也是對象。在一個模塊的頂層定義的全部變量都在被導入時成爲了被導入模塊的屬性。html
一、python程序架構
一個Python程序一般包括一個頂層程序文件和若干個模塊文件。頂層文件包含了程序的主要控制流程,模塊文件是爲頂層文件或其餘模塊提供各類功能性組件,模塊首次導入(或重載)時,Python會當即執行模塊文件的頂層程序代碼(不在函數內的代碼),而位於函數主體內的代碼直到函數被調用後纔會執行。
二、模塊的執行環境
模塊是被導入的,但模塊也能夠導入和使用其餘模塊,這些模塊能夠用Python或其它編程語言寫成
模塊可內含變量、函數以及類來進行其工做,而函數和類能夠包含變量和其它元素
三、導入模塊
在導入模塊時只能使用模塊名,而不能使用帶.py後綴的模塊文件名python
import語句: 導入指定的整個模塊,包括生成一個以模塊名命名的名稱空間 import module1[,module2[,...moduleN]] 建議一個import語句只導入一個模塊 import module as module_alias from-import語句: 經常使用於只導入指定模塊的部分屬性至當前名稱空間 from module import name1[,name2[,...nameN]] import和from-import是賦值語句 import和from是可執行語句,相似於def,所以,它們能夠嵌套在if測試中,出現於def中等等 Python執行到這些語句時纔會對其進行解析,這意味着,全部來自模塊的屬性僅在import語句執行後才能使用 模塊就是名稱空間 模塊的名稱空間能夠經過屬性__dict__或dir(M)獲取 模塊屬性可經過點號(.)運算符獲取,格式爲M.attr 模塊是一個獨立的做用域(本地變量就是全局變量)
四、import的工做機制
import語句導入指定的模塊時會執行三個步驟
一、找到模塊文件
在指定的路徑下(sys.path)搜索模塊文件
二、編譯成字節碼
文件導入時就會編譯,所以,頂層文件的.pyc字節碼文件在內部使用後會被丟棄,只有被導入的文件纔會留下.pyc文件
三、執行模塊的代碼來建立其所定義的對象
模塊文件中的全部語句會依次執行,從頭至尾,而此步驟中任何對變量名的賦值運算,都會產生所獲得的模塊文件的屬性
注意:模塊只在第一次導入時纔會執行如上步驟,後續的導入操做只不過是提取內存中已加載的模塊對象,reload()可用於從新加載模塊linux
time模塊用來操做時間值
時間戳:time.time()
格式化時間:字符串表示,time.strftime('%Y-%m-%d')
結構化時間:元組表示,time.localtime(), time.gmtime()算法
asctime:返回時間格式Sun Mar 18 10:51:28 2018 In [1]: import time In [2]: time.asctime() Out[2]: 'Sun Mar 18 10:51:28 2018' In [3]: time.asctime(time.localtime()) Out[3]: 'Sun Mar 18 10:51:45 2018' ctime:將自紀元以來的時間以秒爲單位轉換爲本地時間的字符串,至關於time.asctime(time.localtime()) In [4]: time.ctime() Out[4]: 'Sun Mar 18 10:55:26 2018' gmtime:當前UTC時間 In [7]: time.gmtime() Out[7]: time.struct_time(tm_year=2018, tm_mon=3, tm_mday=18, tm_hour=2, tm_min=58, tm_sec=1, tm_wday=6, tm_yday=77, tm_isdst=0) localtime:返回本地時間 In [9]: time.localtime() Out[9]: time.struct_time(tm_year=2018, tm_mon=3, tm_mday=18, tm_hour=11, tm_min=3, tm_sec=56, tm_wday=6, tm_yday=77, tm_isdst=0) strptime:將傳入的時間轉換爲str格式的時間 In [11]: time.strptime('2018-3-18', '%Y-%m-%d') Out[11]: time.struct_time(tm_year=2018, tm_mon=3, tm_mday=18, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=77, tm_isdst=-1) strftime:將struct格式時間轉換爲指定格式的時間 In [13]: time.strftime('%Y-%m-%d') Out[13]: '2018-03-18' In [14]: time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime()) Out[14]: '2018-03-18 03:09:47' mktime:將struct時間轉換爲時間戳 In [15]: time.mktime(time.strptime('2018-3-18', '%Y-%m-%d')) Out[15]: 1521302400.0 sleep:睡眠時間 In [16]: time.sleep(5)
datetime模塊用來操做時間
datetime.date:表示日期的類。經常使用的屬性有year, month, day
datetime.time:表示時間的類。經常使用的屬性有hour, minute, second, microsecond
datetime.datetime:表示日期時間
datetime.timedelta:表示時間間隔,即兩個時間點之間的長度
timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])
strftime("%Y-%m-%d")shell
>>> import datetime >>> import time #當前時間 >>> print(datetime.datetime.now()) 2018-03-18 12:10:27.199643 #格式化時間戳 >>> print(datetime.date.fromtimestamp(time.time())) 2018-03-18 #當前時間➕3天 >>> print(datetime.datetime.now() + datetime.timedelta(3)) 2018-03-21 12:10:52.869598 #當前時間➖3天 >>> print(datetime.datetime.now() + datetime.timedelta(-3)) 2018-03-15 12:11:04.721491 #當前時間➕3小時 >>> print(datetime.datetime.now() + datetime.timedelta(hours=3)) 2018-03-18 15:11:18.628036 #當前時間➖4小時 >>> print(datetime.datetime.now() + datetime.timedelta(hours=-4)) 2018-03-18 08:11:42.096182 #當前時間➕120分鐘 >>> print(datetime.datetime.now() + datetime.timedelta(minutes=120)) 2018-03-18 14:11:53.305800
隨機數編程
In [1]: import random In [2]: random.random() Out[2]: 0.9381887159573181 #隨機返回1到10之間的整數 In [3]: random.randint(1,10) Out[3]: 8 #從1到10中,2爲步長隨機返回一個數 In [4]: random.randrange(1,10,2) Out[4]: 5 #隨機返回序列中的元素 In [5]: random.choice([1,2,3,4]) Out[5]: 3 #打亂序列中的元素順序 In [10]: l1 = [1,2,3,4] In [11]: random.shuffle(l1) In [12]: l1 Out[12]: [1, 2, 4, 3] #隨機返回序列中的2個元素 In [13]: random.sample(l1,2) Out[13]: [2, 4]
例:生成驗證碼安全
import random def rand_num(): code = '' for i in range(8): add = random.choice([random.randrange(10),chr(random.randrange(65,91))]) code += str(add) print(code) rand_num()
os模塊是兩大核心繫統模塊中較大的那個,它包含了在C程序和shell腳本中常常用到的全部操做系統調用。os模塊能夠輕鬆實現不依賴於平臺的操做系統調用,用os和os.path編寫的腳本一般無需改動便可在其餘平臺上運行。
一、管理工具架構
In [3]: import os getpid:給出調用函數的進程的ID In [4]: os.getpid() Out[4]: 2017 getcwd:返回當前工做目錄 In [5]: os.getcwd() Out[5]: '/home/ops-jym' chdir:改變程序運行目錄 In [6]: os.chdir(r'/home') In [7]: os.getcwd() Out[7]: '/home' pathsep:輸出用於分割文件路徑的字符串 In [8]: os.pathsep Out[8]: ':' sep:輸出操做系統特定的路徑分隔符,win下爲"\\",Linux下爲"/" In [9]: os.sep Out[9]: '/' linesep:輸出當前平臺使用的行終止符,win下爲"\t\n",Linux下爲"\n" In [10]: os.linesep Out[10]: '\n' pardir:獲取當前目錄的父目錄字符串名 In [11]: os.pardir Out[11]: '..' curdir:返回當前目錄 In [12]: os.curdir Out[12]: '.'
二、os.pathapp
isdir:檢查給出的文件是不是目錄 In [13]: os.path.isdir(r'/home/ops-jym'),os.path.isdir(r'/etc/issue') Out[13]: (True, False) isfile:檢查給出的文件是不是文件 In [14]: os.path.isfile(r'/home/ops-jym'),os.path.isfile(r'/etc/issue' ...: ) Out[14]: (False, True) exists:檢查文件是否存在 In [16]: os.path.exists(r'/etc/issue'),os.path.exists(r'/etc/123') Out[16]: (True, False) getsize:返回給出文件的大小 In [17]: os.path.getsize(r'/etc/issue') Out[17]: 23 split:將path分割成目錄和文件名二元組返回 In [18]: os.path.split(r'/home/ops-jym') Out[18]: ('/home', 'ops-jym') join:將多個路徑組合後返回,第一個絕對路徑以前的參數將被忽略 In [19]: os.path.join(r'/home','ops-zhh') Out[19]: '/home/ops-zhh' splitext:剝離文件擴展名(最後一個 . 後面的內容) In [20]: os.path.splitext(r'/home/ops-jym/shell_script/lamp.sh') Out[20]: ('/home/ops-jym/shell_script/lamp', '.sh') normpath:對於路徑中混用了win和linux的分隔符的,使用normpath來處理 In [21]: os.path.normpath(r'C:\123\123') Out[21]: 'C:\\123\\123' In [22]: os.path.normpath(r'/home//ops-jym') Out[22]: '/home/ops-jym' abspath:返回path規範化的絕對路徑 In [23]: os.path.abspath(" ") Out[23]: '/home' In [24]: os.path.abspath('ops-jym') Out[24]: '/home/ops-jym'
三、運行shell命令dom
system:在Python腳本中運行shell命令 In [38]: os.system('ls -al') 總用量 3948560 drwxr-xr-x. 5 root root 87 1月 19 17:29 . dr-xr-xr-x. 18 root root 4096 3月 19 16:33 .. drwxr-xr-x. 2 root root 4096 12月 22 17:19 jiayimeng drwx------. 11 ops-jym ops-jym 4096 2月 23 10:34 ops-jym drwx------. 5 ops-zhh ops-zhh 4096 12月 26 14:53 ops-zhh -rw-r--r--. 1 root root 4043309056 12月 22 17:10 rhel-server-7.2-x86_64-dvd.iso Out[38]: 0 popen:運行shell命令並與其輸入或輸出流相鏈接(迭代器對象) In [39]: os.popen('cat /etc/issue').read() Out[39]: '\\S\nKernel \\r on an \\m\n\n'
上面的兩個例子能夠看出,system和popen都有其侷限性,儘管兩個函數自己有很好的可移植性,但其真正的可移植程度決定於所運行的命令,因此咱們使用subprocess模塊來實現system和popen的功能。
四、其餘工具
os.environ:獲取和設置shell環境變量 os.fork:在類UNIX系統下派生新的子進程 os.pipe:負責進程間通訊 os.open:打開基於底層描述符的文件(與python內建open函數不一樣) os.mkdir:建立新目錄 os.mkfifo:建立新的命名管道 os.stat:獲取文件底層信息 os.remove:根據路徑名刪除文件 os.walk:將函數或循環應用與整個目錄樹的各部分
更多os模塊詳細內容,請看這裏 -->猛擊這裏
sys模塊與os模塊組成了Python系統相關工具集的核心部分。
In [41]: import sys #獲取平臺版本信息 In [42]: sys.platform,sys.maxsize,sys.version Out[42]: ('linux', 9223372036854775807, '3.6.4 (default, Dec 26 2017, 13:57:54) \n[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)]') #模塊搜索路徑 In [43]: sys.path Out[43]: ['', '/usr/bin', '/usr/local/python3/lib/python36.zip', '/usr/local/python3/lib/python3.6', '/usr/local/python3/lib/python3.6/lib-dynload', '/usr/local/python3/lib/python3.6/site-packages', '/usr/local/python3/lib/python3.6/site-packages/IPython/extensions', '/root/.ipython'] #利用列表操做修改模塊搜索路徑(append,extend,insert,pop,remove,del) In [44]: type(sys.path) Out[44]: list In [45]: sys.path.append(r"/home") In [46]: sys.path Out[46]: ['', '/usr/bin', '/usr/local/python3/lib/python36.zip', '/usr/local/python3/lib/python3.6', '/usr/local/python3/lib/python3.6/lib-dynload', '/usr/local/python3/lib/python3.6/site-packages', '/usr/local/python3/lib/python3.6/site-packages/IPython/extensions', '/root/.ipython', '/home'] In [47]: sys.path.remove('/home') #查看已加載模塊 In [50]: list(sys.modules.keys()) #查看對象的引用次數 In [50]: sys.getrefcount("sys") Out[50]: 626 In [51]: sys.getrefcount("os") Out[51]: 687 #顯示爲由字符串組成的列表的命令行參數 In [52]: sys.argv Out[52]: ['/bin/ipython3'] #標準流 sys.stdin、sys.stdout、sys.stderr #程序退出 sys.exit
更多sys模塊詳細內容 -->猛擊這裏
Python的hashlib模塊提供了用於摘要的相關操做,代替了md5,sha模塊。
MD5是最多見的摘要算法,速度很快,生成結果是固定的128 bit字節,一般用一個32位的16進制字符串表示。
import hashlib hash = hashlib.md5() hash.update(bytes('python',encoding='utf-8')) hash.update(bytes('hashlib',encoding='utf-8')) print(hash.hexdigest())
結果以下
377f64c42b532c45aeb9aefaab0b81c4
sha1是另外一種較爲常見的摘要算法,調用與md5類似,SHA1的結果是160 bit字節,一般用一個40位的16進制字符串表示。
hash = hashlib.sha1() hash.update(bytes('python',encoding='utf-8')) hash.update(bytes('hashlib',encoding='utf-8')) print(hash.hexdigest())
結果以下
7459c50714857e221f9b9ee36314f385b90b6c82
SHA系列的摘要算法還包括SHA1, SHA224, SHA256, SHA384, SHA512,摘要長度越長,安全性就更高,相對應的,速度也就越慢。
import hashlib hash = hashlib.sha3_512() hash.update(bytes('python',encoding='utf-8')) hash.update(bytes('hashlib',encoding='utf-8')) print(hash.hexdigest()) 結果以下: 3242741c74818ee36c3fe17a1d98180554b384a1c162325343e423f74acc2da125b2dd191d2a5a3fb388a2640f426b2acf09a49576e833a4a5cf5a697ec2c787
上述的摘要算法讓數據已經很安全了,不過,仍是有些瑕疵,即經過撞庫能夠反解,咱們能夠在加一層保險
import hashlib hash = hashlib.sha3_512(bytes('abcd',encoding='utf-8')) hash.update(bytes('python',encoding='utf-8')) hash.update(bytes('hashlib',encoding='utf-8')) print(hash.hexdigest()) 結果以下: 0287ef90ce6a8f3d4ea4be5e5cc9f229267b17250a34faf62d9ee286819e8e4aad7783a63898bf76c2ffeaf657590cfaa62e34acbaba80105572ef0f64829cda
hashlib模塊的應用比較普遍,好比應用在網上提供服務,同時附上了其摘要字符串,若是有人篡改了你的應用,其摘要字符串就發生了改變,人們就能發現應用發生了改變。