




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
計(jì)算機(jī)編程基礎(chǔ)教程歡迎步入編程的精彩世界!本課程旨在為您提供計(jì)算機(jī)編程的全面基礎(chǔ)知識(shí),幫助您掌握解決問題的強(qiáng)大工具。通過系統(tǒng)學(xué)習(xí),您將培養(yǎng)計(jì)算思維能力,掌握編程技巧,為未來的技術(shù)探索和創(chuàng)新奠定堅(jiān)實(shí)基礎(chǔ)。無論您是編程新手還是希望鞏固基礎(chǔ)的學(xué)習(xí)者,這門課程都將帶給您寶貴的知識(shí)和技能。讓我們一起開啟這段編程學(xué)習(xí)之旅,探索代碼世界的無限可能!為什么學(xué)習(xí)編程?提高思維能力編程培養(yǎng)嚴(yán)密的邏輯思維和問題解決能力,這些能力在各個(gè)領(lǐng)域都有廣泛應(yīng)用創(chuàng)造力實(shí)現(xiàn)通過編程可以創(chuàng)建軟件、應(yīng)用程序和游戲,將您的創(chuàng)意轉(zhuǎn)化為現(xiàn)實(shí)職業(yè)發(fā)展IT行業(yè)對(duì)編程人才的需求持續(xù)增長,掌握編程技能可以拓寬就業(yè)渠道提高效率編程可以幫助自動(dòng)化日常任務(wù),節(jié)省時(shí)間和精力,提高工作生產(chǎn)力學(xué)習(xí)編程不僅僅是掌握一門技術(shù),更是培養(yǎng)一種思維方式。通過編程學(xué)習(xí),您將能夠從不同角度分析問題,并找到最優(yōu)解決方案。在數(shù)字化時(shí)代,這種能力顯得尤為重要。編程語言的選擇Python入門首選,簡(jiǎn)潔易學(xué)Java企業(yè)級(jí)應(yīng)用的主流選擇JavaScript網(wǎng)頁開發(fā)必備語言C++性能要求高的應(yīng)用本課程將以Python作為入門語言,因?yàn)樗鼡碛星逦?jiǎn)潔的語法和廣泛的應(yīng)用領(lǐng)域。Python被廣泛應(yīng)用于數(shù)據(jù)科學(xué)、Web開發(fā)、人工智能等多個(gè)領(lǐng)域,是初學(xué)者的理想選擇。盡管我們專注于Python,學(xué)習(xí)一種編程語言后,掌握其他語言將變得更加容易,因?yàn)樗鼈児蚕碓S多基本概念和原則。課程結(jié)構(gòu)概覽基礎(chǔ)知識(shí)數(shù)據(jù)類型、變量、運(yùn)算符等編程基石控制流程條件語句和循環(huán)結(jié)構(gòu)函數(shù)和模塊代碼復(fù)用與組織結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)列表、字典、集合等數(shù)據(jù)組織方式算法與面向?qū)ο笈判?、搜索算法與類、對(duì)象、繼承調(diào)試與高級(jí)主題錯(cuò)誤修復(fù)、文件操作、異常處理我們的課程設(shè)計(jì)遵循循序漸進(jìn)的原則,從最基本的概念開始,逐步深入到更復(fù)雜的主題。每個(gè)部分都會(huì)包含理論講解和實(shí)際案例,幫助您深入理解并鞏固所學(xué)知識(shí)。學(xué)習(xí)資源與工具編程環(huán)境Python解釋器是運(yùn)行Python代碼的基本工具。我們建議您安裝最新版本的Python,它包含了豐富的標(biāo)準(zhǔn)庫和易用的包管理系統(tǒng)。集成開發(fā)環(huán)境(IDE)如PyCharm或VisualStudioCode提供了代碼編輯、調(diào)試和項(xiàng)目管理等功能,能大幅提高編程效率。在線資源互聯(lián)網(wǎng)上有豐富的編程學(xué)習(xí)資源,包括官方文檔、教程、博客和論壇。Python官方文檔提供了詳細(xì)的語言參考,StackOverflow等社區(qū)可以幫助解決編程中遇到的問題。GitHub上的開源項(xiàng)目則是學(xué)習(xí)實(shí)際編程實(shí)踐的寶貴資源。實(shí)踐方法編程是一項(xiàng)實(shí)踐性很強(qiáng)的技能,需要通過不斷的練習(xí)來掌握。我們鼓勵(lì)您積極動(dòng)手編寫代碼,嘗試運(yùn)行和調(diào)試程序。遇到問題時(shí),不要害怕尋求幫助,積極參與討論和提問可以加深理解并拓展思路。選擇合適的工具和資源可以讓您的編程學(xué)習(xí)之旅更加順暢。保持好奇心和探索精神,持續(xù)實(shí)踐是掌握編程技能的關(guān)鍵。數(shù)據(jù)類型:編程的基礎(chǔ)數(shù)據(jù)類型數(shù)據(jù)類型是編程語言中用于識(shí)別、分類和處理數(shù)據(jù)的方式。常見的基本數(shù)據(jù)類型包括數(shù)字(整數(shù)、浮點(diǎn)數(shù))、文本(字符串)和布爾值(真/假)。不同類型的數(shù)據(jù)支持不同的操作和有不同的存儲(chǔ)需求。變量變量是存儲(chǔ)數(shù)據(jù)的容器,它們讓我們能夠給數(shù)據(jù)命名,以便后續(xù)在程序中引用。變量可以存儲(chǔ)不同類型的數(shù)據(jù),在Python中,變量的類型會(huì)根據(jù)存儲(chǔ)的值自動(dòng)確定。運(yùn)算符與表達(dá)式運(yùn)算符用于執(zhí)行運(yùn)算和比較操作,表達(dá)式則是由變量、運(yùn)算符和函數(shù)調(diào)用組成的代碼片段,它們會(huì)產(chǎn)生一個(gè)值。通過賦值語句,我們可以將表達(dá)式的結(jié)果存儲(chǔ)到變量中。理解數(shù)據(jù)類型是編程的基礎(chǔ),它們決定了數(shù)據(jù)如何被存儲(chǔ)、處理和顯示。在Python中,數(shù)據(jù)類型系統(tǒng)相對(duì)簡(jiǎn)單靈活,這有助于初學(xué)者快速上手,同時(shí)也為高級(jí)應(yīng)用提供了足夠的靈活性。數(shù)字類型:整數(shù)和浮點(diǎn)數(shù)整數(shù)(int)整數(shù)是沒有小數(shù)部分的數(shù)字,例如:-5,0,42。在Python中,整數(shù)可以是任意大小,只受限于可用內(nèi)存。#整數(shù)示例a=10b=-3c=a+b#7d=a*b#-30浮點(diǎn)數(shù)(float)浮點(diǎn)數(shù)是有小數(shù)部分的數(shù)字,例如:3.14,-0.001,2.0。浮點(diǎn)數(shù)在計(jì)算機(jī)中的表示有一定精度限制。#浮點(diǎn)數(shù)示例x=3.14y=2.0z=x*y#6.28w=x/y#1.57Python提供了豐富的數(shù)字運(yùn)算操作,包括基本的算術(shù)運(yùn)算(加、減、乘、除)以及更高級(jí)的操作如冪運(yùn)算(**)和取模運(yùn)算(%)。例如,5**2表示5的平方,等于25;7%3表示7除以3的余數(shù),等于1。數(shù)字類型之間可以進(jìn)行轉(zhuǎn)換,例如int(3.14)將浮點(diǎn)數(shù)轉(zhuǎn)換為整數(shù)3,而float(5)將整數(shù)轉(zhuǎn)換為浮點(diǎn)數(shù)5.0。這種類型轉(zhuǎn)換在處理用戶輸入或數(shù)據(jù)處理時(shí)非常有用。文本類型:字符串字符串定義使用單引號(hào)或雙引號(hào)創(chuàng)建字符串連接使用+運(yùn)算符組合字符串字符串格式化使用%或.format()插入值字符串方法upper(),lower(),strip()等字符串(str)是Python中用于表示文本數(shù)據(jù)的類型。它們可以包含字母、數(shù)字、符號(hào)和空格。字符串是不可變的,這意味著一旦創(chuàng)建,就不能更改其內(nèi)容,但可以創(chuàng)建新的字符串。字符串索引允許我們?cè)L問字符串中的單個(gè)字符,例如"hello"[1]返回'e'。字符串切片則讓我們能夠提取子字符串,例如"hello"[1:4]返回'ell'。Python還提供了許多內(nèi)置的字符串方法,如upper()(轉(zhuǎn)大寫)、lower()(轉(zhuǎn)小寫)和strip()(去除首尾空格),使文本處理變得簡(jiǎn)單高效。布爾類型:True和False布爾值表示真(True)或假(False)比較運(yùn)算符==,!=,>,<,>=,<=邏輯運(yùn)算符and,or,not條件語句控制程序執(zhí)行流程布爾值(bool)是Python中最簡(jiǎn)單的數(shù)據(jù)類型,只有兩個(gè)可能的值:True和False。盡管簡(jiǎn)單,布爾值在編程中卻扮演著至關(guān)重要的角色,它們是條件邏輯和決策的基礎(chǔ)。比較運(yùn)算符如等于(==)、不等于(!=)、大于(>)和小于(<)等會(huì)產(chǎn)生布爾值結(jié)果。邏輯運(yùn)算符允許我們組合多個(gè)布爾表達(dá)式:and(兩者都為真才返回真)、or(至少一個(gè)為真就返回真)和not(取反)。這些運(yùn)算符使我們能夠構(gòu)建復(fù)雜的條件判斷,為程序的流程控制提供基礎(chǔ)。變量和賦值變量命名選擇有意義的標(biāo)識(shí)符賦值操作將數(shù)據(jù)存儲(chǔ)到變量中類型判斷Python自動(dòng)確定變量類型變量是編程中最基本的概念之一,它們?cè)试S我們存儲(chǔ)和操作數(shù)據(jù)。在Python中,創(chuàng)建變量非常簡(jiǎn)單,只需使用賦值語句將值賦給一個(gè)標(biāo)識(shí)符。例如,x=10創(chuàng)建了一個(gè)名為x的變量,其值為整數(shù)10。Python是一種動(dòng)態(tài)類型語言,這意味著變量的類型由存儲(chǔ)的值決定,而不需要顯式聲明。例如,如果我們將x的值改為"hello",x將從整數(shù)類型變?yōu)樽址愋汀_@種靈活性使Python編程變得簡(jiǎn)單直觀,特別適合初學(xué)者。選擇好的變量名非常重要。變量名應(yīng)該清晰描述其用途,遵循Python的命名規(guī)范(小寫字母,下劃線分隔單詞),并避免使用Python的關(guān)鍵字。良好的命名習(xí)慣可以大大提高代碼的可讀性和可維護(hù)性??刂屏鞒蹋撼绦驁?zhí)行的順序順序執(zhí)行默認(rèn)情況下,程序按照代碼的編寫順序從上到下執(zhí)行。這是最簡(jiǎn)單的控制流程,適用于簡(jiǎn)單的、線性的任務(wù)。條件執(zhí)行使用if,elif,else語句,程序可以根據(jù)條件選擇執(zhí)行不同的代碼塊。這使程序能夠做出決策,根據(jù)不同情況采取不同行動(dòng)。循環(huán)執(zhí)行使用for和while循環(huán),程序可以重復(fù)執(zhí)行特定的代碼塊。循環(huán)中可以使用break終止整個(gè)循環(huán),或使用continue跳過當(dāng)前迭代。控制流程是程序執(zhí)行路徑的導(dǎo)航系統(tǒng),它決定了代碼的執(zhí)行順序。通過靈活使用條件語句和循環(huán),我們可以創(chuàng)建能夠響應(yīng)不同輸入和狀態(tài)的動(dòng)態(tài)程序。在Python中,代碼塊通過縮進(jìn)來標(biāo)識(shí),通常是4個(gè)空格。這種基于縮進(jìn)的語法強(qiáng)制了清晰的代碼結(jié)構(gòu),有助于提高代碼的可讀性,但也要求程序員保持一致的縮進(jìn)風(fēng)格。條件語句:if,elif,else基本語法結(jié)構(gòu)if條件1:#如果條件1為真,執(zhí)行這里的代碼elif條件2:#如果條件1為假且條件2為真,執(zhí)行這里else:#如果所有條件都為假,執(zhí)行這里條件語句可以根據(jù)條件的真假選擇性地執(zhí)行代碼塊,使程序能夠做出決策。實(shí)際應(yīng)用示例score=85ifscore>=90:grade="優(yōu)秀"elifscore>=80:grade="良好"elifscore>=70:grade="中等"elifscore>=60:grade="及格"else:grade="不及格"print(f"你的成績(jī)等級(jí)是:{grade}")在這個(gè)例子中,程序根據(jù)分?jǐn)?shù)確定對(duì)應(yīng)的成績(jī)等級(jí),并輸出結(jié)果。條件語句是程序?qū)崿F(xiàn)判斷邏輯的基礎(chǔ)。通過使用if、elif和else關(guān)鍵字,我們可以創(chuàng)建不同的執(zhí)行路徑,使程序能夠根據(jù)不同的條件做出不同的反應(yīng)。條件語句可以嵌套使用,創(chuàng)建更復(fù)雜的決策樹。但過度嵌套會(huì)使代碼難以理解和維護(hù),因此應(yīng)盡量保持條件邏輯的清晰和簡(jiǎn)潔。合理使用布爾表達(dá)式和邏輯運(yùn)算符可以減少嵌套層次,提高代碼可讀性。循環(huán):重復(fù)執(zhí)行代碼塊for循環(huán)#遍歷列表fruits=["蘋果","香蕉","橙子"]forfruitinfruits:print(f"我喜歡吃{fruit}")#遍歷范圍foriinrange(5):print(i)#輸出0到4for循環(huán)用于遍歷序列(如列表、字符串、范圍等),對(duì)每個(gè)元素執(zhí)行相同的操作。while循環(huán)#計(jì)數(shù)示例count=0whilecount<5:print(count)count+=1#等同于count=count+1#條件控制answer=""whileanswer!="退出":answer=input("請(qǐng)輸入命令(輸入'退出'結(jié)束):")print(f"你輸入了:{answer}")while循環(huán)在條件為真時(shí)重復(fù)執(zhí)行代碼塊,直到條件變?yōu)榧佟MǔP枰谘h(huán)內(nèi)修改條件相關(guān)的變量,否則可能導(dǎo)致無限循環(huán)。循環(huán)是編程中最強(qiáng)大的工具之一,它使我們能夠用簡(jiǎn)潔的代碼處理大量數(shù)據(jù)或重復(fù)執(zhí)行任務(wù)。掌握循環(huán)結(jié)構(gòu)對(duì)于解決各種編程問題至關(guān)重要。嵌套循環(huán)(循環(huán)內(nèi)的循環(huán))可以用來處理多維數(shù)據(jù)結(jié)構(gòu)或生成復(fù)雜模式。例如,使用嵌套循環(huán)可以打印乘法表或遍歷矩陣數(shù)據(jù)。但要注意,嵌套循環(huán)的執(zhí)行次數(shù)是內(nèi)外層循環(huán)次數(shù)的乘積,可能導(dǎo)致性能問題。循環(huán)控制:break和continue循環(huán)執(zhí)行代碼塊重復(fù)執(zhí)行,處理多個(gè)元素break語句立即終止循環(huán),跳出循環(huán)結(jié)構(gòu)continue語句跳過當(dāng)前迭代,繼續(xù)下一次循環(huán)性能優(yōu)化適當(dāng)使用可提高程序效率循環(huán)控制語句讓我們能夠更精細(xì)地控制循環(huán)的行為。break語句用于在滿足特定條件時(shí)立即退出循環(huán),而continue語句則用于跳過當(dāng)前迭代中剩余的代碼,直接進(jìn)入下一次迭代。在實(shí)際應(yīng)用中,break常用于查找問題的解決方案后立即停止搜索,例如在列表中找到第一個(gè)符合條件的元素后終止循環(huán);continue則常用于跳過不需要處理的元素,例如在處理列表時(shí)忽略特定類型的元素。合理使用這些控制語句可以使代碼更高效、更清晰。綜合示例:猜數(shù)字游戲游戲設(shè)計(jì)在這個(gè)猜數(shù)字游戲中,程序會(huì)隨機(jī)生成一個(gè)1到100之間的整數(shù),玩家需要通過多次猜測(cè)找出這個(gè)數(shù)字。每次猜測(cè)后,程序會(huì)給出提示:猜大了、猜小了或猜對(duì)了。游戲還會(huì)記錄玩家猜測(cè)的次數(shù)。代碼實(shí)現(xiàn)importrandom#生成1-100之間的隨機(jī)數(shù)target=random.randint(1,100)count=0#記錄猜測(cè)次數(shù)print("我想了一個(gè)1到100之間的數(shù),請(qǐng)你猜一猜!")whileTrue:count+=1guess=int(input("請(qǐng)輸入你的猜測(cè):"))
ifguess<target:print("猜小了,再試試!")elifguess>target:print("猜大了,再試試!")else:print(f"恭喜你,猜對(duì)了!答案就是{target}")print(f"你總共猜了{(lán)count}次")break知識(shí)點(diǎn)應(yīng)用這個(gè)示例綜合應(yīng)用了變量、輸入輸出、條件判斷、循環(huán)和循環(huán)控制等知識(shí)點(diǎn)。通過這個(gè)簡(jiǎn)單而有趣的游戲,可以鞏固前面學(xué)習(xí)的編程基礎(chǔ)知識(shí)。這個(gè)猜數(shù)字游戲是一個(gè)很好的編程練習(xí),它不僅鞏固了基礎(chǔ)語法知識(shí),還引入了random模塊的使用,展示了如何利用外部庫擴(kuò)展Python的功能。游戲雖然簡(jiǎn)單,但包含了程序設(shè)計(jì)的核心元素:輸入處理、條件判斷、循環(huán)控制和結(jié)果輸出。函數(shù):代碼重用和模塊化函數(shù)的作用函數(shù)是執(zhí)行特定任務(wù)的代碼塊,它可以接收輸入(參數(shù)),執(zhí)行一系列操作,并返回結(jié)果。函數(shù)的主要目的是提高代碼的可重用性和模塊化,使程序結(jié)構(gòu)更清晰,維護(hù)更容易。函數(shù)的組成函數(shù)主要由四部分組成:函數(shù)名(用于調(diào)用函數(shù))、參數(shù)列表(接收輸入值)、函數(shù)體(執(zhí)行具體操作的代碼)和返回值(函數(shù)處理后的結(jié)果)。這些元素共同構(gòu)成了函數(shù)的完整結(jié)構(gòu)。函數(shù)的優(yōu)勢(shì)使用函數(shù)可以避免代碼重復(fù),提高代碼的可讀性和可維護(hù)性。函數(shù)可以將復(fù)雜的問題分解為更小、更容易管理的部分,這是程序設(shè)計(jì)中"分而治之"思想的體現(xiàn)。函數(shù)是編程中組織和管理代碼的重要方式,它讓我們能夠?qū)⒐δ芟嗨频拇a集中在一起,形成獨(dú)立的單元。通過函數(shù),我們可以在不同的程序部分多次使用相同的功能,而不需要重復(fù)編寫代碼。在大型程序中,函數(shù)變得尤為重要。它們?cè)试S多人協(xié)作開發(fā),每個(gè)人負(fù)責(zé)不同的功能模塊。函數(shù)還有助于調(diào)試,因?yàn)槲覀兛梢詥为?dú)測(cè)試每個(gè)函數(shù)的功能,確保其正確性。函數(shù)的定義和調(diào)用函數(shù)定義語法def函數(shù)名(參數(shù)1,參數(shù)2,...):"""函數(shù)的文檔字符串(可選)"""#函數(shù)體#執(zhí)行具體操作return返回值#可選函數(shù)定義以def關(guān)鍵字開始,后跟函數(shù)名和括號(hào)中的參數(shù)列表。函數(shù)體通過縮進(jìn)表示,可以包含多行代碼。返回值通過return語句指定。函數(shù)調(diào)用示例#定義一個(gè)計(jì)算平方的函數(shù)defcalculate_square(number):"""返回輸入數(shù)字的平方"""square=number*numberreturnsquare#調(diào)用函數(shù)result=calculate_square(5)print(result)#輸出:25#另一種調(diào)用方式print(calculate_square(4))#輸出:16函數(shù)調(diào)用通過函數(shù)名和括號(hào)中的參數(shù)完成。調(diào)用時(shí)傳入的值(如5)會(huì)傳遞給函數(shù)定義中的參數(shù)(number)。函數(shù)的返回值可以直接使用或存儲(chǔ)到變量中。函數(shù)定義是告訴Python如何執(zhí)行特定任務(wù)的藍(lán)圖,而函數(shù)調(diào)用則是實(shí)際使用這個(gè)藍(lán)圖執(zhí)行任務(wù)。通過分離定義和調(diào)用,我們可以在需要時(shí)多次重用相同的功能,而無需重復(fù)編寫代碼。文檔字符串(docstring)是Python的一個(gè)特性,用于說明函數(shù)的用途和使用方法。雖然可選,但良好的文檔是代碼可維護(hù)性的重要組成部分,特別是在團(tuán)隊(duì)協(xié)作或開發(fā)復(fù)雜系統(tǒng)時(shí)。參數(shù)和返回值形式參數(shù)函數(shù)定義中的變量名實(shí)際參數(shù)函數(shù)調(diào)用時(shí)的具體值默認(rèn)參數(shù)預(yù)設(shè)的參數(shù)值關(guān)鍵字參數(shù)通過名稱指定的參數(shù)返回值函數(shù)執(zhí)行結(jié)果參數(shù)是函數(shù)從外部接收數(shù)據(jù)的方式,使函數(shù)能夠處理不同的輸入。形式參數(shù)是函數(shù)定義中的變量名,而實(shí)際參數(shù)是調(diào)用函數(shù)時(shí)傳遞的具體值。Python提供了多種參數(shù)類型,包括默認(rèn)參數(shù)(定義函數(shù)時(shí)指定默認(rèn)值)和關(guān)鍵字參數(shù)(調(diào)用時(shí)通過參數(shù)名指定值)。返回值是函數(shù)向調(diào)用者返回結(jié)果的方式。通過return語句,函數(shù)可以返回單個(gè)值、多個(gè)值(以元組形式)或不返回任何值(隱式返回None)。返回值使函數(shù)能夠?qū)⑻幚斫Y(jié)果傳遞給其他部分的代碼,增強(qiáng)了函數(shù)的靈活性和實(shí)用性。作用域:變量的可見性全局作用域整個(gè)程序中可訪問的變量局部作用域僅在函數(shù)內(nèi)部可訪問的變量作用域規(guī)則變量查找的規(guī)則和優(yōu)先級(jí)作用域決定了變量在程序中的可見性和生命周期。Python中主要有兩種作用域:全局作用域(在整個(gè)程序文件中可訪問)和局部作用域(僅在函數(shù)內(nèi)部可訪問)。這種分離有助于防止函數(shù)內(nèi)部的變量意外影響程序的其他部分。當(dāng)在函數(shù)內(nèi)部引用變量時(shí),Python會(huì)按照LEGB規(guī)則查找變量:首先在局部作用域(Local)查找,然后是外層函數(shù)作用域(Enclosing),然后是全局作用域(Global),最后是內(nèi)置作用域(Built-in)。如果需要在函數(shù)內(nèi)部修改全局變量,可以使用global關(guān)鍵字。雖然可以使用全局變量,但一般建議避免過度依賴全局變量,因?yàn)樗鼈兛赡軐?dǎo)致代碼難以理解和維護(hù)。更好的做法是通過參數(shù)傳遞數(shù)據(jù),通過返回值獲取結(jié)果。模塊:代碼的組織和重用模塊概念模塊是包含Python代碼的文件,通常以.py為擴(kuò)展名。它可以定義函數(shù)、類和變量,可以包含可執(zhí)行代碼。模塊化是組織大型程序的關(guān)鍵方式,它將相關(guān)功能分組,使代碼更容易管理和維護(hù)。導(dǎo)入方式Python提供多種導(dǎo)入模塊的方式。最基本的是使用import語句,如"importmath"。我們還可以導(dǎo)入特定的函數(shù)或變量,如"frommathimportsqrt",或使用別名簡(jiǎn)化長名稱,如"importmatplotlib.pyplotasplt"。標(biāo)準(zhǔn)庫Python的標(biāo)準(zhǔn)庫是Python安裝時(shí)自帶的模塊集合,涵蓋了文件I/O、系統(tǒng)操作、數(shù)學(xué)計(jì)算、網(wǎng)絡(luò)通信等多個(gè)領(lǐng)域。例如,math模塊提供數(shù)學(xué)函數(shù),random模塊生成隨機(jī)數(shù),datetime模塊處理日期和時(shí)間。模塊是Python代碼復(fù)用的重要機(jī)制,它使我們能夠利用他人開發(fā)的功能,避免"重新發(fā)明輪子"。Python擁有豐富的模塊生態(tài)系統(tǒng),包括標(biāo)準(zhǔn)庫和第三方庫,幾乎可以滿足任何編程需求。通過理解和使用模塊,我們可以大大提高編程效率和代碼質(zhì)量。數(shù)據(jù)結(jié)構(gòu):組織和存儲(chǔ)數(shù)據(jù)列表有序、可變的元素集合使用方括號(hào)[]定義可以包含不同類型的元素支持增刪改查操作元組有序、不可變的元素集合使用圓括號(hào)()定義創(chuàng)建后不能修改可以作為字典的鍵使用字典鍵值對(duì)的無序集合使用花括號(hào){}定義通過鍵快速訪問值鍵必須是不可變類型集合無序、不重復(fù)元素的集合使用花括號(hào){}或set()定義自動(dòng)去除重復(fù)元素支持集合運(yùn)算(并、交、差)數(shù)據(jù)結(jié)構(gòu)是組織和存儲(chǔ)數(shù)據(jù)的方式,不同的數(shù)據(jù)結(jié)構(gòu)適用于不同的場(chǎng)景。選擇合適的數(shù)據(jù)結(jié)構(gòu)可以極大地提高程序的效率和可讀性。Python內(nèi)置了多種功能強(qiáng)大的數(shù)據(jù)結(jié)構(gòu),讓我們能夠高效地處理各種類型的數(shù)據(jù)。列表:有序、可變序列列表基礎(chǔ)操作#創(chuàng)建列表fruits=["蘋果","香蕉","橙子"]#訪問元素first_fruit=fruits[0]#蘋果last_fruit=fruits[-1]#橙子#修改元素fruits[1]="葡萄"#替換香蕉為葡萄#切片操作subset=fruits[0:2]#["蘋果","葡萄"]#列表長度length=len(fruits)#3列表方法#添加元素fruits.append("梨")#在末尾添加fruits.insert(1,"芒果")#在指定位置插入#刪除元素fruits.remove("蘋果")#刪除特定元素popped=fruits.pop()#刪除并返回最后一個(gè)元素delfruits[0]#刪除指定位置的元素#其他操作fruits.sort()#排序fruits.reverse()#反轉(zhuǎn)count=fruits.count("葡萄")#計(jì)數(shù)列表是Python中最常用的數(shù)據(jù)結(jié)構(gòu)之一,它是有序的元素集合,可以包含任意類型的數(shù)據(jù),包括其他列表(嵌套列表)。列表的靈活性使其適用于各種場(chǎng)景,如存儲(chǔ)集合數(shù)據(jù)、實(shí)現(xiàn)隊(duì)列和棧、表示多維數(shù)據(jù)等。Python提供了豐富的列表操作和方法,使我們能夠高效地處理列表數(shù)據(jù)。列表推導(dǎo)式(ListComprehension)是Python的強(qiáng)大特性,它提供了創(chuàng)建列表的簡(jiǎn)潔語法,例如:[x**2forxinrange(10)ifx%2==0]創(chuàng)建了一個(gè)包含0到9中偶數(shù)平方的列表。元組:有序、不可變序列元組的創(chuàng)建#創(chuàng)建元組colors=("紅","綠","藍(lán)")single_item=("紅",)#注意逗號(hào)#解包元組r,g,b=colors元組使用圓括號(hào)()創(chuàng)建,元素之間用逗號(hào)分隔。單元素元組需要添加逗號(hào)以區(qū)別于普通括號(hào)表達(dá)式。元組的操作#訪問元素first=colors[0]#紅last=colors[-1]#藍(lán)#切片subset=colors[0:2]#("紅","綠")#連接元組more_colors=colors+("黃","紫")元組支持索引、切片和連接操作,但不支持修改元素的操作,因?yàn)樵M是不可變的。元組的應(yīng)用#作為字典鍵point=(3,4)distances={point:5}#函數(shù)返回多個(gè)值defget_dimensions():return(1024,768)width,height=get_dimensions()元組常用于表示不應(yīng)該被修改的數(shù)據(jù),如坐標(biāo)點(diǎn)、RGB顏色值等。函數(shù)返回多個(gè)值時(shí)也使用元組形式。元組與列表類似,都是有序的元素集合,但元組創(chuàng)建后不能修改(不可變)。這種不可變性使元組在某些場(chǎng)景中比列表更適用,特別是當(dāng)數(shù)據(jù)應(yīng)該保持不變時(shí),如函數(shù)返回多個(gè)值或作為字典的鍵。由于不可變性,元組通常比列表更加高效,特別是在處理大量數(shù)據(jù)時(shí)。在多線程環(huán)境中,元組的不可變性也提供了額外的安全性,防止數(shù)據(jù)被意外修改。字典:鍵值對(duì)的集合創(chuàng)建字典使用花括號(hào){}或dict()構(gòu)造函數(shù)訪問和修改通過鍵訪問、添加或修改值遍歷字典遍歷鍵、值或鍵值對(duì)常用方法get(),keys(),values(),items()字典是Python中的鍵值存儲(chǔ)結(jié)構(gòu),允許通過鍵快速查找值。字典中的鍵必須是不可變類型(如字符串、數(shù)字或元組),而值可以是任何類型。字典是無序的,但Python3.7及以上版本會(huì)保持插入順序。#創(chuàng)建字典student={"name":"張三","age":20,"major":"計(jì)算機(jī)科學(xué)"}#訪問值name=student["name"]#張三#安全訪問(鍵不存在時(shí)返回默認(rèn)值)grade=student.get("grade","未知")#未知#添加或修改鍵值對(duì)student["grade"]="A"student["age"]=21#刪除鍵值對(duì)delstudent["major"]removed=student.pop("grade")#刪除并返回值#遍歷字典forkeyinstudent:print(key,student[key])forkey,valueinstudent.items():print(key,value)字典是處理結(jié)構(gòu)化數(shù)據(jù)的強(qiáng)大工具,廣泛應(yīng)用于配置管理、數(shù)據(jù)處理和緩存等場(chǎng)景。Python字典的實(shí)現(xiàn)基于哈希表,提供了近乎常數(shù)時(shí)間的查找性能,使其成為高效存儲(chǔ)和檢索數(shù)據(jù)的理想選擇。集合:無序、不重復(fù)元素的集合特點(diǎn)和創(chuàng)建集合是無序的、不重復(fù)元素的集合,使用花括號(hào){}或set()函數(shù)創(chuàng)建。集合元素必須是不可變類型(如字符串、數(shù)字或元組)。集合操作集合支持各種數(shù)學(xué)集合操作,如并集(|)、交集(&)、差集(-)和對(duì)稱差集(^),非常適合進(jìn)行數(shù)據(jù)比較和過濾。集合方法常用方法包括add()添加元素、remove()和discard()刪除元素、clear()清空集合等。discard()和remove()的區(qū)別在于元素不存在時(shí)前者不報(bào)錯(cuò)。應(yīng)用場(chǎng)景集合常用于去除重復(fù)元素、成員關(guān)系測(cè)試(檢查元素是否存在)和數(shù)學(xué)集合運(yùn)算(如查找兩個(gè)集合的共同元素)。#創(chuàng)建集合fruits={"蘋果","香蕉","橙子","蘋果"}#重復(fù)元素會(huì)被自動(dòng)去除print(fruits)#{'香蕉','橙子','蘋果'}#添加和刪除元素fruits.add("葡萄")fruits.remove("香蕉")#元素不存在會(huì)報(bào)錯(cuò)fruits.discard("梨")#元素不存在不會(huì)報(bào)錯(cuò)#集合運(yùn)算a={1,2,3,4}b={3,4,5,6}print(a|b)#并集:{1,2,3,4,5,6}print(a&b)#交集:{3,4}print(a-b)#差集:{1,2}print(a^b)#對(duì)稱差集:{1,2,5,6}集合的主要優(yōu)勢(shì)在于高效的成員檢測(cè)和去重能力。在處理大量數(shù)據(jù)時(shí),使用集合進(jìn)行成員檢測(cè)比使用列表更快,因?yàn)榧鲜褂霉1韺?shí)現(xiàn),查找效率接近O(1)。算法:解決問題的步驟算法定義解決問題的明確步驟序列2算法分析評(píng)估時(shí)間和空間復(fù)雜度常見算法排序、搜索、圖遍歷等算法是解決特定問題的一系列明確步驟,好的算法應(yīng)該是正確的、高效的、通用的。在計(jì)算機(jī)科學(xué)中,算法效率通常通過時(shí)間復(fù)雜度(執(zhí)行所需的操作數(shù))和空間復(fù)雜度(所需的存儲(chǔ)空間)來衡量。常見的時(shí)間復(fù)雜度包括:O(1)常數(shù)時(shí)間、O(logn)對(duì)數(shù)時(shí)間、O(n)線性時(shí)間、O(nlogn)線性對(duì)數(shù)時(shí)間、O(n2)平方時(shí)間等。隨著輸入規(guī)模的增加,不同復(fù)雜度的算法性能差異會(huì)變得顯著。編程中常用的算法包括排序算法(如冒泡排序、快速排序)、搜索算法(如線性搜索、二分搜索)、圖算法(如廣度優(yōu)先搜索、深度優(yōu)先搜索)等。掌握這些基本算法及其適用場(chǎng)景,對(duì)于高效解決編程問題至關(guān)重要。排序算法:冒泡排序冒泡排序原理冒泡排序是一種簡(jiǎn)單的排序算法,它重復(fù)地遍歷要排序的列表,比較相鄰的兩個(gè)元素,如果它們的順序錯(cuò)誤就交換它們。遍歷列表的工作是重復(fù)進(jìn)行的,直到?jīng)]有再需要交換的元素,這意味著列表已經(jīng)排序完成。冒泡排序?qū)崿F(xiàn)defbubble_sort(arr):n=len(arr)
#遍歷所有數(shù)組元素foriinrange(n):#標(biāo)記此輪遍歷是否發(fā)生交換swapped=False
#最后i個(gè)元素已經(jīng)就位forjinrange(0,n-i-1):#如果當(dāng)前元素大于下一個(gè)元素,交換它們ifarr[j]>arr[j+1]:arr[j],arr[j+1]=arr[j+1],arr[j]swapped=True
#如果沒有發(fā)生交換,數(shù)組已經(jīng)有序ifnotswapped:break
returnarr時(shí)間復(fù)雜度分析冒泡排序的平均和最壞時(shí)間復(fù)雜度為O(n2),最好情況為O(n)(當(dāng)列表已經(jīng)排序時(shí))。雖然算法簡(jiǎn)單,但對(duì)于大型數(shù)據(jù)集效率較低,主要用于教學(xué)目的或小規(guī)模數(shù)據(jù)排序。冒泡排序的名稱來源于較小的元素會(huì)像氣泡一樣"浮"到列表的頂端。盡管它不是最高效的排序算法,但它的實(shí)現(xiàn)簡(jiǎn)單直觀,適合初學(xué)者理解排序算法的基本概念。在實(shí)際應(yīng)用中,Python內(nèi)置的sort()方法和sorted()函數(shù)使用了更高效的算法(Timsort,一種混合排序算法),它們?cè)趲缀跛星闆r下都比冒泡排序更快、更高效。排序算法:快速排序選擇基準(zhǔn)元素從列表中選擇一個(gè)元素作為"基準(zhǔn)"分區(qū)操作將小于基準(zhǔn)的元素放在左邊,大于基準(zhǔn)的放在右邊遞歸排序?qū)ψ笥覂蓚€(gè)子列表分別進(jìn)行快速排序合并結(jié)果左子列表+基準(zhǔn)元素+右子列表defquick_sort(arr):iflen(arr)<=1:returnarr
#選擇基準(zhǔn)元素pivot=arr[len(arr)//2]
#分區(qū)left=[xforxinarrifx<pivot]middle=[xforxinarrifx==pivot]right=[xforxinarrifx>pivot]
#遞歸排序并合并結(jié)果returnquick_sort(left)+middle+quick_sort(right)#使用示例numbers=[3,6,8,10,1,2,1]sorted_numbers=quick_sort(numbers)print(sorted_numbers)#[1,1,2,3,6,8,10]快速排序是一種高效的排序算法,采用分治策略,平均時(shí)間復(fù)雜度為O(nlogn)。在實(shí)際應(yīng)用中,快速排序通常比其他O(nlogn)排序算法(如歸并排序)更快,因?yàn)樗膬?nèi)部循環(huán)可以在大多數(shù)架構(gòu)上高效實(shí)現(xiàn)。然而,快速排序的最壞時(shí)間復(fù)雜度為O(n2),這種情況發(fā)生在選擇的基準(zhǔn)元素總是最小或最大元素時(shí)。為避免這種情況,可以使用隨機(jī)選擇基準(zhǔn)元素或三數(shù)取中法等優(yōu)化技術(shù)。搜索算法:線性搜索線性搜索原理線性搜索(也稱順序搜索)是最簡(jiǎn)單的搜索算法,它從列表的第一個(gè)元素開始,逐個(gè)檢查每個(gè)元素,直到找到目標(biāo)元素或遍歷完整個(gè)列表。線性搜索適用于任何列表,無論是否排序。時(shí)間復(fù)雜度:O(n)空間復(fù)雜度:O(1)優(yōu)點(diǎn):簡(jiǎn)單,適用于小列表或未排序列表缺點(diǎn):對(duì)于大列表效率低線性搜索實(shí)現(xiàn)deflinear_search(arr,target):"""在列表中線性搜索目標(biāo)元素返回元素索引或-1(如果未找到)"""foriinrange(len(arr)):ifarr[i]==target:returni#找到目標(biāo),返回索引
return-1#未找到目標(biāo)#使用示例numbers=[5,2,9,1,5,6]result=linear_search(numbers,9)print(result)#輸出:2線性搜索是最直觀的搜索方法,適用于各種場(chǎng)景,特別是對(duì)于小型數(shù)據(jù)集或無序列表。它的實(shí)現(xiàn)簡(jiǎn)單,不需要列表預(yù)先排序,但隨著列表大小增加,效率顯著下降。在實(shí)際應(yīng)用中,Python的in運(yùn)算符和index()方法內(nèi)部使用類似線性搜索的方法。例如,5innumbers檢查5是否在列表中,numbers.index(9)返回9的索引。對(duì)于大型有序數(shù)據(jù),二分搜索等更高效的算法是更好的選擇。搜索算法:二分搜索1前提條件列表必須是有序的查找中間元素計(jì)算中間位置,比較目標(biāo)值縮小搜索范圍目標(biāo)小于中間值搜左側(cè),大于則搜右側(cè)重復(fù)過程在縮小的范圍內(nèi)繼續(xù)查找返回結(jié)果找到目標(biāo)返回索引,否則返回-1defbinary_search(arr,target):"""在有序列表中二分搜索目標(biāo)元素返回元素索引或-1(如果未找到)"""left=0right=len(arr)-1
whileleft<=right:mid=(left+right)//2
#檢查中間元素ifarr[mid]==target:returnmid
#如果目標(biāo)在左半部分elifarr[mid]>target:right=mid-1
#如果目標(biāo)在右半部分else:left=mid+1
return-1#未找到目標(biāo)#使用示例sorted_numbers=[1,3,5,7,9,11,13,15]result=binary_search(sorted_numbers,7)print(result)#輸出:3二分搜索是一種高效的算法,時(shí)間復(fù)雜度為O(logn),這意味著即使對(duì)于大型列表,它也能快速找到目標(biāo)。二分搜索的核心思想是每次都將搜索空間減半,這比線性搜索的逐個(gè)檢查效率高得多。二分搜索的主要限制是它只適用于已排序的列表。如果列表未排序,需要先進(jìn)行排序(通常為O(nlogn)),這可能抵消二分搜索的效率優(yōu)勢(shì)。在Python中,bisect模塊提供了二分查找的功能,可用于在有序列表中插入元素并保持列表有序。面向?qū)ο缶幊蹋侯惡蛯?duì)象類類是對(duì)象的藍(lán)圖或模板,定義了一類對(duì)象的屬性和行為。類封裝了數(shù)據(jù)(屬性)和操作數(shù)據(jù)的方法,提供了一種組織和結(jié)構(gòu)化代碼的方式。對(duì)象對(duì)象是類的實(shí)例,代表了類定義的具體實(shí)體。每個(gè)對(duì)象都有自己的狀態(tài)(屬性值)和行為(方法),但共享類定義的結(jié)構(gòu)。屬性屬性是對(duì)象的特征或狀態(tài),在類中定義為變量。對(duì)象可以有數(shù)據(jù)屬性(存儲(chǔ)數(shù)據(jù)的變量)和方法屬性(定義對(duì)象行為的函數(shù))。方法方法是定義在類中的函數(shù),描述了對(duì)象可以執(zhí)行的操作。方法可以訪問和修改對(duì)象的屬性,定義對(duì)象與外部世界的交互方式。面向?qū)ο缶幊蹋∣OP)是一種編程范式,它使用"對(duì)象"的概念來組織和構(gòu)建程序。與傳統(tǒng)的過程式編程相比,OOP更注重?cái)?shù)據(jù)和行為的封裝,更接近人類思考問題的方式。Python是一種多范式編程語言,完全支持面向?qū)ο缶幊?。在Python中,幾乎所有東西都是對(duì)象,包括整數(shù)、字符串和函數(shù)。通過定義自己的類,我們可以創(chuàng)建自定義對(duì)象類型,擴(kuò)展語言的能力,使代碼更加模塊化、可重用和易于維護(hù)。類的定義和對(duì)象的創(chuàng)建類的定義classPerson:"""人物類,表示一個(gè)人的基本信息"""
#類變量(所有實(shí)例共享)species="人類"
#初始化方法(構(gòu)造函數(shù))def__init__(self,name,age):#實(shí)例變量(每個(gè)實(shí)例獨(dú)有)=nameself.age=age
#實(shí)例方法defsay_hello(self):print(f"你好,我是{},今年{self.age}歲")
#實(shí)例方法defhave_birthday(self):self.age+=1print(f"{}又長一歲,現(xiàn)在{self.age}歲了")對(duì)象的創(chuàng)建和使用#創(chuàng)建Person類的實(shí)例person1=Person("張三",25)person2=Person("李四",30)#訪問實(shí)例變量print()#輸出:張三print(person2.age)#輸出:30#訪問類變量print(person1.species)#輸出:人類print(Person.species)#輸出:人類#調(diào)用實(shí)例方法person1.say_hello()#輸出:你好,我是張三,今年25歲person2.have_birthday()#輸出:李四又長一歲,現(xiàn)在31歲了在Python中,使用class關(guān)鍵字定義類,類名通常采用駝峰命名法(如PersonClass)。__init__方法是一個(gè)特殊的方法,當(dāng)創(chuàng)建類的新實(shí)例時(shí)自動(dòng)調(diào)用,用于初始化對(duì)象的屬性。self參數(shù)指向?qū)ο蟊旧恚窃L問對(duì)象屬性和方法的橋梁。創(chuàng)建對(duì)象時(shí),只需調(diào)用類名并傳入__init__方法所需的參數(shù)。Python會(huì)創(chuàng)建一個(gè)新的對(duì)象實(shí)例,并自動(dòng)將該對(duì)象作為第一個(gè)參數(shù)(self)傳遞給__init__方法。這種自動(dòng)傳遞self的機(jī)制使得Python的面向?qū)ο笳Z法簡(jiǎn)潔而強(qiáng)大。屬性和方法實(shí)例屬性每個(gè)對(duì)象獨(dú)有的數(shù)據(jù)類屬性所有實(shí)例共享的數(shù)據(jù)實(shí)例方法操作實(shí)例屬性的函數(shù)靜態(tài)方法不訪問實(shí)例或類的方法類方法操作類屬性的方法5classBankAccount:"""銀行賬戶類"""
#類屬性interest_rate=0.05#年利率account_count=0#賬戶總數(shù)
def__init__(self,owner,balance=0):#實(shí)例屬性self.owner=ownerself.balance=balanceBankAccount.account_count+=1
#實(shí)例方法defdeposit(self,amount):"""存款"""self.balance+=amountreturnself.balance
defwithdraw(self,amount):"""取款"""ifamount>self.balance:raiseValueError("余額不足")self.balance-=amountreturnself.balance
#類方法@classmethoddeffrom_savings(cls,owner,amount):"""創(chuàng)建一個(gè)儲(chǔ)蓄賬戶"""account=cls(owner,amount)erest_rate=0.07#儲(chǔ)蓄賬戶利率更高returnaccount
#靜態(tài)方法@staticmethoddefconvert_currency(amount,exchange_rate):"""貨幣轉(zhuǎn)換"""returnamount*exchange_rate在Python面向?qū)ο缶幊讨校瑢傩院头椒ㄊ穷惖幕窘M成部分。屬性存儲(chǔ)對(duì)象的狀態(tài),方法定義對(duì)象的行為。實(shí)例屬性對(duì)每個(gè)對(duì)象都是唯一的,而類屬性則被所有實(shí)例共享。通過使用不同類型的方法(實(shí)例方法、類方法和靜態(tài)方法),我們可以創(chuàng)建靈活且功能豐富的類。實(shí)例方法操作特定對(duì)象的狀態(tài),類方法操作類的狀態(tài),而靜態(tài)方法則與類相關(guān)但不訪問類或?qū)嵗臓顟B(tài)。繼承:代碼重用和擴(kuò)展父類(基類)定義通用特性的類子類(派生類)繼承父類特性并可添加/修改行為方法重寫在子類中重新定義父類的方法super()函數(shù)調(diào)用父類的方法#父類classAnimal:def__init__(self,name,species):=nameself.species=species
defmake_sound(self):print("一些動(dòng)物聲音")
def__str__(self):returnf"{}是一只{self.species}"#子類classDog(Animal):def__init__(self,name,breed):#調(diào)用父類的初始化方法super().__init__(name,species="狗")self.breed=breed
defmake_sound(self):#重寫父類的方法print("汪汪!")
deffetch(self):#子類特有的方法print(f"{}正在撿球")#創(chuàng)建實(shí)例my_dog=Dog("旺財(cái)","金毛")print(my_dog)#輸出:旺財(cái)是一只狗my_dog.make_sound()#輸出:汪汪!my_dog.fetch()#輸出:旺財(cái)正在撿球繼承是面向?qū)ο缶幊讨袑?shí)現(xiàn)代碼重用的主要機(jī)制。通過繼承,子類可以獲得父類的所有屬性和方法,同時(shí)可以添加新的功能或修改現(xiàn)有功能。這種機(jī)制促進(jìn)了代碼的組織和層次結(jié)構(gòu),減少了重復(fù)代碼。在Python中,子類聲明時(shí)在括號(hào)中指定父類。子類可以重寫父類的方法,通過提供具有相同名稱的新方法來改變行為。super()函數(shù)允許子類調(diào)用父類的方法,這對(duì)于擴(kuò)展而不是完全替換父類行為非常有用。多態(tài):不同對(duì)象響應(yīng)相同的方法多態(tài)的概念多態(tài)是面向?qū)ο缶幊痰闹匾匦?,它允許不同類的對(duì)象對(duì)相同的方法調(diào)用做出不同的響應(yīng)。多態(tài)性的核心思想是"一個(gè)接口,多種實(shí)現(xiàn)",使得代碼更加靈活和可擴(kuò)展。在Python中,多態(tài)主要通過方法重寫和鴨子類型實(shí)現(xiàn)。鴨子類型Python的多態(tài)主要基于"鴨子類型"原則:如果一個(gè)對(duì)象走起來像鴨子、叫起來像鴨子,那么它就是鴨子。這意味著Python關(guān)注對(duì)象的行為(它能做什么),而不是對(duì)象的類型。只要對(duì)象實(shí)現(xiàn)了所需的方法,就可以在需要該行為的地方使用,無需繼承自特定的類。實(shí)際應(yīng)用多態(tài)性使得我們可以編寫更通用的代碼。例如,我們可以創(chuàng)建一個(gè)函數(shù),接受任何實(shí)現(xiàn)了特定方法的對(duì)象,而不關(guān)心對(duì)象的具體類型。這種靈活性使代碼更易于擴(kuò)展和維護(hù),能夠處理未來可能出現(xiàn)的新類型,而無需修改現(xiàn)有代碼。#多態(tài)示例:不同的形狀類classShape:defcalculate_area(self):pass#基類中的方法作為接口classRectangle(Shape):def__init__(self,width,height):self.width=widthself.height=height
defcalculate_area(self):returnself.width*self.heightclassCircle(Shape):def__init__(self,radius):self.radius=radius
defcalculate_area(self):importmathreturnmath.pi*self.radius**2#鴨子類型示例:無需繼承自ShapeclassTriangle:def__init__(self,base,height):self.base=baseself.height=height
defcalculate_area(self):return0.5*self.base*self.height#多態(tài)函數(shù):處理任何有calculate_area方法的對(duì)象defprint_area(shape):print(f"面積是:{shape.calculate_area()}")#測(cè)試rectangle=Rectangle(5,4)circle=Circle(3)triangle=Triangle(6,8)print_area(rectangle)#面積是:20print_area(circle)#面積是:28.274333882308138print_area(triangle)#面積是:24多態(tài)是面向?qū)ο缶幊痰膹?qiáng)大特性,它增強(qiáng)了代碼的靈活性和可擴(kuò)展性。Python的動(dòng)態(tài)類型系統(tǒng)和鴨子類型原則使得實(shí)現(xiàn)多態(tài)非常自然和直觀。調(diào)試:發(fā)現(xiàn)和修復(fù)錯(cuò)誤程序錯(cuò)誤類型程序錯(cuò)誤主要分為三類:語法錯(cuò)誤(代碼不符合語言規(guī)則)、運(yùn)行時(shí)錯(cuò)誤(代碼語法正確但執(zhí)行時(shí)出錯(cuò))和邏輯錯(cuò)誤(代碼執(zhí)行但結(jié)果不符合預(yù)期)。每種錯(cuò)誤類型需要不同的調(diào)試方法。調(diào)試工具和技巧調(diào)試可以使用簡(jiǎn)單的print語句輸出變量值,也可以使用專業(yè)調(diào)試器逐步執(zhí)行代碼。現(xiàn)代IDE如PyCharm和VSCode提供了強(qiáng)大的調(diào)試功能,包括斷點(diǎn)設(shè)置、變量監(jiān)視和單步執(zhí)行。理解錯(cuò)誤信息Python的錯(cuò)誤信息包含錯(cuò)誤類型、出錯(cuò)位置和調(diào)用堆棧,是診斷問題的寶貴線索。學(xué)會(huì)閱讀和理解這些信息是高效調(diào)試的關(guān)鍵。遇到不熟悉的錯(cuò)誤時(shí),可以查閱文檔或搜索相關(guān)資料。預(yù)防錯(cuò)誤策略預(yù)防錯(cuò)誤比修復(fù)錯(cuò)誤更有效。良好的編碼習(xí)慣、代碼審查、單元測(cè)試和適當(dāng)?shù)淖⑨尶梢詼p少錯(cuò)誤發(fā)生的機(jī)會(huì)。編寫清晰、簡(jiǎn)潔的代碼也有助于更容易發(fā)現(xiàn)和修復(fù)錯(cuò)誤。調(diào)試是編程過程中不可避免的一部分,掌握有效的調(diào)試技術(shù)可以大大提高編程效率。調(diào)試不僅僅是修復(fù)錯(cuò)誤,也是深入理解代碼行為和提升編程能力的機(jī)會(huì)。通過系統(tǒng)性地識(shí)別和解決問題,可以培養(yǎng)邏輯思維和問題解決能力。在團(tuán)隊(duì)環(huán)境中,良好的調(diào)試習(xí)慣尤為重要。清晰記錄bug及其解決方案,可以幫助團(tuán)隊(duì)成員避免類似錯(cuò)誤,提高整體代碼質(zhì)量。記住,即使最有經(jīng)驗(yàn)的程序員也會(huì)犯錯(cuò),關(guān)鍵是如何有效地發(fā)現(xiàn)和修復(fù)這些錯(cuò)誤。語法錯(cuò)誤:代碼不符合語法規(guī)則語法錯(cuò)誤特點(diǎn)語法錯(cuò)誤是最基本的錯(cuò)誤類型,它們?cè)诖a執(zhí)行前就能被Python解釋器檢測(cè)到。當(dāng)Python遇到語法錯(cuò)誤時(shí),它會(huì)停止執(zhí)行并顯示錯(cuò)誤信息,指出錯(cuò)誤的位置和類型。常見的語法錯(cuò)誤包括:缺少冒號(hào)(如if語句后)括號(hào)不匹配(如忘記閉合括號(hào))縮進(jìn)不一致拼寫錯(cuò)誤(如關(guān)鍵字拼寫錯(cuò)誤)引號(hào)不匹配示例和解決方法#語法錯(cuò)誤示例1:缺少冒號(hào)ifx>5#錯(cuò)誤:缺少冒號(hào)print(x)#正確版本ifx>5:print(x)#語法錯(cuò)誤示例2:括號(hào)不匹配result=(3+5*(2-1#錯(cuò)誤:缺少右括號(hào)#正確版本result=(3+5*(2-1))#語法錯(cuò)誤示例3:縮進(jìn)錯(cuò)誤defmy_function():print("Hello")#錯(cuò)誤:缺少縮進(jìn)#正確版本defmy_function():print("Hello")語法錯(cuò)誤通常是最容易修復(fù)的錯(cuò)誤類型,因?yàn)镻ython解釋器會(huì)明確指出錯(cuò)誤位置。錯(cuò)誤信息通常包含行號(hào)、出錯(cuò)位置(通常用^標(biāo)記)和錯(cuò)誤描述。仔細(xì)閱讀這些信息,可以快速定位和修復(fù)問題?,F(xiàn)代IDE和代碼編輯器通常會(huì)在你輸入代碼時(shí)自動(dòng)檢查語法,并標(biāo)記潛在的語法錯(cuò)誤,這可以幫助你在運(yùn)行代碼前發(fā)現(xiàn)并修復(fù)這些問題。養(yǎng)成定期保存和測(cè)試代碼的習(xí)慣,可以更早地發(fā)現(xiàn)語法錯(cuò)誤,避免在長時(shí)間編碼后才發(fā)現(xiàn)大量錯(cuò)誤。運(yùn)行時(shí)錯(cuò)誤:程序運(yùn)行時(shí)發(fā)生的錯(cuò)誤運(yùn)行時(shí)錯(cuò)誤代碼執(zhí)行過程中發(fā)生的錯(cuò)誤常見類型除零、索引越界、類型錯(cuò)誤錯(cuò)誤追蹤理解錯(cuò)誤信息和調(diào)用堆棧異常處理使用try-except捕獲并處理錯(cuò)誤#運(yùn)行時(shí)錯(cuò)誤示例1:除以零defdivide(a,b):returna/b#如果b為0,會(huì)引發(fā)ZeroDivisionErrortry:result=divide(10,0)exceptZeroDivisionError:print("錯(cuò)誤:除數(shù)不能為零")#運(yùn)行時(shí)錯(cuò)誤示例2:索引越界my_list=[1,2,3]try:print(my_list[5])#嘗試訪問不存在的索引exceptIndexError:print("錯(cuò)誤:索引超出范圍")#運(yùn)行時(shí)錯(cuò)誤示例3:類型錯(cuò)誤try:print("數(shù)字:"+5)#嘗試連接字符串和數(shù)字exceptTypeError:print("錯(cuò)誤:不能將整數(shù)直接與字符串連接")print("正確做法:","數(shù)字:"+str(5))運(yùn)行時(shí)錯(cuò)誤發(fā)生在代碼執(zhí)行過程中,即使代碼語法正確也可能出現(xiàn)這類錯(cuò)誤。常見的運(yùn)行時(shí)錯(cuò)誤包括:ZeroDivisionError(除以零)、IndexError(索引越界)、TypeError(類型錯(cuò)誤)、NameError(使用未定義的變量)、FileNotFoundError(找不到文件)等。Python提供了try-except語句來處理運(yùn)行時(shí)錯(cuò)誤。使用這種機(jī)制,可以捕獲可能發(fā)生的錯(cuò)誤,并執(zhí)行替代代碼,而不是讓程序崩潰。有效的錯(cuò)誤處理可以提高程序的健壯性,創(chuàng)造更好的用戶體驗(yàn),并提供有用的調(diào)試信息。邏輯錯(cuò)誤:程序邏輯不正確邏輯錯(cuò)誤的特點(diǎn)邏輯錯(cuò)誤是最難發(fā)現(xiàn)的錯(cuò)誤類型,因?yàn)槌绦蚩梢哉_\(yùn)行而不產(chǎn)生任何錯(cuò)誤信息,但結(jié)果與預(yù)期不符。這些錯(cuò)誤源于程序設(shè)計(jì)或算法實(shí)現(xiàn)的問題,而非語法或運(yùn)行時(shí)異常。常見的邏輯錯(cuò)誤計(jì)算錯(cuò)誤(如使用錯(cuò)誤的運(yùn)算符或公式)邊界條件處理不當(dāng)(如循環(huán)次數(shù)錯(cuò)誤)條件判斷邏輯錯(cuò)誤(如使用>而非>=)算法實(shí)現(xiàn)不正確變量賦值順序錯(cuò)誤邏輯錯(cuò)誤的調(diào)試調(diào)試邏輯錯(cuò)誤通常需要更多的分析和思考。有效方法包括:打印關(guān)鍵變量值、使用調(diào)試器逐步執(zhí)行程序、手動(dòng)追蹤代碼執(zhí)行過程、編寫測(cè)試案例驗(yàn)證功能、以及重新審視算法邏輯。#邏輯錯(cuò)誤示例1:累加錯(cuò)誤defsum_numbers(n):total=0foriinrange(n):#錯(cuò)誤:range(n)只到n-1total+=ireturntotal#正確版本defcorrect_sum_numbers(n):total=0foriinrange(1,n+1):#修正:從1到ntotal+=ireturntotal#邏輯錯(cuò)誤示例2:條件判斷錯(cuò)誤defis_adult(age):ifage>18:#錯(cuò)誤:應(yīng)該是>=18returnTruereturnFalse#正確版本defcorrect_is_adult(age):ifage>=18:#修正:包含18歲returnTruereturnFalse發(fā)現(xiàn)和修復(fù)邏輯錯(cuò)誤需要深入理解程序的預(yù)期行為和實(shí)際行為之間的差異。通常,分析程序的輸出與預(yù)期結(jié)果的差異,可以提供有關(guān)邏輯錯(cuò)誤位置的線索。系統(tǒng)性地測(cè)試不同的輸入情況,特別是邊界條件,也有助于發(fā)現(xiàn)邏輯錯(cuò)誤。預(yù)防邏輯錯(cuò)誤的最佳方法是在編寫代碼前清晰地思考算法和邏輯,使用偽代碼或流程圖規(guī)劃程序結(jié)構(gòu),并進(jìn)行充分的測(cè)試。良好的注釋和文檔也有助于澄清代碼的意圖,使邏輯錯(cuò)誤更容易被發(fā)現(xiàn)。調(diào)試工具:print語句和調(diào)試器使用print語句調(diào)試print是最簡(jiǎn)單直接的調(diào)試工具,可以在代碼的關(guān)鍵位置輸出變量值和程序狀態(tài)。雖然簡(jiǎn)單,但在許多情況下非常有效,特別是對(duì)于小型程序或快速檢查。defcalculate_discount(price,rate):#調(diào)試信息print(f"輸入?yún)?shù):price={price},rate={rate}")
ifrate<0orrate>1:print(f"警告:折扣率{rate}超出范圍")rate=max(0,min(rate,1))print(f"調(diào)整后的折扣率:{rate}")
discount=price*ratefinal_price=price-discount
#檢查計(jì)算結(jié)果print(f"折扣:{discount},最終價(jià)格:{final_price}")
returnfinal_price使用調(diào)試器調(diào)試器提供了更強(qiáng)大的功能,允許逐行執(zhí)行代碼、設(shè)置斷點(diǎn)、檢查變量值和調(diào)用堆棧。Python內(nèi)置的pdb模塊提供了基本的調(diào)試功能,而現(xiàn)代IDE如PyCharm和VSCode則提供了圖形化的調(diào)試界面。調(diào)試器的主要功能:設(shè)置斷點(diǎn):在特定行暫停執(zhí)行單步執(zhí)行:一次執(zhí)行一行代碼步入/步出:進(jìn)入或跳出函數(shù)調(diào)用變量檢查:查看當(dāng)前作用域中的變量值條件斷點(diǎn):只在滿足特定條件時(shí)暫停選擇合適的調(diào)試工具取決于問題的復(fù)雜性和個(gè)人偏好。對(duì)于簡(jiǎn)單的問題,print語句可能就足夠了;而對(duì)于復(fù)雜的邏輯錯(cuò)誤或多線程程序,使用專業(yè)調(diào)試器會(huì)更有效率。無論使用哪種工具,有效的調(diào)試都需要系統(tǒng)性的方法:確定問題范圍、形成假設(shè)、驗(yàn)證假設(shè)、修復(fù)問題、驗(yàn)證修復(fù)。這種科學(xué)的方法可以幫助你更快地定位和解決問題,同時(shí)提高編程技能。文件操作:讀取和寫入文件文件基礎(chǔ)文件是存儲(chǔ)在磁盤上的數(shù)據(jù)集合文件打開使用open()函數(shù)訪問文件讀取操作從文件獲取數(shù)據(jù)寫入操作向文件保存數(shù)據(jù)文件關(guān)閉釋放資源,確保數(shù)據(jù)保存文件操作是許多程序不可或缺的功能,它允許程序存儲(chǔ)數(shù)據(jù)、讀取配置、處理日志等。Python提供了簡(jiǎn)單而強(qiáng)大的文件操作接口,使得處理文件變得直觀和高效。#文件操作基本示例#寫入文件withopen('example.txt','w',encoding='utf-8')asfile:file.write('這是第一行\(zhòng)n')file.write('這是第二行\(zhòng)n')file.write('這是第三行,包含中文字符\n')#讀取整個(gè)文件withopen('example.txt','r',encoding='utf-8')asfile:content=file.read()print("文件內(nèi)容:\n",content)#逐行讀取withopen('example.txt','r',encoding='utf-8')asfile:print("逐行讀取:")forlineinfile:print("-",line.strip())#strip()去除行尾的換行符#追加內(nèi)容withopen('example.txt','a',encoding='utf-8')asfile:file.write('這是追加的第四行\(zhòng)n')在Python中處理文件時(shí),建議使用with語句(上下文管理器),它會(huì)自動(dòng)處理文件的關(guān)閉,即使發(fā)生異常也能確保文件正確關(guān)閉。始終指定適當(dāng)?shù)奈募幋a(如UTF-8)可以確保正確處理不同語言的文本。打開和關(guān)閉文件打開文件在Python中,使用open()函數(shù)打開文件。該函數(shù)需要至少一個(gè)參數(shù)(文件路徑),還可以指定打開模式和編碼方式。最常用的模式有:'r'(讀取,默認(rèn))、'w'(寫入,會(huì)覆蓋現(xiàn)有內(nèi)容)、'a'(追加)、'b'(二進(jìn)制模式)。#基本語法file=open('filename.txt','r',encoding='utf-8')關(guān)閉文件操作完成后,應(yīng)該關(guān)閉文件以釋放系統(tǒng)資源。使用file.close()方法關(guān)閉文件。然而,如果在文件操作過程中發(fā)生異常,close()方法可能不會(huì)被執(zhí)行,導(dǎo)致資源泄漏。#手動(dòng)打開和關(guān)閉file=open('filename.txt','r')#文件操作...file.close()使用with語句為了確保文件始終被正確關(guān)閉,推薦使用with語句(上下文管理器)。with語句會(huì)在代碼塊結(jié)束時(shí)自動(dòng)關(guān)閉文件,即使發(fā)生異常也能確保文件被關(guān)閉。#使用with語句(推薦方式)withopen('filename.txt','r',encoding='utf-8')asfile:#文件操作...#離開這個(gè)代碼塊時(shí),文件會(huì)自動(dòng)關(guān)閉正確處理文件的打開和關(guān)閉是良好編程習(xí)慣的一部分。未關(guān)閉的文件可能導(dǎo)致資源泄漏,特別是在處理大量文件或長時(shí)間運(yùn)行的程序中。使用with語句可以避免這些問題,同時(shí)使代碼更簡(jiǎn)潔可讀。處理文件路徑時(shí),建議使用原始字符串(如r'C:\path\to\file.txt')或正斜杠('C:/path/to/file.txt')來避免Windows路徑中反斜杠導(dǎo)致的轉(zhuǎn)義字符問題。對(duì)于跨平臺(tái)應(yīng)用,可以使用os.path模塊來處理路徑,確保代碼在不同操作系統(tǒng)上正常工作。讀取文件內(nèi)容讀取方法Python提供了多種讀取文件內(nèi)容的方法,適用于不同的場(chǎng)景:read():讀取整個(gè)文件內(nèi)容為一個(gè)字符串readline():讀取一行文本readlines():讀取所有行,返回列表迭代文件對(duì)象:逐行讀取文件選擇合適的讀取方法取決于文件大小和處理需求。對(duì)于小文件,讀取整個(gè)內(nèi)容可能更簡(jiǎn)單;對(duì)于大文件,逐行處理可以降低內(nèi)存使用。讀取示例#讀取整個(gè)文件withopen('data.txt','r',encoding='utf-8')asfile:content=file.read()print("文件大小:",len(content),"字符")#讀取一行withopen('data.txt','r',encoding='utf-8')asfile:first_line=file.readline()print("第一行:",first_line.strip())#讀取所有行到列表withopen('data.txt','r',encoding='utf-8')asfile:lines=file.readlines()print("行數(shù):",len(lines))
#逐行讀?。▋?nèi)存效率高)withopen('data.txt','r',encoding='utf-8')asfile:forlineinfile:#處理每一行print(line.strip())在處理文本文件時(shí),需要注意編碼問題。Python默認(rèn)使用系統(tǒng)默認(rèn)編碼,這可能導(dǎo)致處理非ASCII字符時(shí)出現(xiàn)問題。建議始終明確指定編碼(通常是UTF-8),確保正確處理各種語言的文本。對(duì)于二進(jìn)制文件(如圖像、PDF等),需要使用二進(jìn)制模式('rb')打開文件,此時(shí)read()方法返回的是字節(jié)對(duì)象而非字符串。處理二進(jìn)制數(shù)據(jù)需要使用適當(dāng)?shù)膸旌头椒?,如struct模塊用于解析二進(jìn)制結(jié)構(gòu)。寫入文件內(nèi)容寫入模式使用'w'模式(覆蓋現(xiàn)有內(nèi)容)或'a'模式(追加到文件末尾)寫入方法使用write()寫入字符串或writelines()寫入多行刷新緩沖區(qū)使用flush()方法確保數(shù)據(jù)立即寫入磁盤二進(jìn)制寫入使用'wb'模式處理二進(jìn)制數(shù)據(jù)#寫入模式(覆蓋現(xiàn)有內(nèi)容)withopen('output.txt','w',encoding='utf-8')asfile:file.write("這是第一行文本\n")file.write("這是第二行文本\n")
#寫入多行l(wèi)ines=["第三行\(zhòng)n","第四行\(zhòng)n","第五行\(zhòng)n"]file.writelines(lines)
#確保數(shù)據(jù)立即寫入磁盤(通常不需要,with語句會(huì)自動(dòng)處理)file.flush()#追加模式(添加到文件末尾)withopen('output.txt','a',encoding='utf-8')asfile:file.write("這是追加的文本\n")
#寫入二進(jìn)制數(shù)據(jù)withopen('binary_file.bin','wb')asfile:#寫入字節(jié)數(shù)據(jù)file.write(b'\x00\x01\x02\x03')在寫入文件時(shí),字符串必須包含任何所需的換行符(\n)。writelines()方法不會(huì)自動(dòng)添加換行符,所以如果需要每個(gè)字符串獨(dú)占一行,必須確保每個(gè)字符串都以換行符結(jié)尾。寫入文件時(shí)要小心使用'w'模式,因?yàn)樗鼤?huì)覆蓋文件的所有現(xiàn)有內(nèi)容。如果只想添加內(nèi)容,應(yīng)使用'a'模式。對(duì)于需要先讀取后寫入的情況,可以考慮使用'r+'模式(讀寫模式),但這需要更謹(jǐn)慎地管理文件指針位置。異常處理:處理程序運(yùn)行時(shí)發(fā)生的錯(cuò)誤什么是異常?異常是程序運(yùn)行時(shí)發(fā)生的錯(cuò)誤,會(huì)中斷正常的程序流程。Python使用異常機(jī)制來處理這些錯(cuò)誤情況,允許程序優(yōu)雅地響應(yīng)錯(cuò)誤而不是崩潰。常見的異常包括TypeError、ValueError、ZeroDivisionError、FileNotFoundError等。異常處理結(jié)構(gòu)Python使用try-except語句處理異常。try塊包含可能引發(fā)異常的代碼,except塊包含處理異常的代碼??梢杂卸鄠€(gè)except塊處理不同類型的異常。可選的else塊在沒有異常時(shí)執(zhí)行,finally塊無論是否發(fā)生異常都會(huì)執(zhí)行。異常處理的好處良好的異常處理可以提高程序的健壯性和用戶體驗(yàn)。它允許程序在出現(xiàn)錯(cuò)誤時(shí)繼續(xù)運(yùn)行,提供有意義的錯(cuò)誤信息,并執(zhí)行必要的清理操作。異常處理還支持更優(yōu)雅的錯(cuò)誤恢復(fù)策略,而不是簡(jiǎn)單地終止程序。#基本異常處理結(jié)構(gòu)try:#可能引發(fā)異常的代碼x=int(input("請(qǐng)輸入一個(gè)數(shù)字:"))result=10/xprint(f"結(jié)果是{result}")exceptValueError:#處理ValueError異常(如輸入非數(shù)字)print("錯(cuò)誤:請(qǐng)輸入有效的數(shù)字")exceptZeroDivisionError:#處理ZeroDivisionError異常print("錯(cuò)誤:不能除以零")exceptExceptionase:#處理其他所有異常print(f"發(fā)生了其他錯(cuò)誤:{e}")else:#如果沒有異常發(fā)生,執(zhí)行此塊print("計(jì)算成功完成!")finally:#無論是否發(fā)生異常,都會(huì)執(zhí)行此塊print("感謝使用計(jì)算程序")異常處理是Python編程中的重要概念,它使
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 防疫兒歌考試題及答案
- 裝修公司裝修合同范本
- 口腔門診承包合同協(xié)議書
- 酒店盒飯合同協(xié)議書下載
- 紅娘合同協(xié)議書
- 婚紗店合同協(xié)議書
- 鋼材銷售合同協(xié)議書
- 加盟減肥合同協(xié)議書
- 解除洗滌合同協(xié)議書范本
- 協(xié)議書合同無效
- 中藥學(xué)三基題庫
- 中華人民共和國民營經(jīng)濟(jì)促進(jìn)法
- 2025-2030中國船用導(dǎo)航雷達(dá)行業(yè)市場(chǎng)發(fā)展分析及發(fā)展趨勢(shì)與投資前景研究報(bào)告
- 臨床類面試真題及答案
- 礦山探礦證轉(zhuǎn)讓合同協(xié)議
- 華為企業(yè)采購流程
- 大部分分校:地域文化形考任務(wù)四-國開(CQ)-國開期末復(fù)習(xí)資料
- CQI-23模塑系統(tǒng)評(píng)估審核表-中英文
- DL∕ T 802.7-2010 電力電纜用導(dǎo)管技術(shù)條件 第7部分:非開挖用改性聚丙烯塑料電纜導(dǎo)管
- 2024年共青團(tuán)入團(tuán)積極分子考試題庫(附答案)
- 2069-3-3101-002WKB產(chǎn)品判定準(zhǔn)則-外發(fā)
評(píng)論
0/150
提交評(píng)論