模塊,用一堆代碼實現了某個功能的代碼集合。 python
相似於函數式編程和麪向過程編程,函數式編程則完成一個功能,其餘代碼用來調用便可,提供了代碼的重用性和代碼間的耦合。而對於一個複雜的功能來,可能須要多個函數才能完成(函數又能夠在不一樣的.py文件中),n個 .py 文件組成的代碼集合就稱爲模塊。程序員
如:os 是系統相關的模塊;file是文件操做相關的模塊正則表達式
模塊分爲三種:算法
一、定義模塊shell
情景一:macos
情景二:編程
情景三:bash
二、導入模塊app
Python之因此應用愈來愈普遍,在必定程度上也依賴於其爲程序員提供了大量的模塊以供使用,若是想要使用模塊,則須要導入。導入模塊有一下幾種方法:dom
1
2
3
4
|
import
module
from
module.xx.xx
import
xx
from
module.xx.xx
import
xx as rename
from
module.xx.xx
import
*
|
導入模塊其實就是告訴Python解釋器去解釋那個py文件
那麼問題來了,導入模塊時是根據那個路徑做爲基準來進行的呢?即:sys.path
1
2
3
4
5
|
import
sys
print
sys.path
結果:
[
'/Users/wupeiqi/PycharmProjects/calculator/p1/pp1'
,
'/usr/local/lib/python2.7/site-packages/setuptools-15.2-py2.7.egg'
,
'/usr/local/lib/python2.7/site-packages/distribute-0.6.28-py2.7.egg'
,
'/usr/local/lib/python2.7/site-packages/MySQL_python-1.2.4b4-py2.7-macosx-10.10-x86_64.egg'
,
'/usr/local/lib/python2.7/site-packages/xlutils-1.7.1-py2.7.egg'
,
'/usr/local/lib/python2.7/site-packages/xlwt-1.0.0-py2.7.egg'
,
'/usr/local/lib/python2.7/site-packages/xlrd-0.9.3-py2.7.egg'
,
'/usr/local/lib/python2.7/site-packages/tornado-4.1-py2.7-macosx-10.10-x86_64.egg'
,
'/usr/local/lib/python2.7/site-packages/backports.ssl_match_hostname-3.4.0.2-py2.7.egg'
,
'/usr/local/lib/python2.7/site-packages/certifi-2015.4.28-py2.7.egg'
,
'/usr/local/lib/python2.7/site-packages/pyOpenSSL-0.15.1-py2.7.egg'
,
'/usr/local/lib/python2.7/site-packages/six-1.9.0-py2.7.egg'
,
'/usr/local/lib/python2.7/site-packages/cryptography-0.9.1-py2.7-macosx-10.10-x86_64.egg'
,
'/usr/local/lib/python2.7/site-packages/cffi-1.1.1-py2.7-macosx-10.10-x86_64.egg'
,
'/usr/local/lib/python2.7/site-packages/ipaddress-1.0.7-py2.7.egg'
,
'/usr/local/lib/python2.7/site-packages/enum34-1.0.4-py2.7.egg'
,
'/usr/local/lib/python2.7/site-packages/pyasn1-0.1.7-py2.7.egg'
,
'/usr/local/lib/python2.7/site-packages/idna-2.0-py2.7.egg'
,
'/usr/local/lib/python2.7/site-packages/pycparser-2.13-py2.7.egg'
,
'/usr/local/lib/python2.7/site-packages/Django-1.7.8-py2.7.egg'
,
'/usr/local/lib/python2.7/site-packages/paramiko-1.10.1-py2.7.egg'
,
'/usr/local/lib/python2.7/site-packages/gevent-1.0.2-py2.7-macosx-10.10-x86_64.egg'
,
'/usr/local/lib/python2.7/site-packages/greenlet-0.4.7-py2.7-macosx-10.10-x86_64.egg'
,
'/Users/wupeiqi/PycharmProjects/calculator'
,
'/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python27.zip'
,
'/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7'
,
'/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin'
,
'/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac'
,
'/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages'
,
'/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk'
,
'/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old'
,
'/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload'
,
'/usr/local/lib/python2.7/site-packages'
,
'/Library/Python/2.7/site-packages'
]
|
若是sys.path路徑列表沒有你想要的路徑,能夠經過 sys.path.append('路徑') 添加。
1
2
3
4
|
import
sys
import
os
project_path
=
os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(project_path)
|
內置模塊是Python自帶的功能,在使用內置模塊相應的功能時,須要【先導入】再【使用】
用於提供對Python解釋器相關的操做:
1 sys.argv 命令行參數List,第一個元素是程序自己路徑 2 sys.exit(n) 退出程序,正常退出時exit(0) 3 sys.version 獲取Python解釋程序的版本信息 4 sys.maxint 最大的Int值 5 sys.path 返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值 6 sys.platform 返回操做系統平臺名稱 7 sys.stdin 輸入相關 8 sys.stdout 輸出相關 9 sys.stderror 錯誤相關
用於提供系統級別的操做:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
os.getcwd() 獲取當前工做目錄,即當前python腳本工做的目錄路徑
os.chdir(
"dirname"
) 改變當前腳本工做目錄;至關於shell下cd
os.curdir 返回當前目錄: (
'.'
)
os.pardir 獲取當前目錄的父目錄字符串名:(
'..'
)
os.makedirs(
'dir1/dir2'
) 可生成多層遞歸目錄
os.removedirs(
'dirname1'
) 若目錄爲空,則刪除,並遞歸到上一級目錄,如若也爲空,則刪除,依此類推
os.mkdir(
'dirname'
) 生成單級目錄;至關於shell中mkdir dirname
os.rmdir(
'dirname'
) 刪除單級空目錄,若目錄不爲空則沒法刪除,報錯;至關於shell中rmdir dirname
os.listdir(
'dirname'
) 列出指定目錄下的全部文件和子目錄,包括隱藏文件,並以列表方式打印
os.remove() 刪除一個文件
os.rename(
"oldname"
,
"new"
) 重命名文件
/
目錄
os.stat(
'path/filename'
) 獲取文件
/
目錄信息
os.sep 操做系統特定的路徑分隔符,win下爲
"\\",Linux下爲"
/
"
os.linesep 當前平臺使用的行終止符,win下爲
"\t\n"
,Linux下爲
"\n"
os.pathsep 用於分割文件路徑的字符串
os.name 字符串指示當前使用平臺。win
-
>
'nt'
; Linux
-
>
'posix'
os.system(
"bash command"
) 運行shell命令,直接顯示
os.environ 獲取系統環境變量
os.path.abspath(path) 返回path規範化的絕對路徑
os.path.split(path) 將path分割成目錄和文件名二元組返回
os.path.dirname(path) 返回path的目錄。其實就是os.path.split(path)的第一個元素
os.path.basename(path) 返回path最後的文件名。如何path以/或\結尾,那麼就會返回空值。即os.path.split(path)的第二個元素
os.path.exists(path) 若是path存在,返回
True
;若是path不存在,返回
False
os.path.isabs(path) 若是path是絕對路徑,返回
True
os.path.isfile(path) 若是path是一個存在的文件,返回
True
。不然返回
False
os.path.isdir(path) 若是path是一個存在的目錄,則返回
True
。不然返回
False
os.path.join(path1[, path2[, ...]]) 將多個路徑組合後返回,第一個絕對路徑以前的參數將被忽略
os.path.getatime(path) 返回path所指向的文件或者目錄的最後存取時間
os.path.getmtime(path) 返回path所指向的文件或者目錄的最後修改時間
|
用於加密相關的操做,代替了md5模塊和sha模塊,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
import
hashlib
# ######## md5 ########
hash
=
hashlib.md5()
# help(hash.update)
hash
.update(bytes(
'admin'
, encoding
=
'utf-8'
))
print
(
hash
.hexdigest())
print
(
hash
.digest())
######## sha1 ########
hash
=
hashlib.sha1()
hash
.update(bytes(
'admin'
, encoding
=
'utf-8'
))
print
(
hash
.hexdigest())
# ######## sha256 ########
hash
=
hashlib.sha256()
hash
.update(bytes(
'admin'
, encoding
=
'utf-8'
))
print
(
hash
.hexdigest())
# ######## sha384 ########
hash
=
hashlib.sha384()
hash
.update(bytes(
'admin'
, encoding
=
'utf-8'
))
print
(
hash
.hexdigest())
# ######## sha512 ########
hash
=
hashlib.sha512()
hash
.update(bytes(
'admin'
, encoding
=
'utf-8'
))
print
(
hash
.hexdigest())
|
以上加密算法雖然依然很是厲害,但時候存在缺陷,即:經過撞庫能夠反解。因此,有必要對加密算法中添加自定義key再來作加密。
1
2
3
4
5
6
7
|
import
hashlib
# ######## md5 ########
hash
=
hashlib.md5(bytes(
'898oaFs09f'
,encoding
=
"utf-8"
))
hash
.update(bytes(
'admin'
,encoding
=
"utf-8"
))
print
(
hash
.hexdigest())
|
python內置還有一個 hmac 模塊,它內部對咱們建立 key 和 內容 進行進一步的處理而後再加密
1
2
3
4
5
|
import
hmac
h
=
hmac.new(bytes(
'898oaFs09f'
,encoding
=
"utf-8"
))
h.update(bytes(
'admin'
,encoding
=
"utf-8"
))
print
(h.hexdigest())
|
import random print(random.random()) print(random.randint(1, 2)) print(random.randrange(1, 10))
1 import random 2 checkcode = '' 3 for i in range(4): 4 current = random.randrange(0,4) 5 if current != i: 6 temp = chr(random.randint(65,90)) 7 else: 8 temp = random.randint(0,9) 9 checkcode += str(temp) 10 print checkcode
python中re模塊提供了正則表達式相關操做
字符:
. 匹配除換行符之外的任意字符
\w 匹配字母或數字或下劃線或漢字
\s 匹配任意的空白符
\d 匹配數字
\b 匹配單詞的開始或結束
^ 匹配字符串的開始
$ 匹配字符串的結束
次數:
* 重複零次或更屢次
+ 重複一次或更屢次
? 重複零次或一次
{n} 重複n次
{n,} 重複n次或更屢次
{n,m} 重複n到m次
match
1 # match,從起始位置開始匹配,匹配成功返回一個對象,未匹配成功返回None 2 3 4 match(pattern, string, flags=0) 5 # pattern: 正則模型 6 # string : 要匹配的字符串 7 # falgs : 匹配模式 8 X VERBOSE Ignore whitespace and comments for nicer looking RE's. 9 I IGNORECASE Perform case-insensitive matching. 10 M MULTILINE "^" matches the beginning of lines (after a newline) 11 as well as the string. 12 "$" matches the end of lines (before a newline) as well 13 as the end of the string. 14 S DOTALL "." matches any character at all, including the newline. 15 16 A ASCII For string patterns, make \w, \W, \b, \B, \d, \D 17 match the corresponding ASCII character categories 18 (rather than the whole Unicode categories, which is the 19 default). 20 For bytes patterns, this flag is the only available 21 behaviour and needn't be specified. 22 23 L LOCALE Make \w, \W, \b, \B, dependent on the current locale. 24 U UNICODE For compatibility only. Ignored for string patterns (it 25 is the default), and forbidden for bytes patterns.
1 # 無分組 2 r = re.match("h\w+", origin) 3 print(r.group()) # 獲取匹配到的全部結果 4 print(r.groups()) # 獲取模型中匹配到的分組結果 5 print(r.groupdict()) # 獲取模型中匹配到的分組結果 6 7 # 有分組 8 9 # 爲什麼要有分組?提取匹配成功的指定內容(先匹配成功所有正則,再匹配成功的局部內容提取出來) 10 11 r = re.match("h(\w+).*(?P<name>\d)$", origin) 12 print(r.group()) # 獲取匹配到的全部結果 13 print(r.groups()) # 獲取模型中匹配到的分組結果 14 print(r.groupdict()) # 獲取模型中匹配到的分組中全部執行了key的組
search
# search,瀏覽整個字符串去匹配第一個,未匹配成功返回None # search(pattern, string, flags=0)
1 # 無分組 2 3 r = re.search("a\w+", origin) 4 print(r.group()) # 獲取匹配到的全部結果 5 print(r.groups()) # 獲取模型中匹配到的分組結果 6 print(r.groupdict()) # 獲取模型中匹配到的分組結果 7 8 # 有分組 9 10 r = re.search("a(\w+).*(?P<name>\d)$", origin) 11 print(r.group()) # 獲取匹配到的全部結果 12 print(r.groups()) # 獲取模型中匹配到的分組結果 13 print(r.groupdict()) # 獲取模型中匹配到的分組中全部執行了key的組
findall
# findall,獲取非重複的匹配列表;若是有一個組則以列表形式返回,且每個匹配均是字符串;若是模型中有多個組,則以列表形式返回,且每個匹配均是元祖; # 空的匹配也會包含在結果中 #findall(pattern, string, flags=0)
1 # 無分組 2 r = re.findall("a\w+",origin) 3 print(r) 4 5 # 有分組 6 origin = "hello alex bcd abcd lge acd 19" 7 r = re.findall("a((\w*)c)(d)", origin) 8 print(r)
sub
1 # sub,替換匹配成功的指定位置字符串 2 3 sub(pattern, repl, string, count=0, flags=0) 4 # pattern: 正則模型 5 # repl : 要替換的字符串或可執行對象 6 # string : 要匹配的字符串 7 # count : 指定匹配個數 8 # flags : 匹配模式
split
1 # split,根據正則匹配分割字符串 2 3 split(pattern, string, maxsplit=0, flags=0) 4 # pattern: 正則模型 5 # string : 要匹配的字符串 6 # maxsplit:指定分割個數 7 # flags : 匹配模式
1 IP: 2 ^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$ 3 手機號: 4 ^1[3|4|5|8][0-9]\d{8}$ 5 郵箱: 6 [a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+ 7 8 經常使用正則表達式