遞歸 反射 os模塊 sys模塊 hashlib加密模塊 正則表達式 反射 python中的反射功能是由以下四個內置函數提供:hasattr、getattr、setattr、delattr,改四個函數分別用於對對象內部執行:檢查是否含有某成員、獲取成員、設置成員、刪除成員。 os模塊 sys模塊 h ...
- 遞歸
- 反射
- os模塊
- sys模塊
- hashlib加密模塊
- 正則表達式
反射
python中的反射功能是由以下四個內置函數提供:hasattr、getattr、setattr、delattr,改四個函數分別用於對對象內部執行:檢查是否含有某成員、獲取成員、設置成員、刪除成員。
class Foo(object): def __init__(self): self.name = 'wupeiqi' def func(self): return 'func' obj = Foo() # #### 檢查是否含有成員 #### hasattr(obj, 'name') hasattr(obj, 'func') # #### 獲取成員 #### getattr(obj, 'name') getattr(obj, 'func') # #### 設置成員 #### setattr(obj, 'age', 18) setattr(obj, 'show', lambda num: num + 1) # #### 刪除成員 #### delattr(obj, 'name') delattr(obj, 'func')
os模塊
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所指向的文件或者目錄的最後修改時間
sys模塊
sys.argv # 命令行參數List,第一個元素是程式本身路徑 sys.exit(n) # 退出程式,正常退出時exit(0) sys.version # 獲取Python程式的版本信息 sys.maxint # 最大的Int值 sys.path # 返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變數的值 sys.platform # 返回操作系統平臺的名稱 sys.stdin # 輸入相關 sys.stdout # 輸出相關 sys.stderror # 錯誤相關
hashlib加密模塊
用於加密相關的操作,代替了md5模塊和sha模塊,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 演算法
import hashlib # ######## md5 ######## hash = hashlib.md5() hash.update('admin') print hash.hexdigest() # ######## sha1 ######## hash = hashlib.sha1() hash.update('admin') print hash.hexdigest() # ######## sha256 ######## hash = hashlib.sha256() hash.update('admin') print hash.hexdigest() # ######## sha384 ######## hash = hashlib.sha384() hash.update('admin') print hash.hexdigest() # ######## sha512 ######## hash = hashlib.sha512() hash.update('admin') print hash.hexdigest()
以上加密演算法雖然依然非常厲害,但時候存在缺陷,即:通過撞庫可以反解。所以,有必要對加密演算法中添加自定義key再來做加密。
import hashlib # ######## md5 ######## hash = hashlib.md5('898oaFs09f') hash.update('admin') print hash.hexdigest()
還不夠弔?python 還有一個 hmac 模塊,它內部對我們創建 key 和 內容 再進行處理然後再加密
import hmac h = hmac.new('wueiqi') h.update('hellowo') print h.hexdigest()
不能再牛逼了!!!
import hashlib obj = hashlib.md5() obj.update(bytes('admin', encoding='utf-8')) result = obj.hexdigest() print(result) # 加key密鑰 obj = hashlib.md5(bytes('xxxxxxxx', encoding='utf-8')) obj.update(bytes('admin', encoding='utf-8')) result = obj.hexdigest() print(result)
正則表達式
re模塊用於對python的正則表達式的操作。
字元:
. 匹配除換行符以外的任意字元
\w 匹配字母或數字或下劃線或漢字
\s 匹配任意的空白符
\d 匹配數字
\b 匹配單詞的開始或結束
^ 匹配字元串的開始
$ 匹配字元串的結束
次數:
* 重覆零次或更多次
+ 重覆一次或更多次
? 重覆零次或一次
{n} 重覆n次
{n,} 重覆n次或更多次
{n,m} 重覆n到m次
IP: ^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$ 手機號: ^1[3|4|5|8][0-9]\d{8}$
1、match(pattern, string, flags=0)
從起始位置開始根據模型去字元串中匹配指定內容,匹配單個
- 正則表達式
- 要匹配的字元串
- 標誌位,用於控制正則表達式的匹配方式
import re obj = re.match('\d+', '123uuasf') if obj: print obj.group()
2、search(pattern, string, flags=0)
根據模型去字元串中匹配指定內容,匹配單個
import re obj = re.search('\d+', 'u123uu888asf') if obj: print obj.group()
3、group和groups
a = "123abc456" print re.search("([0-9]*)([a-z]*)([0-9]*)", a).group() print re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(0) print re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(1) print re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(2) print re.search("([0-9]*)([a-z]*)([0-9]*)", a).groups()
4、findall(pattern, string, flags=0)
上述兩中方式均用於匹配單值,即:只能匹配字元串中的一個,如果想要匹配到字元串中所有符合條件的元素,則需要使用 findall。
import re obj = re.findall('\d+', 'fa123uu888asf') print obj
5、sub(pattern, repl, string, count=0, flags=0)
用於替換匹配的字元串
content = "123abc456" new_content = re.sub('\d+', 'sb', content) # new_content = re.sub('\d+', 'sb', content, 1) print new_content
相比於str.replace功能更加強大
6、split(pattern, string, maxsplit=0, flags=0)
根據指定匹配進行分組
content = "'1 - 2 * ((60-30+1*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2) )'" new_content = re.split('\*', content) # new_content = re.split('\*', content, 1) print new_content
content = "'1 - 2 * ((60-30+1*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2) )'" new_content = re.split('[\+\-\*\/]+', content) # new_content = re.split('\*', content, 1) print new_content
inpp = '1-2*((60-30 +(-40-5)*(9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2))' inpp = re.sub('\s*','',inpp) new_content = re.split('\(([\+\-\*\/]?\d+[\+\-\*\/]?\d+){1}\)', inpp, 1) print new_content
相比於str.split更加強大