Python程序设计与科学计算精录总结Episode.3 Python高级语法:文件、异常、标准库和问题解决模式知识总结(基于Michael导师Python课程与VS2019)
今天是2020年5月20日,這個對于博主來說平凡的一天,但社交媒體上早就炸開鍋了。
博主認為,有些人受過傷之后,就愛的小心翼翼,遲遲不敢去再次追求自己的另一半,就這樣,漸漸的過了能夠大膽去愛的年紀,一直到了不敢去挑剔時候,才找到勉強能算得上是另一半的人。但可笑的是,真正的生活在一起之后才發現,其實愛與不愛,并沒有那么重要。
重要的是,責任。愛與責任使人變美,一個人也因有了愛與責任,其美無可替代。
所以,博主并不會喜歡妖媚的女孩,更不喜歡那些用情話騙取到的心靈。也可能很少主動去給女孩送口紅,送花,送奶茶。最多的可能隨筆寫一些相贈。在這個浮躁的社會,這樣做會很孤單,但是絕對沒有錯。更多時候,那些所謂的渣與膚淺的愛,只是因為讀的太少,想得太短罷了。
一、Python文件操作:
Python 提供了必要的函數和方法進行默認情況下的文件基本操作。你可以用?file?對象做大部分的文件操作。
1、open 函數:
你必須先用Python內置的open()函數打開一個文件,創建一個file對象,相關的方法才可以調用它進行讀寫。
語法:
file object = open(file_name [, access_mode][, buffering])各個參數的細節如下:
- file_name:file_name變量是一個包含了你要訪問的文件名稱的字符串值。
- access_mode:access_mode決定了打開文件的模式:只讀,寫入,追加等。所有可取值見如下的完全列表。這個參數是非強制的,默認文件訪問模式為只讀(r)。
- buffering:如果buffering的值被設為0,就不會有寄存。如果buffering的值取1,訪問文件時會寄存行。如果將buffering的值設為大于1的整數,表明了這就是的寄存區的緩沖大小。如果取負值,寄存區的緩沖大小則為系統默認。
下表中詳細總結了文件打開方式命令字符access_mode對應的意義:?
| t | 文本模式 (默認)。 |
| x | 寫模式,新建一個文件,如果該文件已存在則會報錯。 |
| b | 二進制模式。 |
| + | 打開一個文件進行更新(可讀可寫)。 |
| U | 通用換行模式(不推薦)。 |
| r | 以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式。 |
| rb | 以二進制格式打開一個文件用于只讀。文件指針將會放在文件的開頭。這是默認模式。一般用于非文本文件如圖片等。 |
| r+ | 打開一個文件用于讀寫。文件指針將會放在文件的開頭。 |
| rb+ | 以二進制格式打開一個文件用于讀寫。文件指針將會放在文件的開頭。一般用于非文本文件如圖片等。 |
| w | 打開一個文件只用于寫入。如果該文件已存在則打開文件,并從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。 |
| wb | 以二進制格式打開一個文件只用于寫入。如果該文件已存在則打開文件,并從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。一般用于非文本文件如圖片等。 |
| w+ | 打開一個文件用于讀寫。如果該文件已存在則打開文件,并從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。 |
| wb+ | 以二進制格式打開一個文件用于讀寫。如果該文件已存在則打開文件,并從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。一般用于非文本文件如圖片等。 |
| a | 打開一個文件用于追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之后。如果該文件不存在,創建新文件進行寫入。 |
| ab | 以二進制格式打開一個文件用于追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之后。如果該文件不存在,創建新文件進行寫入。 |
| a+ | 打開一個文件用于讀寫。如果該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。如果該文件不存在,創建新文件用于讀寫。 |
| ab+ | 以二進制格式打開一個文件用于追加。如果該文件已存在,文件指針將會放在文件的結尾。如果該文件不存在,創建新文件用于讀寫。 |
反過來,對應我們需要的操作,我們可以選擇的access_mode命令字符如下 :
| 讀 | + | + | ? | + | ? | + |
| 寫 | ? | + | + | + | + | + |
| 創建 | ? | ? | + | + | + | + |
| 覆蓋 | ? | ? | + | + | ? | ? |
| 指針在開始 | + | + | + | + | ? | ? |
| 指針在結尾 | ? | ? | ? | ? | + | + |
?2、file對象:
一個文件被打開后,你有一個file對象,你可以得到有關該文件的各種信息。
以下是和file對象相關的所有屬性的列表:
| file.closed | 返回true如果文件已被關閉,否則返回false。 |
| file.mode | 返回被打開文件的訪問模式。 |
| file.name | 返回文件的名稱。 |
| file.softspace | 如果用print輸出后,必須跟一個空格符,則返回false。否則返回true。 |
(1)File.close():
File 對象的 close()方法刷新緩沖區里任何還沒寫入的信息,并關閉該文件,這之后便不能再進行寫入。
當一個文件對象的引用被重新指定給另一個文件時,Python 會關閉之前的文件。用 close()方法關閉文件是一個很好的習慣。
比如下面這個例子:
#!/usr/bin/python # -*- coding: UTF-8 -*-# 打開一個文件 fo = open("foo.txt", "w") print "文件名: ", fo.name# 關閉打開的文件 fo.close()?輸出結果是:
文件名: foo.txt(2)File.write():
write()方法可將任何字符串寫入一個打開的文件。需要重點注意的是,Python字符串可以是二進制數據,而不是僅僅是文字。
write()方法不會在字符串的結尾添加換行符('\n'):
#!/usr/bin/python # -*- coding: UTF-8 -*-# 打開一個文件 fo = open("foo.txt", "w") fo.write( "www.runoob.com!\nVery good site!\n")# 關閉打開的文件 fo.close()?上述方法會創建foo.txt文件,并將收到的內容寫入該文件,并最終關閉文件。如果你打開這個文件,將看到以下內容:
$ cat foo.txt www.runoob.com! Very good site!(3)File.read()方法:
read()方法從一個打開的文件中讀取一個字符串。需要重點注意的是,Python字符串可以是二進制數據,而不是僅僅是文字。
在這里,被傳遞的參數是要從已打開文件中讀取的字節計數。該方法從文件的開頭開始讀入,如果沒有傳入count,它會嘗試盡可能多地讀取更多的內容,很可能是直到文件的末尾。
這里我們用到以上創建的 foo.txt 文件。
#!/usr/bin/python # -*- coding: UTF-8 -*-# 打開一個文件 fo = open("foo.txt", "r+") str = fo.read(10) print "讀取的字符串是 : ", str # 關閉打開的文件 fo.close()以上實例輸出結果:
讀取的字符串是 : www.runoob(4)File.tell()方法:
tell()方法告訴你文件內的當前位置, 換句話說,下一次的讀寫會發生在文件開頭這么多字節之后。
seek(offset [,from])方法改變當前文件的位置。Offset變量表示要移動的字節數。From變量指定開始移動字節的參考位置。
如果from被設為0,這意味著將文件的開頭作為移動字節的參考位置。如果設為1,則使用當前的位置作為參考位置。如果它被設為2,那么該文件的末尾將作為參考位置。
#!/usr/bin/python # -*- coding: UTF-8 -*-# 打開一個文件 fo = open("foo.txt", "r+") str = fo.read(10) print "讀取的字符串是 : ", str# 查找當前位置 position = fo.tell() print "當前文件位置 : ", position# 把指針再次重新定位到文件開頭 position = fo.seek(0, 0) str = fo.read(10) print "重新讀取字符串 : ", str # 關閉打開的文件 fo.close()?輸出結果為:
讀取的字符串是 : www.runoob 當前文件位置 : 10 重新讀取字符串 : www.runoob(5)os模塊:import os
Python的os模塊提供了幫你執行文件處理操作的方法,比如重命名和刪除文件。
要使用這個模塊,你必須先導入它,然后才可以調用相關的各種功能。
os.rename()方法:
rename()方法需要兩個參數,當前的文件名和新文件名。
os.remove()方法:
你可以用remove()方法刪除文件,需要提供要刪除的文件名作為參數。
mkdir()方法
可以使用os模塊的mkdir()方法在當前目錄下創建新的目錄們。你需要提供一個包含了要創建的目錄名稱的參數。
chdir()方法
可以用chdir()方法來改變當前的目錄。chdir()方法需要的一個參數是你想設成當前目錄的目錄名稱。
getcwd()方法:
getcwd()方法顯示當前的工作目錄。
rmdir()方法
rmdir()方法刪除目錄,目錄名稱以參數傳遞。
在刪除這個目錄之前,它的所有內容應該先被清除。
?
詳細的os模塊的各個內嵌功能函數解釋如下表:
| 1 | os.access(path, mode) 檢驗權限模式 |
| 2 | os.chdir(path) 改變當前工作目錄 |
| 3 | os.chflags(path, flags) 設置路徑的標記為數字標記。 |
| 4 | os.chmod(path, mode) 更改權限 |
| 5 | os.chown(path, uid, gid) 更改文件所有者 |
| 6 | os.chroot(path) 改變當前進程的根目錄 |
| 7 | os.close(fd) 關閉文件描述符 fd |
| 8 | os.closerange(fd_low, fd_high) 關閉所有文件描述符,從 fd_low (包含) 到 fd_high (不包含), 錯誤會忽略 |
| 9 | os.dup(fd) 復制文件描述符 fd |
| 10 | os.dup2(fd, fd2) 將一個文件描述符 fd 復制到另一個 fd2 |
| 11 | os.fchdir(fd) 通過文件描述符改變當前工作目錄 |
| 12 | os.fchmod(fd, mode) 改變一個文件的訪問權限,該文件由參數fd指定,參數mode是Unix下的文件訪問權限。 |
| 13 | os.fchown(fd, uid, gid) 修改一個文件的所有權,這個函數修改一個文件的用戶ID和用戶組ID,該文件由文件描述符fd指定。 |
| 14 | os.fdatasync(fd) 強制將文件寫入磁盤,該文件由文件描述符fd指定,但是不強制更新文件的狀態信息。 |
| 15 | os.fdopen(fd[, mode[, bufsize]]) 通過文件描述符 fd 創建一個文件對象,并返回這個文件對象 |
| 16 | os.fpathconf(fd, name) 返回一個打開的文件的系統配置信息。name為檢索的系統配置的值,它也許是一個定義系統值的字符串,這些名字在很多標準中指定(POSIX.1, Unix 95, Unix 98, 和其它)。 |
| 17 | os.fstat(fd) 返回文件描述符fd的狀態,像stat()。 |
| 18 | os.fstatvfs(fd) 返回包含文件描述符fd的文件的文件系統的信息,像 statvfs() |
| 19 | os.fsync(fd) 強制將文件描述符為fd的文件寫入硬盤。 |
| 20 | os.ftruncate(fd, length) 裁剪文件描述符fd對應的文件, 所以它最大不能超過文件大小。 |
| 21 | os.getcwd() 返回當前工作目錄 |
| 22 | os.getcwdu() 返回一個當前工作目錄的Unicode對象 |
| 23 | os.isatty(fd) 如果文件描述符fd是打開的,同時與tty(-like)設備相連,則返回true, 否則False。 |
| 24 | os.lchflags(path, flags) 設置路徑的標記為數字標記,類似 chflags(),但是沒有軟鏈接 |
| 25 | os.lchmod(path, mode) 修改連接文件權限 |
| 26 | os.lchown(path, uid, gid) 更改文件所有者,類似 chown,但是不追蹤鏈接。 |
| 27 | os.link(src, dst) 創建硬鏈接,名為參數 dst,指向參數 src |
| 28 | os.listdir(path) 返回path指定的文件夾包含的文件或文件夾的名字的列表。 |
| 29 | os.lseek(fd, pos, how) 設置文件描述符 fd當前位置為pos, how方式修改: SEEK_SET 或者 0 設置從文件開始的計算的pos; SEEK_CUR或者 1 則從當前位置計算; os.SEEK_END或者2則從文件尾部開始. 在unix,Windows中有效 |
| 30 | os.lstat(path) 像stat(),但是沒有軟鏈接 |
| 31 | os.major(device) 從原始的設備號中提取設備major號碼 (使用stat中的st_dev或者st_rdev field)。 |
| 32 | os.makedev(major, minor) 以major和minor設備號組成一個原始設備號 |
| 33 | os.makedirs(path[, mode]) 遞歸文件夾創建函數。像mkdir(), 但創建的所有intermediate-level文件夾需要包含子文件夾。 |
| 34 | os.minor(device) 從原始的設備號中提取設備minor號碼 (使用stat中的st_dev或者st_rdev field )。 |
| 35 | os.mkdir(path[, mode]) 以數字mode的mode創建一個名為path的文件夾.默認的 mode 是 0777 (八進制)。 |
| 36 | os.mkfifo(path[, mode]) 創建命名管道,mode 為數字,默認為 0666 (八進制) |
| 37 | os.mknod(filename[, mode=0600, device]) |
| 38 | os.open(file, flags[, mode]) 打開一個文件,并且設置需要的打開選項,mode參數是可選的 |
| 39 | os.openpty() 打開一個新的偽終端對。返回 pty 和 tty的文件描述符。 |
| 40 | os.pathconf(path, name) 返回相關文件的系統配置信息。 |
| 41 | os.pipe() 創建一個管道. 返回一對文件描述符(r, w) 分別為讀和寫 |
| 42 | os.popen(command[, mode[, bufsize]]) 從一個 command 打開一個管道 |
| 43 | os.read(fd, n) 從文件描述符 fd 中讀取最多 n 個字節,返回包含讀取字節的字符串,文件描述符 fd對應文件已達到結尾, 返回一個空字符串。 |
| 44 | os.readlink(path) 返回軟鏈接所指向的文件 |
| 45 | os.remove(path) 刪除路徑為path的文件。如果path 是一個文件夾,將拋出OSError; 查看下面的rmdir()刪除一個 directory。 |
| 46 | os.removedirs(path) 遞歸刪除目錄。 |
| 47 | os.rename(src, dst) 重命名文件或目錄,從 src 到 dst |
| 48 | os.renames(old, new) 遞歸地對目錄進行更名,也可以對文件進行更名。 |
| 49 | os.rmdir(path) 刪除path指定的空目錄,如果目錄非空,則拋出一個OSError異常。 |
| 50 | os.stat(path) 獲取path指定的路徑的信息,功能等同于C API中的stat()系統調用。 |
| 51 | os.stat_float_times([newvalue]) |
| 52 | os.statvfs(path) 獲取指定路徑的文件系統統計信息 |
| 53 | os.symlink(src, dst) 創建一個軟鏈接 |
| 54 | os.tcgetpgrp(fd) 返回與終端fd(一個由os.open()返回的打開的文件描述符)關聯的進程組 |
| 55 | os.tcsetpgrp(fd, pg) 設置與終端fd(一個由os.open()返回的打開的文件描述符)關聯的進程組為pg。 |
| 56 | os.tempnam([dir[, prefix]]) 返回唯一的路徑名用于創建臨時文件。 |
| 57 | os.tmpfile() 返回一個打開的模式為(w+b)的文件對象 .這文件對象沒有文件夾入口,沒有文件描述符,將會自動刪除。 |
| 58 | os.tmpnam() 為創建一個臨時文件返回一個唯一的路徑 |
| 59 | os.ttyname(fd) 返回一個字符串,它表示與文件描述符fd 關聯的終端設備。如果fd 沒有與終端設備關聯,則引發一個異常。 |
| 60 | os.unlink(path) 刪除文件路徑 |
| 61 | os.utime(path, times) 返回指定的path文件的訪問和修改的時間。 |
| 62 | os.walk(top[, topdown=True[, οnerrοr=None[, followlinks=False]]]) 輸出在文件夾中的文件名通過在樹中游走,向上或者向下。 |
| 63 | os.write(fd, str) 寫入字符串到文件描述符 fd中. 返回實際寫入的字符串長度 |
| 64 | os.path 模塊 獲取文件的屬性信息。 |
?
具體的例子可以參看下面這個程序:
import os import timetime1 = os.path.getctime('/etc/shadow') #時間戳時間 print(time1) tuple_time = time.localtime(time1) print(tuple_time) year = tuple_time.tm_year month = tuple_time.tm_mon day = tuple_time.tm_mdaywith open('date.txt','a') as f:f.write('%d %d %d' %(year,month,day))f.write('\n')不難知道它所實現的功能是:
利用time.time()方法,我們可以計算兩個時間點之間的時間間隔,但是有些時候我們想要得到/etc/group文件的a/c/m的時間對應的年月日這些信息,并保存再文件date.txt文件中。
二、異常處理:
1、異常即是一個事件,該事件會在程序執行過程中發生,影響了程序的正常執行:
一般情況下,在Python無法正常處理程序時就會發生一個異常。
異常是Python對象,表示一個錯誤。
當Python腳本發生異常時我們需要捕獲處理它,否則程序會終止執行。下面的表格詳細總結了常見的python編譯異常及名稱:
| BaseException | 所有異常的基類 |
| SystemExit | 解釋器請求退出 |
| KeyboardInterrupt | 用戶中斷執行(通常是輸入^C) |
| Exception | 常規錯誤的基類 |
| StopIteration | 迭代器沒有更多的值 |
| GeneratorExit | 生成器(generator)發生異常來通知退出 |
| StandardError | 所有的內建標準異常的基類 |
| ArithmeticError | 所有數值計算錯誤的基類 |
| FloatingPointError | 浮點計算錯誤 |
| OverflowError | 數值運算超出最大限制 |
| ZeroDivisionError | 除(或取模)零 (所有數據類型) |
| AssertionError | 斷言語句失敗 |
| AttributeError | 對象沒有這個屬性 |
| EOFError | 沒有內建輸入,到達EOF 標記 |
| EnvironmentError | 操作系統錯誤的基類 |
| IOError | 輸入/輸出操作失敗 |
| OSError | 操作系統錯誤 |
| WindowsError | 系統調用失敗 |
| ImportError | 導入模塊/對象失敗 |
| LookupError | 無效數據查詢的基類 |
| IndexError | 序列中沒有此索引(index) |
| KeyError | 映射中沒有這個鍵 |
| MemoryError | 內存溢出錯誤(對于Python 解釋器不是致命的) |
| NameError | 未聲明/初始化對象 (沒有屬性) |
| UnboundLocalError | 訪問未初始化的本地變量 |
| ReferenceError | 弱引用(Weak reference)試圖訪問已經垃圾回收了的對象 |
| RuntimeError | 一般的運行時錯誤 |
| NotImplementedError | 尚未實現的方法 |
| SyntaxError | Python 語法錯誤 |
| IndentationError | 縮進錯誤 |
| TabError | Tab 和空格混用 |
| SystemError | 一般的解釋器系統錯誤 |
| TypeError | 對類型無效的操作 |
| ValueError | 傳入無效的參數 |
| UnicodeError | Unicode 相關的錯誤 |
| UnicodeDecodeError | Unicode 解碼時的錯誤 |
| UnicodeEncodeError | Unicode 編碼時錯誤 |
| UnicodeTranslateError | Unicode 轉換時錯誤 |
| Warning | 警告的基類 |
| DeprecationWarning | 關于被棄用的特征的警告 |
| FutureWarning | 關于構造將來語義會有改變的警告 |
| OverflowWarning | 舊的關于自動提升為長整型(long)的警告 |
| PendingDeprecationWarning | 關于特性將會被廢棄的警告 |
| RuntimeWarning | 可疑的運行時行為(runtime behavior)的警告 |
| SyntaxWarning | 可疑的語法的警告 |
| UserWarning | 用戶代碼生成的警告 |
?2、異常處理的方法:
(1)捕捉異常可以使用try/except語句:
try/except語句用來檢測try語句塊中的錯誤,從而讓except語句捕獲異常信息并處理。
如果你不想在異常發生時結束你的程序,只需在try里捕獲它。
語法:
以下為簡單的try....except...else的語法:
try: <語句> #運行別的代碼 except <名字>: <語句> #如果在try部份引發了'name'異常 except <名字>,<數據>: <語句> #如果引發了'name'異常,獲得附加的數據 else: <語句> #如果沒有異常發生try的工作原理是,當開始一個try語句后,python就在當前程序的上下文中作標記,這樣當異常出現時就可以回到這里,try子句先執行,接下來會發生什么依賴于執行時是否出現異常。
- 如果當try后的語句執行時發生異常,python就跳回到try并執行第一個匹配該異常的except子句,異常處理完畢,控制流就通過整個try語句(除非在處理異常時又引發新的異常)。
- 如果在try后的語句里發生了異常,卻沒有匹配的except子句,異常將被遞交到上層的try,或者到程序的最上層(這樣將結束程序,并打印默認的出錯信息)。
- 如果在try子句執行時沒有發生異常,python將執行else語句后的語句(如果有else的話),然后控制流通過整個try語句。
下面是簡單的例子,它打開一個文件,在該文件中的內容寫入內容,且并未發生異常:
#!/usr/bin/python # -*- coding: UTF-8 -*-try:fh = open("testfile", "w")fh.write("這是一個測試文件,用于測試異常!!") except IOError:print "Error: 沒有找到文件或讀取文件失敗" else:print "內容寫入文件成功"fh.close()?輸出結果為:
$ python test.py 內容寫入文件成功 $ cat testfile # 查看寫入的內容 這是一個測試文件,用于測試異常!!這里需要多說一句:except對象不帶異常參數則是捕獲所有的異常拋出。如果except對象要捕獲多個異常,括號內異常名稱用逗號連接:
try:正常的操作...................... except(Exception1[, Exception2[,...ExceptionN]]]):發生以上多個異常中的一個,執行這塊代碼...................... else:如果沒有異常執行這塊代碼(2)try-finally 語句無論是否發生異常都將執行最后的代碼:
例如這個例子:
#!/usr/bin/python # -*- coding: UTF-8 -*-try:fh = open("testfile", "w")fh.write("這是一個測試文件,用于測試異常!!") finally:print "Error: 沒有找到文件或讀取文件失敗"?輸出結果為:
$ python test.py Error: 沒有找到文件或讀取文件失敗當在try塊中拋出一個異常,立即執行finally塊代碼。finally塊中的所有語句執行后,異常被再次觸發,并執行except塊代碼。此處參數的內容不同于異常。
(3)我們可以使用raise語句自己觸發異常:
raise語法格式如下:
raise [Exception [, args [, traceback]]]語句中 Exception 是異常的類型(例如,NameError)參數標準異常中任一種,args 是自已提供的異常參數。
最后一個參數是可選的(在實踐中很少使用),如果存在,是跟蹤異常對象。
一個異常可以是一個字符串,類或對象。 Python的內核提供的異常,大多數都是實例化的類,這是一個類的實例的參數。
定義一個異常非常簡單,如下所示:
def functionName( level ):if level < 1:raise Exception("Invalid level!", level)# 觸發異常后,后面的代碼就不會再執行為了能夠捕獲異常,"except"語句必須有用相同的異常來拋出類對象或者字符串。
例如我們捕獲以上異常,"except"語句如下所示:
try:正常邏輯 except Exception,err:觸發自定義異常 else:其余代碼(4)用戶自定義異常:
通過創建一個新的異常類,程序可以命名它們自己的異常。異常應該是典型的繼承自Exception類,通過直接或間接的方式。
以下為與RuntimeError相關的實例,實例中創建了一個類,基類為RuntimeError,用于在異常觸發時輸出更多的信息。
在try語句塊中,用戶自定義的異常后執行except塊語句,變量 e 是用于創建Networkerror類的實例。
class Networkerror(RuntimeError):def __init__(self, arg):self.args = arg?在你定義以上類后,你可以觸發該異常,如下所示:
try:raise Networkerror("Bad hostname") except Networkerror,e:print e.args?
三、Python標準庫:
這一節是后面引入Python進階知識總結的一個敲門磚。我們前面學習了Python中包含的大量模塊和包,那么這些東西統一起來稱作Python的標準庫。事實上Python最強大的功能正是在于這個標準庫的存在,并且用戶可以隨心下載一些更新的包、模塊,利用help或者dir方法查看其功用,并且快速上手完成辦公、人工智能、數據科學計算等復雜的工作。
真正要詳細講解Python標準庫的內容,可能三天三夜也說不完。以下借鑒了@PythonAV的文章,我們可以深入地學習了解這二十個最好用也最強大的標準庫&第三方庫。具體的學習地點可以百度或者上Python官網查看,后面的文章也會對其中的一些內容作深入剖析:
由于博主是電子信息方向的學生,有同時在深入學習數據科學的知識,所以這幾個庫是必備的,如果讀者與博主的方向相同或者類似,不妨也下載來試試看:
1、Signal庫:signal可以被用來進程間通信和異步處理。Python標準庫提供了signal包可以用來處理信號相關
2、Scipy庫:主要是Numpy模塊用于現代數值計算分析
3、標準庫有個 wave 模塊:可以轉音頻成 wav 格式,再用它處理。不過說實話,這個模塊太底層了。除此便是Pydub,超方便的模塊。不僅封裝了 wave,安裝了 ffmpeg 后還可以處理 mp3 ogg 等所有常見格式。
4、python-midi庫:python-midi的優勢是不光可以自己寫程序生成MIDI,而且還可以對MIDI文件進行解析。這樣的功能配合機器學習算法,或許可以幫助我們實現機器的自動編曲。
5、Beautifulsoup庫:BeautifulSoup4是爬蟲必學的技能。BeautifulSoup最主要的功能是從網頁抓取數據,Beautiful Soup自動將輸入文檔轉換為Unicode編碼,輸出文檔轉換為utf-8編碼。BeautifulSoup支持Python標準庫中的HTML解析器,還支持一些第三方的解析器,如果我們不安裝它,則 Python 會使用 Python默認的解析器,lxml 解析器更加強大,速度更快,推薦使用lxml 解析器。
6、?TensorFlow、Torch、MLPack、CNTK等深度學習、人工智能庫:人工智能的實現離不開開發框架和AI庫,以下是匯總的10大高質量人工智能開發框架和AI庫,以便于更深入的了解并探索人工智能的世界。筆者雖然并不喜歡人工智能研究方向,但是這些已經開發出來的人工智能方面的軟件編寫知識中或多或少有值得我們借鑒優化我們程序別的算法的地方。
?
P.S.Python庫的在線安裝方法:(離線安裝就像安軟件一樣,此處不再贅述)
pip install --upgrade 庫名
s在cmd中輸入pip install --upgrade xxxx就可以在線更新庫了,xxx為你要更新的庫的名稱。如在線更新lxml包,只需要在cmd中輸入pip install --upgrade lxml。
Python庫的調用方法:
?
四、用Python是為了解決問題:
Python純語法部分總結的最后一小節,我將稍作交流如何建立用Python為我們的生活工作帶來便捷的思維模式,這有助于我們之后的學習和開發工作。
這是一個很強大的思維導圖,幾乎囊括了Python基礎及思維模式的一切知識,學習&復習過程不妨拿來多推敲幾遍。摘自@背了個影子?https://www.cnblogs.com/bt14/p/11333523.html?總結。
?
既然我們要學習Python,那么我們應該學會Python的程序設計思維:
1、自頂向下 和 自底向上
自頂向下(設計)
解決復雜問題的有效方法
- 將一個總問題表達為若干個小問題組成的形式
- 使用同樣方法進一步分解小問題
- 直至,小問題可以用計算機簡單明了的解決
自底向上(執行)
逐步組建復雜系統的有效測試方法
- 分單元測試,逐步組裝
- 按照自頂向下相反的路徑操作
- 直至,系統各部分以組裝的思路都經過測試和驗證
設計的時候,編碼之前,先想好框架
調試的時候,逐漸測試各個單元
2、計算思維與程序設計
- 邏輯思維:推理和演繹,數學為代表,A->B B->C A->C
- 實證思維:實驗和驗證,物理為代表,引力波<-實驗
-
計算思維:設計和構造,計算機為代表,漢諾塔遞歸
3、計算生態與Python語言
開源思想深入演化和發展,形成了計算生態
計算生態以開源項目為組織形式,充分利用“共識原則”和“社會利他”組織人員,在競爭發展、相互依存和迅速更迭中完成信息技術的更新換代,形成了技術的自我演化路徑。
以開源項目為代表的大量第三方庫Python語言提供 >15萬個第三方庫;
庫的建設經過野蠻生長和自然選擇同一個功能,Python語言2個以上第三方庫;
庫之間相互關聯使用,依存發展Python庫間廣泛聯系,逐級封裝;
社區龐大,新技術更迭迅速AlphaGo深度學習算法采用Python語言開源;
學習 python,不是一行一行代碼,而是站在巨人的肩膀上
4、用戶體驗與軟件產品
編程只是手段,不是目的,程序最終為人類服務,所以我們要盡量考慮提高用戶體驗;
要是我們自己都不滿意自己的產品,那么別人更加不會滿意
提升用戶體驗的方法無非就是做到以下幾點:
- 如果程序需要計算時間,可能產生等待,請增加進度展示
- 如果程序有若干步驟,需要提示用戶,請增加進度展示
- 如果程序可能存在大量次數的循環,請增加進度展示
- 當獲得用戶輸入,對合規性需要檢查,需要異常處理
- 當讀寫文件時,對結果進行判斷,需要異常處理
- 當進行輸入輸出時,對運算結果進行判斷,需要異常處理
- 打印輸出:特定位置,輸出程序運行的過程信息
- 日志文件:對程序異常及用戶使用進行定期記錄
- 幫助信息:給用戶多種方式提供幫助信息
5、基本的程序設計模式
從IPO開始…
- 確定IPO:明確計算部分及功能邊界
- 編寫程序:將計算求解的設計變成現實
- 調試程序:確保程序按照正確邏輯能夠正確運行
模塊化設計
- 通過函數或對象封裝將程序劃分為模塊及模塊間的表達
- 具體包括:主程序、子程序和子程序間關系
- 分而治之:一種分而治之、分層抽象、體系化的設計思想
- 緊耦合:兩個部分之間交流很多,無法獨立存在
- 松耦合:兩個部分之間交流較少,可以獨立存在
- 模塊內部緊耦合、模塊之間松耦合
配置化設計
- 引擎+配置:程序執行和配置分離,將可選參數配置化
- 將程序開發變成配置文件編寫,擴展功能而不修改程序
- 關鍵在于接口設計,清晰明了、靈活可擴展
應用開發的四個步驟
從應用需求到軟件產品
- 1 產品定義:對應用需求充分理解和明確定義
產品定義,而不僅是功能定義,要考慮商業模式 - 2 系統架構:以系統方式思考產品的技術實現
系統架構,關注數據流、模塊化、體系架構 - 3 設計與實現:結合架構完成關鍵設計及系統實現
結合可擴展性、靈活性等進行設計優化 - 4 用戶體驗:從用戶角度思考應用效果
用戶至上,體驗優先,以用戶為中心
用最簡單的方式來描述Python程序設計的最佳思路,便是:做什么(分析)→如何做(設計)→編寫代碼(實施)→測試程序(調試)→使用程序(實施或開發)→維護(優化程序)六個步驟。做好了這六個步驟,我們所進行的程序開發工作便可謂接近完美了。核心永遠牢記:用戶體驗最佳模式。此外如果需要對程序備份腳本,可以通過在zip歸檔名上附帶一個用戶提供的注釋來方便并且直觀地實現。
至此,我們利用三篇文章介紹了Python的所有常用語法。雖說工欲善其事必先利其器,但光有語法遠遠不夠,我們的python學習道阻且長。將Python的語法和C語言進行對比,可以加快對這些知識點的理解。如果對C語言的編寫還不太熟悉,建議先從C語言開始學起。初學者直接學Python容易養成避重就輕愛走捷徑的壞習慣。事實上理解算法的本質含義比學會多少個庫的使用都重要,它能幫助我們養成真正的程序員思維。
總結
以上是生活随笔為你收集整理的Python程序设计与科学计算精录总结Episode.3 Python高级语法:文件、异常、标准库和问题解决模式知识总结(基于Michael导师Python课程与VS2019)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: protocol buffer 使用之
- 下一篇: python中函数是一段子程序_用Pyt