跟著老男孩教育學Python開發【第五篇】:模塊

来源:http://www.cnblogs.com/yinshoucheng-golden/archive/2016/12/29/6233496.html
-Advertisement-
Play Games

遞歸的案例:階乘 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…

  1. def func(num):
  2.     if num == 1:
  3.         return 1
  4.     return num * func(num - 1)
  5.  
  6. ret = func(7)
  7. print(ret)

反射

  1. def f1():
  2.    print('f1')

f1:函數名

'f1':字元串

commons:

  1. def login():
  2.     print('登錄頁面')
  3.  
  4. def logout():
  5.     print('退出頁面')
  6.  
  7. def home():
  8.     print('主頁面')

index:

  1. import commons
  2.  
  3. def run():
  4.     inp = input('請輸入要訪問的url:')
  5.     if inp == 'login':
  6.         commons.login()
  7.     elif inp == 'logout':
  8.         commons.logout()
  9.     elif inp == 'home':
  10.         commons.home()
  11.     else:
  12.         print('404')
  13.  
  14. if __name__ == '__main__':
  15.     run()

用反射進行優化,利用字元串的形式去對象(模塊)中操作(尋找)成員。

index:

  1. import commons
  2.  
  3. def run():
  4.     inp = input('請輸入要訪問的url:')
  5.     #反射:利用字元串的形式去對象(模塊)中操作(尋找/檢查/刪除/設置)成員
  6.     #hasattr查看inp是否存在(返回True or False)
  7.     if hasattr(commons,inp):
  8.         func = getattr(commons,inp)
  9.         func()
  10.     else:
  11.         print('404')
  12. if __name__ == '__main__':
  13.     run()

hasattr():尋找

getattr():檢查

delattr():刪除

setattr():設置

進一步優化,字元串導入。

index:

  1. def run():
  2.     inp = input('請輸入要訪問的url:')
  3.     m,f = inp.split('/')
  4.     obj = __import__(m)
  5.     if hasattr(obj,f):
  6.         func = getattr(obj,f)
  7.         func()
  8.     else:
  9.         print('404')
  10.  
  11. if __name__ == '__main__':
  12.     run()

補充,當需要導入文件夾下麵的:

  1. obj = __import__('lib.account')
  2. print(obj)
  3. 輸出:<module 'lib' from 'D:\\work_software\\PycharmProjects\\oldboy_python\\day6\\lib\\__init__.py'>
  4. obj = __import__('lib.account',fromlist=True)
  5. print(obj)
  6. 輸出:<module 'lib.account' from 'D:\\work_software\\PycharmProjects\\oldboy_python\\day6\\lib\\account.py'>

web框架的路由系統。

特殊變數__file__

  1. import os
  2.  
  3. print(__file__)
  4.  
  5. #abspath()獲取絕對路徑
  6. print(os.path.abspath(__file__))
  7.  
  8. #獲取上級目錄dirname()
  9. ret = os.path.dirname(os.path.abspath(__file__))
  10. ret_1 = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  11. print(ret)
  12. print(ret_1)
  13. 輸出:
  14. D:/work_software/PycharmProjects/oldboy_python/day6/bin/admin.py
  15. D:\work_software\PycharmProjects\oldboy_python\day6\bin\admin.py
  16. D:\work_software\PycharmProjects\oldboy_python\day6\bin
  17. D:\work_software\PycharmProjects\oldboy_python\day6

特殊變數__name__

  1. #只有執行當前文件的時候,當前文件的特殊變數__name__ == '__main__'
  2.  
  3. def run():
  4.     print('rum')
  5.  
  6. if __name__ == "__main__":
  7.     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:錯誤相關

進度百分比:

  1. import time
  2. import sys
  3.  
  4. def view_bar(num,total):
  5.     rate = float(num)/float(total)
  6.     rate_num = int(rate * 100)
  7.  
  8.     #數字進度顯示
  9.     #\r回到當前行的首位置
  10.     r = '\r%d%%'%(rate_num)
  11.     #輸出不換行
  12.     sys.stdout.write(r)
  13.  
  14.     #進度條顯示
  15.     """
  16.     r1 = '\r%s>%d%%'%("="*num,rate_num)
  17.     sys.stdout.write(r1)
  18.     """
  19.  
  20.     sys.stdout.flush()
  21.  
  22. if __name__ == '__main__':
  23.     for i in range(0,101):
  24.         time.sleep(0.1)
  25.         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加密:

  1. import hashlib
  2.  
  3. #添加自定義key再來做加密
  4. obj = hashlib.md5(bytes('shisjajlj131424rdt5t6577ueuewmz',encoding='utf-8'))
  5. obj.update(bytes('123',encoding='utf-8'))
  6. result = obj.hexdigest()
  7. print(result)

正則表達式

字元匹配:普通字元、元字元。

普通字元匹配

  1. import re
  2.  
  3. ret = re.findall('alex','adasjkalex78272hshdsjhds')
  4. print(ret)
  5. 輸出:['alex']

元字元匹配

.:除換行符以外的任何一個字元

  1. import re
  2.  
  3. ret = re.findall('al.x','uiiu9alaxuialbx798alcx21oalaaxiwq2al\nxjk')
  4. print(ret)
  5. 輸出:['alax', 'albx', 'alcx']

^:以什麼開頭

  1. import re
  2.  
  3. ret = re.findall('^al.x','al@xjkasjalexk')
  4. print(ret)
  5. 輸出:['al@x']

$:以什麼結尾

  1. import re
  2.  
  3. ret = re.findall('al.x$','al@xhhalexuieuial#x')
  4. print(ret)
  5. 輸出:['al#x']

*:重覆*前面的字元0次到n次

  1. import re
  2.  
  3. ret = re.findall('al.*x','yiuial3278hcxuxewualeexo')
  4. print(ret)
  5. 輸出:['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的交界。

  1. import re
  2.  
  3. ret = re.findall(r'I\b','I am aaIbbb')
  4. print(ret)
  5. 輸出:['I']

零寬界定符(zero-width assertions)只用以匹配字元串的頭部和尾部。尾部用空白符或非字母數字元來標識。

():指定匹配的組。

函數

match

re.match(pattern,string,flags=0),match只匹配起始位置。

flags編譯標誌位,用於修改正則表達式的匹配方式,如是否區分大小寫,多行匹配等。

  1. import re
  2.  
  3. ret = re.match('com','comwww.runcomoob')
  4. print(ret)
  5.  
  6. ret = re.match('com','comwww.runcomoob').group()
  7. print(ret)
  8.  
  9. ret = re.match('com','comwww.runcomoob').span()
  10. print(ret)
  11.  
  12. 輸出:
  13. <_sre.SRE_Match object; span=(0, 3), match='com'>
  14. com
  15. (0, 3)

search

一旦匹配成功,就是一個match object對象。

  1. import re
  2.  
  3. ret = re.search('\dcom','www.4comrunco.5com')
  4. print(ret)
  5.  
  6. 輸出:<_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)

  1. import re
  2.  
  3. ret = re.sub("g.t","have",'I get A,I got B,I gut C')
  4. print(ret)
  5. 輸出:I have A,I have B,I have C

設置最大替換次數

  1. import re
  2.  
  3. ret = re.sub("g.t","have",'I get A,I got B,I gut C',2)
  4. print(ret)
  5. 輸出:I have A,I have B,I gut C

subn

  1. import re
  2.  
  3. ret = re.subn("g.t","have",'I get A,I got B,I gut C')
  4. print(ret)
  5. 輸出:('I have A,I have B,I have C', 3)

split

  1. import re
  2.  
  3. ret = re.split('\d+','0one1two2three3four4')
  4. print(ret)
  5. 輸出:['', 'one', 'two', 'three', 'four', '']

compile

re.compile(strPattern[,flag])

這個方法是Pattern類的工廠方法,用於將字元串形式的正則表達式編譯為Pattern對象。第二個參數flag是匹配模式,取值可以使用按位或運算符'|',表示同時生效,例如re.I|re.M,可以把經常使用的正則表達式編譯成正則表達式對象,這樣可以提高一定的效率。

  1. import re
  2.  
  3. text = "JGood is a handsome boy,he is cool,clever,and so on..."
  4. regex = re.compile(r'\w*oo\w*')
  5. ret = regex.findall(text)
  6. print(ret)
  7. 輸出:['JGood', 'cool']

re.I:使匹配對大小寫不敏感。

re.L:做本地化識別(locale-aware)匹配。

re.M:多行匹配,影響^和$。

re.S:使"."匹配包括換行在內的所有字元。

re.U:根據Unicode字元集解析字元。這個標識影響\w,\W,\b,\B。

正則分組

在已經匹配到的數據中再提取數據。

match的分組匹配

  1. import re
  2.  
  3. origin = "has dhjdahk29832"
  4. r = re.match("h\w+",origin)
  5. #獲取匹配到的所有結果
  6. print(r.group())
  7. #獲取模型中匹配到的分組結果
  8. print(r.groups())
  9. #獲取模型中匹配到的分組結果
  10. print(r.groupdict())
  11. 輸出:
  12. has
  13. ()
  14. {}
  15.  
  16. import re
  17.  
  18. origin = "has dhjdahk29832"
  19. r = re.match("h(\w+)",origin)
  20. #獲取匹配到的所有結果
  21. print(r.group())
  22. #獲取模型中匹配到的分組結果
  23. print(r.groups())
  24. #獲取模型中匹配到的分組結果
  25. print(r.groupdict())
  26. 輸出:
  27. has
  28. ('as',)
  29. {}
  30.  
  31. import re
  32.  
  33. origin = "has dhjdahk29832"
  34. r = re.match("h(?P<name>\w+)",origin)
  35. #獲取匹配到的所有結果
  36. print(r.group())
  37. #獲取模型中匹配到的分組結果
  38. print(r.groups())
  39. #獲取模型中匹配到的分組結果
  40. print(r.groupdict())
  41. 輸出:
  42. has
  43. ('as',)
  44. {'name': 'as'}

findall的分組匹配

  1. import re
  2.  
  3. origin = "has sajkd hjda hk2983ds wqw2"
  4. r = re.findall("h(\w+)",origin)
  5. print(r)
  6. 輸出:['as', 'jda', 'k2983ds']
  7.  
  8. import re
  9.  
  10. origin = "hasaabc sajkd hjdaabc hk2983dsaabc wqw2"
  11. r = re.findall("h(\w+)a(ab)c",origin)
  12. print(r)
  13. 輸出:[('as', 'ab'), ('jd', 'ab'), ('k2983ds', 'ab')]

 

split的分組匹配

  1. import re
  2.  
  3. origin = "hello alex bcd alex lgc alex acd 19"
  4. r = re.split("alex",origin,1)
  5. print(r)
  6. 輸出:['hello ', ' bcd alex lgc alex acd 19']
  7.  
  8. import re
  9.  
  10. origin = "hello alex bcd alex lgc alex acd 19"
  11. #匹配值中()的內容需要輸出
  12. r = re.split("(alex)",origin,1)
  13. print(r)
  14. 輸出:['hello ', 'alex', ' bcd alex lgc alex acd 19']
  15.  
  16. import re
  17.  
  18. origin = "hello alex bcd alex lgc alex acd 19"
  19. r = re.split("a(le)x",origin,1)
  20. print(r)
  21. 輸出:['hello ', 'le', ' bcd alex lgc alex acd 19']
  22.  
  23. import re
  24.  
  25. origin = "hello alex bcd alex lgc alex acd 19"
  26. r = re.split("(a(le)x)",origin,1)
  27. print(r)
  28. 輸出:['hello ', 'alex', 'le', ' bcd alex lgc alex acd 19']
  29.  
  30. import re
  31.  
  32. origin = "hello alex bcd alex lgc alex acd 19"
  33. r = re.split("(a(l(e))x)",origin,1)
  34. print(r)
  35. 輸出:['hello ', 'alex', 'le', 'e', ' bcd alex lgc alex acd 19']

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、流和FILE對象 系統IO都是針對文件描述符,當打開一個文件時,即返回一個文件描述符,然後用該文件描述符來進行下麵的操作,而對於標準IO庫,它們的操作則是圍繞流(stream)進行的。 當打開一個流時,標準IO函數fopen返回一個指向FILE對象的指針。該對象通常是一個結構,它包含了IO庫為管 ...
  • 在控制器中加入如下代碼: 這樣註解之後,前端傳過來的String類型的數據就可以在控制器方法參數中自動轉化為Date類型數據: 原文鏈接:http://blog.csdn.net/javaloveiphone/article/details/53745068 ...
  • 設計一個class,應該考慮以下問題: 新type的對象應該怎樣創建和銷毀? 構造函數 析構函數 記憶體分配 記憶體釋放 對象的初始化和對象的賦值應該有什麼樣的差別? 拷貝構造函數 賦值運算符 新對象如果被用值傳遞,這意味著什麼呢? 拷貝構造函數 新對象的合法持有哪些? Setter 錯誤檢查 對象是否... ...
  • Java註解其實是代碼里的特殊標記,使用其他工具可以對其進行處理。註解是一種元數據,起到了描述、配置的作用,生成文檔,所有的註解都隱式地擴展自java.lang.annotation.Annotation。註解可能使用註解來自動生成附屬文件,如部署描述符和Bean信息類,還可以用於自動生成測試、日誌... ...
  • 抽象 一、抽象類:不知道是具體什麼東西的類。 abstract class 類名 1.抽象類不能直接new出來。 2.抽象類可以沒有抽象方法。 3.抽象類中,可以有抽象方法,也可以有非抽象方法。抽象類中還可以有成員變數。 4.派生類中,可以不實現某些抽象方法,但派生類必須要聲明為抽象類。 二、抽象方 ...
  • 我是一個C++初學者,控制台實現了一個貪吃蛇游戲。下麵粘貼代碼。 代碼如下: C++ //"貪吃蛇游戲"V1.0 //李國良於2016年12月29日編寫完成 include include include include include using namespace std; int food[2 ...
  • 策略模式:定義一系列的演算法,把每一個演算法封裝起來, 並且使它們可相互替換。本模式使得演算法可獨立於使用它的客戶而變化。策略模式把對象本身和運算規則區分開來,其功能非常強大,因為這個設計模式本身的核心思想就是面向對象編程的多形性的思想。 也就是我們打算出行旅游,我們可以有幾個策略可以考慮,可以騎自行車, ...
  • 在使用phalcon的insert和update功能時,因為資料庫所有的欄位設置的都是NOT NULL,而phalcon的model在插入或更新之前會自動判斷欄位是否需要必填,因此導致有空欄位時無法存入。 開始遇到這問題時,想到兩種解決方法: 一、改資料庫欄位,把NOT NULL改為可以為空。 但該 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...