驗(yàn)指導(dǎo)部分答案高效復(fù)現(xiàn)指南)
簡介Python語言程序設(shè)計(jì)劉衛(wèi)國實(shí)驗(yàn)指導(dǎo)的部分答案以doc文檔形式面向Python初學(xué)者和高校相關(guān)專業(yè)學(xué)生為實(shí)驗(yàn)練習(xí)提供可直接運(yùn)行的代碼參考。內(nèi)容覆蓋實(shí)驗(yàn)1至實(shí)驗(yàn)4以及實(shí)驗(yàn)6、實(shí)驗(yàn)7具體包括π平方計(jì)算、出生日期格式化輸出、正數(shù)拆分為整數(shù)與小數(shù)部分、整除判斷、循環(huán)與嵌套循環(huán)的結(jié)果分析、字符串與正則表達(dá)式檢查、列表與元組操作等每道題均給出完整代碼和簡要運(yùn)行思路并針對(duì)浮點(diǎn)數(shù)比較誤差、元組不可變等易錯(cuò)點(diǎn)作了說明。作者已上機(jī)測試確保代碼可實(shí)際使用。資源包為單個(gè)doc文件大小僅145KB按實(shí)驗(yàn)序號(hào)組織便于按需查閱。目前已有6689人學(xué)習(xí)瀏覽既能幫助初學(xué)者在實(shí)驗(yàn)課上對(duì)照參考、快速定位問題也可用于期末復(fù)習(xí)時(shí)梳理Python基礎(chǔ)語法、控制結(jié)構(gòu)與常用數(shù)據(jù)結(jié)構(gòu)。1. 一份只有部分答案的實(shí)驗(yàn)指導(dǎo)反而是練好 Python 的捷徑拿到「python語言程序設(shè)計(jì)實(shí)驗(yàn)指導(dǎo)_部分答案」這份 .doc 時(shí)大多數(shù)人先看到的是「不完整」三個(gè)字我看到的卻是一條帶校驗(yàn)的學(xué)習(xí)路線圖。全答案的資料會(huì)讓你忍不住照抄零答案的習(xí)題集又容易讓你卡到棄坑而「部分答案」恰好把壓力留在每一個(gè)你本該自己寫的位置上。這篇筆記不替你把答案抄一遍而是講清楚怎么讀懂這份實(shí)驗(yàn)指導(dǎo)、怎么把 .doc 里埋著的代碼轉(zhuǎn)出來跑通、以及哪些位置最容易翻車。適合正在跟教材做實(shí)驗(yàn)、又不想把自己練成打字機(jī)的初學(xué)者也適合需要給課程配實(shí)驗(yàn)的助教參考。2. 讀懂實(shí)驗(yàn)指導(dǎo)結(jié)構(gòu)、答案分布與正確的打開順序2.1 一份 Python 實(shí)驗(yàn)指導(dǎo)里到底裝了什么先明確一件事實(shí)驗(yàn)指導(dǎo)不是教材的目錄重排。教材講概念實(shí)驗(yàn)指導(dǎo)給的是「動(dòng)手驗(yàn)證概念的路徑」。我經(jīng)手過的這類 .doc結(jié)構(gòu)高度相似通常包含五塊內(nèi)容實(shí)驗(yàn)?zāi)康?、?shí)驗(yàn)內(nèi)容、參考步驟、思考題、參考答案。實(shí)驗(yàn)?zāi)康暮蛯?shí)驗(yàn)內(nèi)容決定「做什么」參考步驟決定「按什么順序做」而「部分答案」的分布往往集中在前面幾章越往后答案越少——這是很典型的設(shè)計(jì)前面是語法示范后面才是真正留給你的訓(xùn)練場。拿到文件后第一步不是急著看代碼而是把整份文檔的題目標(biāo)題抄出來標(biāo)出哪些帶答案、哪些不帶。我習(xí)慣先用下面兩條命令看一眼文件的真身再做標(biāo)記ls -lh 實(shí)驗(yàn)指導(dǎo).doc file 實(shí)驗(yàn)指導(dǎo).docfile命令會(huì)告訴你這個(gè) .doc 到底是真正的 Word 97-2003 二進(jìn)制文檔還是被人改了擴(kuò)展名的 HTML 或 RTF。這一步很關(guān)鍵因?yàn)?.doc 后綴的二進(jìn)制格式和 .docx 的 XML 壓縮包完全不是一回事后續(xù)用哪套轉(zhuǎn)換工具全由這里決定。大多數(shù)情況下高校課程群里的這份文件是貨真價(jià)實(shí)的 .doc但也有相當(dāng)概率是另存為時(shí)格式錯(cuò)亂的結(jié)果先驗(yàn)證再動(dòng)手能省下大量排障時(shí)間。2.2 「部分答案」的正確用法先寫后看而不是先看后寫血淚經(jīng)驗(yàn)是答案讀三遍不如自己寫一遍。對(duì)帶答案的實(shí)驗(yàn)正確姿勢是把答案區(qū)域遮住自己先按題目寫一版跑通之后再對(duì)照答案只比較「思路差異」而不是「逐字符差異」。對(duì)不帶答案的實(shí)驗(yàn)反而更簡單——它們就是你的隨堂考試運(yùn)行結(jié)果對(duì)不對(duì)直接決定你對(duì)這塊知識(shí)的理解有沒有到位。我一般會(huì)給每個(gè)實(shí)驗(yàn)設(shè)一個(gè) 20 分鐘的時(shí)間盒20 分鐘內(nèi)寫不出來才允許偷看答案看完答案合上隔天再獨(dú)立重寫一遍。這個(gè)節(jié)奏能把「部分答案」的校驗(yàn)價(jià)值榨干又不會(huì)讓一次卡頓演變成整門課的放棄。記住一個(gè)反直覺的結(jié)論實(shí)驗(yàn)指導(dǎo)里的答案不是給你抄的是給你對(duì)答案用的抄得越勤快忘得越徹底。2.3 實(shí)驗(yàn)順序和知識(shí)點(diǎn)的對(duì)應(yīng)關(guān)系知道自己正在練哪一環(huán)實(shí)驗(yàn)指導(dǎo)的章節(jié)順序通常對(duì)應(yīng)一條技能鏈環(huán)境搭建 → 數(shù)據(jù)類型與變量 → 分支與循環(huán) → 字符串 → 列表元組字典 → 函數(shù) → 文件 → 異常 → 類與對(duì)象 → 標(biāo)準(zhǔn)庫。下面這張表是我對(duì)照多份同類實(shí)驗(yàn)指導(dǎo)后歸納的最常見映射你可以拿它來定位自己當(dāng)前卡在哪一環(huán)實(shí)驗(yàn)主題核心知識(shí)點(diǎn)復(fù)現(xiàn)時(shí)的驗(yàn)證方式環(huán)境搭建解釋器、包管理python --version、pip list分支與循環(huán)條件判斷、迭代多組輸入用例比對(duì)輸出字符串切片、格式化邊界索引空串、負(fù)索引列表與字典推導(dǎo)式、成員操作len()、成員判斷、引用修改函數(shù)參數(shù)傳遞、返回值對(duì)關(guān)鍵函數(shù)做斷言文件與異常讀寫、try/except異常路徑觸發(fā)測試順著這張表復(fù)盤自己的進(jìn)度比「做到第幾個(gè)實(shí)驗(yàn)」更靠譜。如果你在某個(gè)主題上連續(xù)兩次對(duì)照答案都改不出差異說明這一環(huán)可以跳過反過來如果看著答案都復(fù)現(xiàn)不出運(yùn)行結(jié)果那問題通常不在你而在代碼本身——這正是后面要展開的最常見翻車點(diǎn)。3. 把 .doc 變成可執(zhí)行代碼轉(zhuǎn)換、提取與清洗的完整鏈路3.1 用 LibreOffice 無頭模式完成 .doc 到 .docx 的格式轉(zhuǎn)換python-docx 只能讀.docx讀不了老式.doc所以第一件事是格式轉(zhuǎn)換??缙脚_(tái)最省事的方案是 LibreOffice 的無頭模式不需要打開圖形界面一條命令批量完成libreoffice --headless --convert-to docx --outdir ./converted 實(shí)驗(yàn)指導(dǎo).doc libreoffice --headless --convert-to txt:Text --outdir ./converted 實(shí)驗(yàn)指導(dǎo).doc第一條命令生成.docx留給后續(xù)結(jié)構(gòu)化解析用第二條直接導(dǎo)出純文本方便快速搜索「答案」「實(shí)驗(yàn)」這類關(guān)鍵詞。參數(shù)上--headless表示不啟動(dòng)圖形界面適合在服務(wù)器或腳本環(huán)境里運(yùn)行--convert-to指定目標(biāo)格式--outdir指定輸出目錄不寫的話文件會(huì)生成在當(dāng)前目錄。注意txt:Text是 LibreOffice 的完整過濾器名只寫txt在某些版本上會(huì)報(bào)錯(cuò)務(wù)必帶上前綴。如果環(huán)境里沒有 LibreOfficeLinux 上還有更輕量的antiword只做文本提取不做格式保留antiword 實(shí)驗(yàn)指導(dǎo).doc guide.txtantiword對(duì)純文字內(nèi)容的還原度尚可但一遇到表格和代碼縮進(jìn)就會(huì)丟格式所以它只適合快速瀏覽、確認(rèn)這份文檔里都有什么不適合做最終提取。兩條路線的取舍在于要結(jié)構(gòu)用 LibreOffice 出 docx要速度用 antiword 出 txt最后都以人工核對(duì)為準(zhǔn)。3.2 從答案段落里提取 Python 代碼清洗腳本與手動(dòng)修正.doc 轉(zhuǎn)出來的文本最大的問題是全角字符和縮進(jìn)。中文教材里的引號(hào)、冒號(hào)、括號(hào)經(jīng)常是中文全角直接丟進(jìn) Python 解釋器會(huì)立刻報(bào)SyntaxError。我一般會(huì)先跑一個(gè)清洗腳本把常見全角字符統(tǒng)一成半角再去掉行尾空白import re with open(guide.txt, encodingutf-8, errorsignore) as f: raw f.read() # 統(tǒng)一引號(hào)和冒號(hào)避免語法錯(cuò)誤 raw raw.replace(“, ).replace(”, ).replace(‘, ).replace(’, ) raw raw.replace(, :).replace(, ,).replace(, ().replace(, )) # 去掉每行末尾的空格和制表符防止粘貼后出現(xiàn)隱形空白 raw re.sub(r[ \t]$, , raw, flagsre.MULTILINE) with open(guide_clean.txt, w, encodingutf-8) as f: f.write(raw)這段代碼的邏輯是先用字符替換把中文標(biāo)點(diǎn)映射到 Python 能識(shí)別的英文標(biāo)點(diǎn)再用正則把每行末尾的空格和制表符刪掉。errorsignore是兜底參數(shù)防止某個(gè)段落里有無法解碼的字節(jié)導(dǎo)致整個(gè)腳本中斷。清洗之后剩下的縮進(jìn)問題只能手動(dòng)重建——從 .doc 提取的代碼縮進(jìn)是純文本空格層級(jí)關(guān)系經(jīng)常丟失不要偷懶逐個(gè)實(shí)驗(yàn)重新排版。3.3 用 python-docx 定位答案區(qū)結(jié)構(gòu)化解析替代肉眼翻閱如果轉(zhuǎn)出來的 docx 結(jié)構(gòu)完整可以直接用腳本把「答案區(qū)」單獨(dú)拎出來排成一份工作清單from docx import Document doc Document(converted/實(shí)驗(yàn)指導(dǎo).docx) hit False for para in doc.paragraphs: text para.text.strip() if not text: continue if text.startswith(答案) or text.startswith(參考): hit True if hit: print(f{para.style.name} | {text})這里的邏輯是用段落開頭關(guān)鍵詞「答案」「參考」觸發(fā)輸出觸發(fā)之后的所有段落都打印出來直到遇到下一個(gè)一級(jí)標(biāo)題。para.style.name能告訴你這一段是正文還是標(biāo)題從而還原實(shí)驗(yàn)指導(dǎo)本身的層級(jí)關(guān)系。腳本跑完你會(huì)得到一份「實(shí)驗(yàn)題目 對(duì)應(yīng)答案」的索引這就是你后續(xù)逐個(gè)復(fù)現(xiàn)的工作表。如果發(fā)現(xiàn)答案區(qū)格式混亂可以改用前面生成的guide_clean.txt人工切分兩種方式互為后備。提示.doc 是老格式任何轉(zhuǎn)換腳本都不能保證 100% 還原。遇到轉(zhuǎn)換后明顯殘缺的代碼塊回到原始 .doc 里人工核對(duì)這是常規(guī)操作不是失敗。4. 最小實(shí)驗(yàn)環(huán)境與第一個(gè)復(fù)現(xiàn)案例從 0 到 1 跑通參考答案4.1 為什么先搭隔離環(huán)境版本沖突是最常見的黑匣子復(fù)現(xiàn)實(shí)驗(yàn)代碼之前先搭一個(gè)獨(dú)立環(huán)境這是所有后續(xù)排障的前提。教材配套代碼的編寫時(shí)間往往早于你當(dāng)前的 Python 版本直接裝進(jìn)系統(tǒng)全局環(huán)境遲早被其他項(xiàng)目依賴搞亂。用 venv 隔離刪除重建都是秒級(jí)的事試錯(cuò)成本極低python -m venv labenv source labenv/bin/activate python --version pip install --upgrade pipWindows 上激活命令換成labenv\Scripts\activate。python --version不是廢話它是你排障時(shí)的第一依據(jù)答案里用了 f-string 卻在 Python 3.5 以下運(yùn)行必掛無疑。確認(rèn)版本后如果實(shí)驗(yàn)涉及第三方庫再逐個(gè)pip install不要提前把一堆用不到的包裝進(jìn)環(huán)境。4.2 第一個(gè)復(fù)現(xiàn)案例把「斐波那契數(shù)列」這類經(jīng)典實(shí)驗(yàn)跑通實(shí)驗(yàn)指導(dǎo)里最常見的第一個(gè)正經(jīng)實(shí)驗(yàn)通常是循環(huán)或遞歸。以這類題目為樣板從 .doc 里提取的代碼經(jīng)過清洗后大概長這樣def fib(n): a, b 0, 1 for _ in range(n): a, b b, a b return a print(fib(10))保存為demo.py后直接運(yùn)行python demo.py輸出的55就是校驗(yàn)點(diǎn)。注意這段代碼里的_是循環(huán)變量占位符表示這個(gè)值在循環(huán)體里用不到a, b b, a b是 Python 特有的同時(shí)賦值先計(jì)算右側(cè)再統(tǒng)一賦值拆成兩行寫就會(huì)得到完全錯(cuò)誤的結(jié)果。跑通后不要停在這里把n改成 0、1、2 各跑一遍確認(rèn)邊界行為——這是驗(yàn)證答案正確性的最低成本方式。4.3 用斷言把「看答案」升級(jí)成「驗(yàn)答案」只看 print 輸出會(huì)漏掉隱藏問題尤其是函數(shù)的中間狀態(tài)。最省事的自檢是加斷言把預(yù)期結(jié)果寫死在代碼里def fib(n): a, b 0, 1 for _ in range(n): a, b b, a b return a assert fib(0) 0 assert fib(1) 1 assert fib(10) 55 print(all assertions passed)斷言會(huì)在條件不滿足時(shí)直接拋異常運(yùn)行通過就說明這組輸入輸出是對(duì)的。對(duì)照實(shí)驗(yàn)指導(dǎo)的答案做這一步等于把「參考答案」升級(jí)成了「可回歸的測試用例」。對(duì)整份實(shí)驗(yàn)指導(dǎo)我的習(xí)慣是給每個(gè)函數(shù)寫兩到三個(gè)邊界斷言之后學(xué)到新知識(shí)點(diǎn)時(shí)回頭重跑能瞬間暴露舊代碼被新理解推翻的地方。注意如果答案里的代碼本身有 bug斷言會(huì)立刻暴露。不要為了「跑出文檔里的結(jié)果」而修改斷言去遷就錯(cuò)誤代碼先確認(rèn)到底是誰錯(cuò)了。5. 避坑手冊復(fù)現(xiàn)這份實(shí)驗(yàn)指導(dǎo)時(shí)最容易翻車的五個(gè)位置5.1 答案是錯(cuò)的運(yùn)行結(jié)果與答案不一致先信運(yùn)行結(jié)果現(xiàn)象照抄參考答案運(yùn)行后報(bào)錯(cuò)或者輸出和文檔里貼的結(jié)果對(duì)不上。 原因?qū)嶒?yàn)指導(dǎo)里的答案經(jīng)歷過多次排版常見錯(cuò)誤包括漏代碼行、殘留上一個(gè)實(shí)驗(yàn)的變量名、循環(huán)邊界寫錯(cuò)。文檔里貼的「運(yùn)行結(jié)果」也可能是手敲進(jìn)去的從未真正執(zhí)行過。 解決把報(bào)錯(cuò)信息按錯(cuò)誤類型查證而不是懷疑自己環(huán)境壞了。以當(dāng)前 Python 版本的官方文檔為準(zhǔn)糾正后把正確版本記在實(shí)驗(yàn)筆記里注明「原答案有誤」。5.2 轉(zhuǎn)換后代碼縮進(jìn)全亂純文本提取丟失了層級(jí)現(xiàn)象從 .doc 復(fù)制出來的代碼粘貼到編輯器里縮進(jìn)忽多忽少運(yùn)行報(bào)IndentationError。 原因Word 里的縮進(jìn)是由制表符、空格和段落格式共同構(gòu)成的轉(zhuǎn)成純文本后段落格式全部丟失只留下凌亂的空白字符。 解決清洗腳本去行尾空格后手動(dòng)重建縮進(jìn)。編輯器里打開「顯示空白字符」功能一個(gè)層級(jí)一個(gè)層級(jí)對(duì)齊。Python 對(duì)縮進(jìn)零容忍這關(guān)躲不掉也別指望有工具能自動(dòng)還原因?yàn)樵伎s進(jìn)信息已經(jīng)不在了。5.3 中文輸出亂碼編碼問題在 Windows 和 Linux 下表現(xiàn)完全不同現(xiàn)象同一段代碼在 Linux 下輸出中文正常在 Windows 下變成亂碼或直接報(bào)UnicodeEncodeError。 原因Windows 控制臺(tái)默認(rèn)編碼是 GBK而實(shí)驗(yàn)指導(dǎo)的代碼文件通常以 UTF-8 保存print 中文時(shí)兩邊對(duì)不上。 解決在代碼文件頭部聲明# -*- coding: utf-8 -*-運(yùn)行前在 Windows 上執(zhí)行set PYTHONIOENCODINGutf-8。更徹底的做法是修改控制臺(tái)代碼頁但別依賴它環(huán)境變量最省事。這個(gè)坑在讀取文本文件時(shí)同樣會(huì)出現(xiàn)寫文件時(shí)顯式指定encodingutf-8能一并規(guī)避。5.4 語法不兼容教材基于舊版 Python新解釋器直接拒絕現(xiàn)象print hello這種寫法在 3.x 里報(bào)SyntaxError: Missing parentheses或者代碼里出現(xiàn)xrange、raw_input這類早已消失的名字。 原因?qū)嶒?yàn)指導(dǎo)的部分內(nèi)容延續(xù)自 Python 2 時(shí)代或早期 3.x 的過渡寫法沒有跟著版本更新。 解決先確認(rèn)環(huán)境版本再做全局替換。print加括號(hào)xrange換成rangeraw_input換成input整數(shù)除法按 Python 3 的語義處理。這類改動(dòng)只涉及語法外殼不影響算法邏輯改完跑通即可。5.5 看完答案就忘抄寫式學(xué)習(xí)沒有留下任何可復(fù)用的東西現(xiàn)象昨天對(duì)著答案抄了一遍今天獨(dú)立寫卻無從下手。 原因抄代碼時(shí)大腦處于被動(dòng)接收狀態(tài)沒有經(jīng)過「設(shè)計(jì) → 試錯(cuò) → 修正」的閉環(huán)記憶停留時(shí)間極短。 解決回到第 2 章的時(shí)間盒策略答案只允許在卡住 20 分鐘后看并且看完合上再寫一遍。給自己定一條硬指標(biāo)每個(gè)實(shí)驗(yàn)必須留一份「我版本」的腳本哪怕和答案長得完全不一樣只要運(yùn)行結(jié)果對(duì)就算數(shù)。這五個(gè)坑里前兩個(gè)是文檔本身的坑后三個(gè)是環(huán)境和習(xí)慣的坑。文檔坑可以用工具繞過去環(huán)境和習(xí)慣坑只能靠流程改別指望一次性解決。6. 進(jìn)階把「部分答案」補(bǔ)全成你自己的實(shí)驗(yàn)記錄當(dāng)你能把文檔里每道題都跑通這份實(shí)驗(yàn)指導(dǎo)的價(jià)值才開始真正兌現(xiàn)。我的做法是為每個(gè)實(shí)驗(yàn)生成一份 Markdown 實(shí)驗(yàn)記錄模板固定為五段實(shí)驗(yàn)名稱與知識(shí)點(diǎn)、我的實(shí)現(xiàn)、運(yùn)行結(jié)果、與參考答案的差異、踩坑復(fù)盤。寫多了你會(huì)發(fā)現(xiàn)「與參考答案的差異」才是你真正的學(xué)習(xí)增量寫不出差異說明你只是復(fù)制了別人的思路。import datetime title 實(shí)驗(yàn)斐波那契數(shù)列 now datetime.date.today() template f# {title} - 日期{now} - 知識(shí)點(diǎn)循環(huán)、同時(shí)賦值 - 狀態(tài)已完成 ## 我的實(shí)現(xiàn) 粘貼你的代碼 ## 運(yùn)行結(jié)果 粘貼輸出 ## 與參考答案的差異 思路差異還是寫法差異 ## 踩坑復(fù)盤 編碼、縮進(jìn)、版本問題各記一次 with open(flab_{now}.md, w, encodingutf-8) as f: f.write(template)生成骨架后每完成一個(gè)實(shí)驗(yàn)就填一次。這份記錄的價(jià)值不在美觀在于三個(gè)月后復(fù)習(xí)時(shí)你能直接看到自己當(dāng)時(shí)卡在哪里、怎么解決的。我現(xiàn)在的習(xí)慣是拿到任何一份實(shí)驗(yàn)指導(dǎo)先用 20 分鐘把答案分布畫出來標(biāo)出「待做」清單再逐題攻破絕不跳過邊界用例。堅(jiān)持完一整份實(shí)驗(yàn)指導(dǎo)之后你手里留下的不只是一堆跑過的答案而是一本屬于你自己的排錯(cuò)手冊這份沉淀比任何現(xiàn)成滿分答案都值錢。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取