遞歸的案例:階乘 1*2*3*4*5*6*7… def func(num): if num == 1: return 1 return num * func(num - 1) ret = func(7) print(ret) 反射 def f1(): print('f1') f1:函數名 'f1':... ...
遞歸的案例:階乘
1*2*3*4*5*6*7…
- def func(num):
- if num == 1:
- return 1
- return num * func(num - 1)
- ret = func(7)
- print(ret)
反射
- def f1():
- print('f1')
f1:函數名
'f1':字元串
commons:
- def login():
- print('登錄頁面')
- def logout():
- print('退出頁面')
- def home():
- print('主頁面')
index:
- import commons
- def run():
- inp = input('請輸入要訪問的url:')
- if inp == 'login':
- commons.login()
- elif inp == 'logout':
- commons.logout()
- elif inp == 'home':
- commons.home()
- else:
- print('404')
- if __name__ == '__main__':
- run()
用反射進行優化,利用字元串的形式去對象(模塊)中操作(尋找)成員。
index:
- import commons
- def run():
- inp = input('請輸入要訪問的url:')
- #反射:利用字元串的形式去對象(模塊)中操作(尋找/檢查/刪除/設置)成員
- #hasattr查看inp是否存在(返回True or False)
- if hasattr(commons,inp):
- func = getattr(commons,inp)
- func()
- else:
- print('404')
- if __name__ == '__main__':
- run()
hasattr():尋找
getattr():檢查
delattr():刪除
setattr():設置
進一步優化,字元串導入。
index:
- def run():
- inp = input('請輸入要訪問的url:')
- m,f = inp.split('/')
- obj = __import__(m)
- if hasattr(obj,f):
- func = getattr(obj,f)
- func()
- else:
- print('404')
- if __name__ == '__main__':
- run()
補充,當需要導入文件夾下麵的:
- obj = __import__('lib.account')
- print(obj)
- 輸出:<module 'lib' from 'D:\\work_software\\PycharmProjects\\oldboy_python\\day6\\lib\\__init__.py'>
- obj = __import__('lib.account',fromlist=True)
- print(obj)
- 輸出:<module 'lib.account' from 'D:\\work_software\\PycharmProjects\\oldboy_python\\day6\\lib\\account.py'>
web框架的路由系統。
特殊變數__file__
- import os
- print(__file__)
- #abspath()獲取絕對路徑
- print(os.path.abspath(__file__))
- #獲取上級目錄dirname()
- ret = os.path.dirname(os.path.abspath(__file__))
- ret_1 = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
- print(ret)
- print(ret_1)
- 輸出:
- D:/work_software/PycharmProjects/oldboy_python/day6/bin/admin.py
- D:\work_software\PycharmProjects\oldboy_python\day6\bin\admin.py
- D:\work_software\PycharmProjects\oldboy_python\day6\bin
- D:\work_software\PycharmProjects\oldboy_python\day6
特殊變數__name__
- #只有執行當前文件的時候,當前文件的特殊變數__name__ == '__main__'
- def run():
- print('rum')
- if __name__ == "__main__":
- run()
sys模塊
用於提供python解釋器相關的操作。
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:錯誤相關
進度百分比:
- import time
- import sys
- def view_bar(num,total):
- rate = float(num)/float(total)
- rate_num = int(rate * 100)
- #數字進度顯示
- #\r回到當前行的首位置
- r = '\r%d%%'%(rate_num)
- #輸出不換行
- sys.stdout.write(r)
- #進度條顯示
- """
- r1 = '\r%s>%d%%'%("="*num,rate_num)
- sys.stdout.write(r1)
- """
- sys.stdout.flush()
- if __name__ == '__main__':
- for i in range(0,101):
- time.sleep(0.1)
- view_bar(i,100)
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","newname"):重命名文件/目錄
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所指向的文件或者目錄的最後修改時間。
hashlib
用於加密相關的操作,代替了md5模塊和sha模塊,主要提供SHA1,SHA224,SHA256,SHA512,MD5演算法。
MD5加密:
- import hashlib
- #添加自定義key再來做加密
- obj = hashlib.md5(bytes('shisjajlj131424rdt5t6577ueuewmz',encoding='utf-8'))
- obj.update(bytes('123',encoding='utf-8'))
- result = obj.hexdigest()
- print(result)
正則表達式
字元匹配:普通字元、元字元。
普通字元匹配
- import re
- ret = re.findall('alex','adasjkalex78272hshdsjhds')
- print(ret)
- 輸出:['alex']
元字元匹配
.:除換行符以外的任何一個字元
- import re
- ret = re.findall('al.x','uiiu9alaxuialbx798alcx21oalaaxiwq2al\nxjk')
- print(ret)
- 輸出:['alax', 'albx', 'alcx']
^:以什麼開頭
- import re
- ret = re.findall('^al.x','al@xjkasjalexk')
- print(ret)
- 輸出:['al@x']
$:以什麼結尾
- import re
- ret = re.findall('al.x$','al@xhhalexuieuial#x')
- print(ret)
- 輸出:['al#x']
*:重覆*前面的字元0次到n次
- import re
- ret = re.findall('al.*x','yiuial3278hcxuxewualeexo')
- print(ret)
- 輸出:['al3278hcxuxewualeex']
+:重覆+前面一個字元的1次到n次
?:重覆?前面一個字元的0次或1次
{}:指定重覆的次數,{1,5}重覆1次到5次,{5}重覆5次,{,5}重覆0次到5次,{5,}重覆5次到n次。
[]:或,[a-z]匹配a到z的任何一個,[ab]匹配a或b。
[]裡面的特殊含義
-:表示範圍,例如[0-9]表示0到9。
^:表示非、排除,例如[^d]表示排除d;
\:反斜杠後邊跟元字元去除特殊功能;反斜杠後邊跟普通字元實現特殊功能;引用序號對應的字組所匹配的字元串,例如re.search(r"(alex)(eric)com\2","alexericcomeric")。
\d:匹配任何十進位數,相當於[0-9]。
\D:匹配任何非數字字元,相當於[^0-9]。
\s:匹配任何空白字元,相當於[ \t\n\r\f\v]。
\S:匹配任何非空白字元,相當於[^ \t\n\r\f\v]。
\w:匹配任何字母數字字元,相當於[a-zA-Z0-9_]。
\W:匹配任何非字母數字字元,相當於[^a-zA-Z0-9_]。
\b:匹配一個字元串的邊界,也就是指單詞和空格間的位置。字元串是指連續的字母、數字和下劃線組成的。註意,\b的定義是\w和\W的交界。
- import re
- ret = re.findall(r'I\b','I am aaIbbb')
- print(ret)
- 輸出:['I']
零寬界定符(zero-width assertions)只用以匹配字元串的頭部和尾部。尾部用空白符或非字母數字元來標識。
():指定匹配的組。
函數
match
re.match(pattern,string,flags=0),match只匹配起始位置。
flags編譯標誌位,用於修改正則表達式的匹配方式,如是否區分大小寫,多行匹配等。
- import re
- ret = re.match('com','comwww.runcomoob')
- print(ret)
- ret = re.match('com','comwww.runcomoob').group()
- print(ret)
- ret = re.match('com','comwww.runcomoob').span()
- print(ret)
- 輸出:
- <_sre.SRE_Match object; span=(0, 3), match='com'>
- com
- (0, 3)
search
一旦匹配成功,就是一個match object對象。
- import re
- ret = re.search('\dcom','www.4comrunco.5com')
- print(ret)
- 輸出:<_sre.SRE_Match object; span=(4, 8), match='4com'>
match object對象擁有以下方法:
group()返回被RE匹配的字元串。
group()返回re整體匹配的字元串,可以一次輸入多個組號,對應組號匹配的字元串。
1、group()返回re整體匹配的字元串。
2、group(n,m)返回組號為n,m所匹配的字元串,如果組號不存在,則返回indexError異常。
3、groups()返回一個包含正則表達式中所有小組字元串的元組,從1到所含的小組號,通常groups()不需要參數,返回一個元組,元組中的元就是正則表達式中定義的組。
start()返回匹配開始的位置。
end()返回匹配結束的位置。
span()返回一個元組包含匹配(開始,結束)的位置。
findall
re.findall以列表形式返回所有匹配的字元串。
sub
匹配替換。
re.sub(pattern,repl,string,max=0)
- import re
- ret = re.sub("g.t","have",'I get A,I got B,I gut C')
- print(ret)
- 輸出:I have A,I have B,I have C
設置最大替換次數
- import re
- ret = re.sub("g.t","have",'I get A,I got B,I gut C',2)
- print(ret)
- 輸出:I have A,I have B,I gut C
subn
- import re
- ret = re.subn("g.t","have",'I get A,I got B,I gut C')
- print(ret)
- 輸出:('I have A,I have B,I have C', 3)
split
- import re
- ret = re.split('\d+','0one1two2three3four4')
- print(ret)
- 輸出:['', 'one', 'two', 'three', 'four', '']
compile
re.compile(strPattern[,flag])
這個方法是Pattern類的工廠方法,用於將字元串形式的正則表達式編譯為Pattern對象。第二個參數flag是匹配模式,取值可以使用按位或運算符'|',表示同時生效,例如re.I|re.M,可以把經常使用的正則表達式編譯成正則表達式對象,這樣可以提高一定的效率。
- import re
- text = "JGood is a handsome boy,he is cool,clever,and so on..."
- regex = re.compile(r'\w*oo\w*')
- ret = regex.findall(text)
- print(ret)
- 輸出:['JGood', 'cool']
re.I:使匹配對大小寫不敏感。
re.L:做本地化識別(locale-aware)匹配。
re.M:多行匹配,影響^和$。
re.S:使"."匹配包括換行在內的所有字元。
re.U:根據Unicode字元集解析字元。這個標識影響\w,\W,\b,\B。
正則分組
在已經匹配到的數據中再提取數據。
match的分組匹配
- import re
- origin = "has dhjdahk29832"
- r = re.match("h\w+",origin)
- #獲取匹配到的所有結果
- print(r.group())
- #獲取模型中匹配到的分組結果
- print(r.groups())
- #獲取模型中匹配到的分組結果
- print(r.groupdict())
- 輸出:
- has
- ()
- {}
- import re
- origin = "has dhjdahk29832"
- r = re.match("h(\w+)",origin)
- #獲取匹配到的所有結果
- print(r.group())
- #獲取模型中匹配到的分組結果
- print(r.groups())
- #獲取模型中匹配到的分組結果
- print(r.groupdict())
- 輸出:
- has
- ('as',)
- {}
- import re
- origin = "has dhjdahk29832"
- r = re.match("h(?P<name>\w+)",origin)
- #獲取匹配到的所有結果
- print(r.group())
- #獲取模型中匹配到的分組結果
- print(r.groups())
- #獲取模型中匹配到的分組結果
- print(r.groupdict())
- 輸出:
- has
- ('as',)
- {'name': 'as'}
findall的分組匹配
- import re
- origin = "has sajkd hjda hk2983ds wqw2"
- r = re.findall("h(\w+)",origin)
- print(r)
- 輸出:['as', 'jda', 'k2983ds']
- import re
- origin = "hasaabc sajkd hjdaabc hk2983dsaabc wqw2"
- r = re.findall("h(\w+)a(ab)c",origin)
- print(r)
- 輸出:[('as', 'ab'), ('jd', 'ab'), ('k2983ds', 'ab')]
split的分組匹配
- import re
- origin = "hello alex bcd alex lgc alex acd 19"
- r = re.split("alex",origin,1)
- print(r)
- 輸出:['hello ', ' bcd alex lgc alex acd 19']
- import re
- origin = "hello alex bcd alex lgc alex acd 19"
- #匹配值中()的內容需要輸出
- r = re.split("(alex)",origin,1)
- print(r)
- 輸出:['hello ', 'alex', ' bcd alex lgc alex acd 19']
- import re
- origin = "hello alex bcd alex lgc alex acd 19"
- r = re.split("a(le)x",origin,1)
- print(r)
- 輸出:['hello ', 'le', ' bcd alex lgc alex acd 19']
- import re
- origin = "hello alex bcd alex lgc alex acd 19"
- r = re.split("(a(le)x)",origin,1)
- print(r)
- 輸出:['hello ', 'alex', 'le', ' bcd alex lgc alex acd 19']
- import re
- origin = "hello alex bcd alex lgc alex acd 19"
- r = re.split("(a(l(e))x)",origin,1)
- print(r)
- 輸出:['hello ', 'alex', 'le', 'e', ' bcd alex lgc alex acd 19']