模塊(一)

模塊,用一堆代碼實現了某個功能的代碼集合。 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文件

  • 導入一個py文件,解釋器解釋該py文件
  • 導入一個包,解釋器解釋該包下的 __init__.py 文件 【py2.7】

那麼問題來了,導入模塊時是根據那個路徑做爲基準來進行的呢?即: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自帶的功能,在使用內置模塊相應的功能時,須要【先導入】再【使用】

1、sys

用於提供對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       錯誤相關

2、os

用於提供系統級別的操做:

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所指向的文件或者目錄的最後修改時間

3、hashlib

用於加密相關的操做,代替了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())

4、random

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

5、re

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 經常使用正則表達式
相關文章
相關標籤/搜索