版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第1章
數(shù)據(jù)挖掘概述什么是數(shù)據(jù)挖掘1.2學(xué)習(xí)目標(biāo)1.11.31.41.51.6數(shù)據(jù)挖掘的基本步驟及方法數(shù)據(jù)挖掘與統(tǒng)計學(xué)的關(guān)系數(shù)據(jù)挖掘與機(jī)器學(xué)習(xí)的關(guān)系數(shù)據(jù)挖掘十大經(jīng)典算法數(shù)據(jù)挖掘的典型應(yīng)用1什么是數(shù)據(jù)挖掘WHATISDATAMINING1.1數(shù)據(jù)、信息、知識和智慧01數(shù)據(jù)數(shù)據(jù)是對客觀事物記錄下來的、可以鑒別的符號。數(shù)據(jù)經(jīng)過處理后仍然是數(shù)據(jù),處理數(shù)據(jù)是為了便于更好地解釋,只有經(jīng)過解釋,數(shù)據(jù)才有意義,才能夠成為信息。02信息信息是對客觀世界各種事物的特征的反映,是關(guān)于客觀事實的可通訊的知識。03知識知識是反映各種事物的信息進(jìn)入人們大腦,對神經(jīng)細(xì)胞產(chǎn)生作用后留下的痕跡,知識是由信息形成的智慧智慧是人類做出正確判斷的能力和對知識的正確使用,智慧可以回答為什么的問題,判斷是非、對錯、好壞,關(guān)注未來,試圖理解過去沒有理解的東西04數(shù)據(jù)挖掘的定義數(shù)據(jù)源必須是真實的、大量的、有噪聲的。發(fā)現(xiàn)的知識是可接受、可理解、可運(yùn)用的。發(fā)現(xiàn)對用戶有價值的知識。并不要求發(fā)現(xiàn)放之四海而皆準(zhǔn)的知識,僅支持特定的發(fā)現(xiàn)問題。數(shù)據(jù)挖掘的功能數(shù)據(jù)總結(jié)繼承于數(shù)據(jù)分析中的統(tǒng)計分析。數(shù)據(jù)總結(jié)目的是對數(shù)據(jù)進(jìn)行濃縮,給出它的緊湊描述。功能分類目的是構(gòu)造一個分類函數(shù)或分類模型,該模型能把數(shù)據(jù)庫中的數(shù)據(jù)項映射到給定類別中的某一個。聚類是把整個數(shù)據(jù)集分成不同的群組,目的是使群組與群組之間差別很明顯,而同一個群組之間的數(shù)據(jù)盡量相似。關(guān)聯(lián)分析尋找數(shù)據(jù)的相關(guān)性。兩種常用的技術(shù)是關(guān)聯(lián)規(guī)則和序列模式。預(yù)測把握分析對象發(fā)展的規(guī)律,對未來的趨勢做出預(yù)見。偏差檢測對分析對象中少數(shù)的、極端特例的描述,揭示內(nèi)在的原因。數(shù)據(jù)挖掘的發(fā)展簡史數(shù)據(jù)挖掘起始于20世紀(jì)下半葉。這期間計算機(jī)領(lǐng)域的人工智能也取得了巨大進(jìn)展,進(jìn)入了機(jī)器學(xué)習(xí)階段。20世紀(jì)下半葉1989年8月召開的第11屆國際人工智能聯(lián)合會議的專題討論會上首次出現(xiàn)了知識發(fā)現(xiàn)(KDD)這個術(shù)語。1989年8月1995年在美國計算機(jī)年會上,開始把數(shù)據(jù)挖掘視為數(shù)據(jù)庫知識發(fā)現(xiàn)的一個基本步驟。1995年到目前為止,KDD的重點(diǎn)已經(jīng)從發(fā)現(xiàn)方法轉(zhuǎn)向了實踐應(yīng)用。而數(shù)據(jù)挖掘則是知識發(fā)現(xiàn)(KDD)的核心部分。到目前為止數(shù)據(jù)挖掘已經(jīng)成為一門比較成熟的交叉學(xué)科,并且數(shù)據(jù)挖掘技術(shù)也伴隨著信息技術(shù)的發(fā)展日益成熟起來。進(jìn)入21世紀(jì)2數(shù)據(jù)挖掘的基本步驟及方法TheBasicStepsandMethodsofDataMining1.2數(shù)據(jù)挖掘的基本步驟01問題定義02建立數(shù)據(jù)挖掘庫在開始數(shù)據(jù)挖掘之前,最先的也是最重要的要求就是熟悉領(lǐng)域知識,弄清用戶的需求。要想充分發(fā)揮數(shù)據(jù)挖掘的價值,必須對目標(biāo)有一個清晰明確的定義,即決定到底想干什么。要進(jìn)行數(shù)據(jù)挖掘必須收集要挖掘的數(shù)據(jù)資源。一般建議把要挖掘的數(shù)據(jù)都收集到一個數(shù)據(jù)庫中,而不是采用原有的數(shù)據(jù)庫或數(shù)據(jù)倉庫。03分析數(shù)據(jù)04調(diào)整數(shù)據(jù)分析數(shù)據(jù)的目的是找到對預(yù)測輸出影響最大的數(shù)據(jù)字段,和決定是否需要定義導(dǎo)出字段。針對問題的需求對數(shù)據(jù)進(jìn)行增刪,按照對整個數(shù)據(jù)挖掘過程的新認(rèn)識組合或生成一個新的變量,以體現(xiàn)對狀態(tài)的有效描述。05建立模型06測試模型建立模型是一個反復(fù)的過程。需要仔細(xì)考察不同的模型以判斷哪個模型對具體問題最有用。先用一部分?jǐn)?shù)據(jù)建立模型,然后再用剩下的數(shù)據(jù)來測試和驗證這個模型。模型建立好之后,必須評價得到的結(jié)果、解釋模型的價值。從測試集中得到的準(zhǔn)確率只對用于建立模型的數(shù)據(jù)有意義。07實施模型建立并經(jīng)驗證之后,可以有兩種主要的使用方法。第一種是提供給分析人員做參考;另一種是把此模型應(yīng)用到不同的數(shù)據(jù)集上。數(shù)據(jù)挖掘的任務(wù)任務(wù)關(guān)聯(lián)分析關(guān)聯(lián)分析的目的是找出數(shù)據(jù)庫中隱藏的關(guān)聯(lián)(簡單關(guān)聯(lián)、時序關(guān)聯(lián)、因果關(guān)聯(lián))網(wǎng),用于發(fā)現(xiàn)隱藏在大型數(shù)據(jù)集中的令人感興趣的聯(lián)系。聚類分析聚類是把數(shù)據(jù)按照相似性歸納成若干類別,同一類中的數(shù)據(jù)彼此相似,不同類中的數(shù)據(jù)相異。分類分類就是找出一個類別的概念描述,它代表了這類數(shù)據(jù)的整體信息,即該類的內(nèi)涵描述,并用這種描述來構(gòu)造模型,一般用規(guī)則或決策樹模式表示?;貧w分析預(yù)測它是在分析自變量和因變量之間相關(guān)關(guān)系的基礎(chǔ)上,建立變量之間的回歸方程,并將回歸方程作為預(yù)測模型,根據(jù)自變量在預(yù)測期的數(shù)量變化來預(yù)測因變量關(guān)系并表現(xiàn)為相關(guān)關(guān)系。時序模式它是指通過時間序列搜索出的重復(fù)發(fā)生概率較高的模式。與回歸一樣,它也是用己知的數(shù)據(jù)預(yù)測未來的值,但這些數(shù)據(jù)的區(qū)別是變量所處時間的不同。偏差分析在偏差中包括很多有用的知識,數(shù)據(jù)庫中的數(shù)據(jù)存在很多異常情況,發(fā)現(xiàn)數(shù)據(jù)庫中數(shù)據(jù)存在的異常情況是非常重要的。偏差檢驗的基本方法就是尋找觀察結(jié)果與參照之間的差別。數(shù)據(jù)挖掘分析方法估值估值與分類類似,但估值最終的輸出結(jié)果是連續(xù)型的數(shù)值,估值的量并非預(yù)先確定。估值可以作為分類的準(zhǔn)備工作。它首先從數(shù)據(jù)中選出已經(jīng)分好類的訓(xùn)練集,在該訓(xùn)練集上運(yùn)用數(shù)據(jù)挖掘技術(shù),建立一個分類模型,再將該模型用于對沒有分類的數(shù)據(jù)進(jìn)行分類。分類預(yù)測其目的是發(fā)現(xiàn)哪些事情總是一起發(fā)生。相關(guān)性分組或關(guān)聯(lián)規(guī)則它是通過分類或估值來進(jìn)行,通過分類或估值的訓(xùn)練得出一個模型,如果對于檢驗樣本組而言該模型具有較高的準(zhǔn)確率,可將該模型用于對新樣本的未知變量進(jìn)行預(yù)測。聚類它是自動尋找并建立分組規(guī)則的方法,它通過判斷樣本之間的相似性,把相似樣本劃分在一個簇中。3數(shù)據(jù)挖掘與統(tǒng)計學(xué)的關(guān)系RelationshipbetweenDataMiningandStatistics1.3數(shù)據(jù)挖掘與統(tǒng)計學(xué)的聯(lián)系數(shù)據(jù)挖掘來源于統(tǒng)計分析,而又不同于統(tǒng)計分析。數(shù)據(jù)挖掘不是為了替代傳統(tǒng)的統(tǒng)計分析技術(shù),相反,數(shù)據(jù)挖掘是統(tǒng)計分析方法的擴(kuò)展和延伸。由于數(shù)據(jù)挖掘和統(tǒng)計分析根深蒂固的聯(lián)系,常用的據(jù)挖掘工具都能夠通過可選件或自身提供統(tǒng)計分析功能。這些功能對于數(shù)據(jù)挖掘的前期數(shù)據(jù)探索和數(shù)據(jù)挖掘之后對數(shù)據(jù)進(jìn)行總結(jié)和分析都是十分必要的。統(tǒng)計分析所提供的諸如方差分析、假設(shè)檢驗、相關(guān)性分析、線性預(yù)測、時間序列分析等功能都有助于數(shù)據(jù)挖掘前期對數(shù)據(jù)進(jìn)行探索,發(fā)現(xiàn)數(shù)據(jù)挖掘的課題、找出數(shù)據(jù)挖掘的目標(biāo)、確定數(shù)據(jù)挖掘所需涉及的變量、對數(shù)據(jù)源進(jìn)行抽樣等等。所有這些前期工作會對數(shù)據(jù)挖掘的效果產(chǎn)生重大影響。而數(shù)據(jù)挖掘的結(jié)果也需要統(tǒng)計分析的描述功能(如最大值、最小值、平均值、方差、四分位、個數(shù)、概率分配等)進(jìn)行具體描述,使數(shù)據(jù)挖掘的結(jié)果能夠被用戶理解。因此,統(tǒng)計分析和數(shù)據(jù)挖掘是相輔相成的過程,兩者的合理配合是數(shù)據(jù)挖掘成功的重要條件。數(shù)據(jù)挖掘與統(tǒng)計學(xué)的區(qū)別數(shù)據(jù)挖掘常常是根據(jù)一個特定屬性去處理一個大數(shù)據(jù)集,這就意味著,傳統(tǒng)統(tǒng)計學(xué)由于可行性的原因,常常是利用一個樣本來分析處理,而所描述的樣本取自于那個大數(shù)據(jù)集。其實數(shù)據(jù)挖掘問題也常常是需要得到數(shù)據(jù)總體,例如關(guān)于一個公司的所有職工數(shù)據(jù),數(shù)據(jù)庫中的所有客戶資料,去年的所有業(yè)務(wù)等。在這種情形下,統(tǒng)計學(xué)的推斷就沒有價值了。很多情況下,數(shù)據(jù)挖掘的本質(zhì)是很偶然的發(fā)現(xiàn)、非預(yù)期但很有價值的信息。這說明數(shù)據(jù)挖掘過程本質(zhì)上是實驗性的。這和確定性的分析是不同的,即它不能完全確定一個理論的,而是只能提供證據(jù)和不確定的證據(jù)。確定性分析著眼于最適合的模型,即建立一個推薦模型,這個模型也許不能很好的解釋觀測到的數(shù)據(jù)。而大部分統(tǒng)計分析提出的是確定性的分析。4數(shù)據(jù)挖掘與機(jī)器學(xué)習(xí)的關(guān)系RelationshipbetweenDataMiningandMachineLearning1.4數(shù)據(jù)挖掘與機(jī)器學(xué)習(xí)的聯(lián)系數(shù)據(jù)挖掘中用到了大量的機(jī)器學(xué)習(xí)提供的數(shù)據(jù)分析技術(shù)和數(shù)據(jù)庫提供的數(shù)據(jù)管理技術(shù)。學(xué)習(xí)能力是智能行為的一個非常重要的特征。不具有學(xué)習(xí)能力的系統(tǒng)很難稱之為一個真正的智能系統(tǒng),而機(jī)器學(xué)習(xí)則希望系統(tǒng)(計算機(jī))能夠利用經(jīng)驗來改善自身的性能,因此該領(lǐng)域一直是人工智能的核心研究領(lǐng)域之一。在計算機(jī)系統(tǒng)中,“經(jīng)驗”通常是以數(shù)據(jù)的形式存在的,因此,機(jī)器學(xué)習(xí)不僅涉及對人的認(rèn)知學(xué)習(xí)過程的探索,還涉及對數(shù)據(jù)的分析處理。實際上,機(jī)器學(xué)習(xí)已經(jīng)成為計算機(jī)數(shù)據(jù)分析技術(shù)的創(chuàng)新源頭之一。由于幾乎所有的學(xué)科都要面對數(shù)據(jù)分析任務(wù),因此機(jī)器學(xué)習(xí)已經(jīng)開始影響到計算機(jī)科學(xué)的眾多領(lǐng)域,甚至影響到計算機(jī)科學(xué)之外的很多學(xué)科。機(jī)器學(xué)習(xí)是數(shù)據(jù)挖掘中的一種重要工具。然而數(shù)據(jù)挖掘不僅僅要研究、拓展、應(yīng)用一些機(jī)器學(xué)習(xí)方法,還要通過許多非機(jī)器學(xué)習(xí)技術(shù)解決數(shù)據(jù)倉儲、大規(guī)模數(shù)據(jù)、數(shù)據(jù)噪聲等實踐問題。數(shù)據(jù)挖掘與機(jī)器學(xué)習(xí)的區(qū)別數(shù)據(jù)挖掘機(jī)器學(xué)習(xí)數(shù)據(jù)挖掘使用了大量的機(jī)器學(xué)習(xí)算法,也使用了一系列的工程技術(shù)。機(jī)器學(xué)習(xí)是以統(tǒng)計學(xué)為支撐的一門面向理論的學(xué)科,其不需要考慮諸如數(shù)據(jù)倉庫,OLAP等應(yīng)用工程技術(shù)數(shù)據(jù)挖掘是從目的而言的,常用在數(shù)據(jù)挖掘上的方法只是“從數(shù)據(jù)學(xué)習(xí)”機(jī)器學(xué)習(xí)是從方法而言的,機(jī)器學(xué)習(xí)不僅僅可以用在數(shù)據(jù)挖掘上,一些機(jī)器學(xué)習(xí)的子領(lǐng)域甚至與數(shù)據(jù)挖掘關(guān)系不大,如增強(qiáng)學(xué)習(xí)與自動控制等。數(shù)據(jù)挖掘則是使用了包括機(jī)器學(xué)習(xí)算法在內(nèi)的眾多知識的一門應(yīng)用學(xué)科,它主要是使用一系列處理方法挖掘數(shù)據(jù)背后的信息。機(jī)器學(xué)習(xí)是一門更加偏向理論性學(xué)科,其目的是為了讓計算機(jī)不斷學(xué)習(xí)找到接近目標(biāo)函數(shù)f的假設(shè)h。5數(shù)據(jù)挖掘十大經(jīng)典算法TenClassicAlgorithmsforDataMining1.5數(shù)據(jù)挖掘十大經(jīng)典算法01C4.5C4.5算法是機(jī)器學(xué)習(xí)算法中的一種分類決策樹算法,其核心算法是ID3算法.C4.5算法有如下優(yōu)點(diǎn):產(chǎn)生的分類規(guī)則易于理解,準(zhǔn)確率較高。其缺點(diǎn)是:在構(gòu)造樹的過程中,需要對數(shù)據(jù)集進(jìn)行多次的順序掃描和排序,因而導(dǎo)致算法的低效。02K-MeansK-Means算法是一種聚類算法,把n個對象根據(jù)它們的屬性分為k個簇,k<n。它與處理混合正態(tài)分布的最大期望算法很相似,因為它們都試圖找到數(shù)據(jù)中自然聚類的中心。它假設(shè)對象屬性來自于空間向量,并且目標(biāo)是使各個簇內(nèi)部的均方誤差總和最小。03支持向量機(jī)支持向量機(jī)是一種監(jiān)督式學(xué)習(xí)的方法,它廣泛的應(yīng)用于統(tǒng)計分類以及回歸分析中。支持向量機(jī)將向量映射到一個更高維的空間里,在這個空間里建立一個最大間隔超平面。在分開數(shù)據(jù)的超平面的兩邊建有兩個互相平行的超平面。分隔超平面使兩個平行超平面的距離最大化。04AprioriApriori算法是一種最有影響的挖掘布爾關(guān)聯(lián)規(guī)則頻繁項集的算法。其核心是基于兩階段頻繁項集思想的遞推算法。該關(guān)聯(lián)規(guī)則在分類上屬于單維、單層、布爾關(guān)聯(lián)規(guī)則。在這里,所有支持度大于最小支持度的項集稱為頻繁項集。然后由頻繁項集產(chǎn)生強(qiáng)關(guān)聯(lián)規(guī)則,這些規(guī)則必須滿足最小支持度和最小可信度。05EM在統(tǒng)計計算中,最大期望EM(ExpectationMaximization)算法是在概率模型中尋找參數(shù)最大似然估計的算法,其中概率模型依賴于無法觀測的隱藏變量。最大期望算法經(jīng)常應(yīng)用于機(jī)器學(xué)習(xí)和計算機(jī)視覺的數(shù)據(jù)集聚領(lǐng)域。數(shù)據(jù)挖掘十大經(jīng)典算法06PageRankPageRank算法又稱網(wǎng)頁排名,它是根據(jù)網(wǎng)站外部鏈接和內(nèi)部鏈接的數(shù)量和質(zhì)量來衡量網(wǎng)站的價值。算法原理為:每個到頁面的鏈接都是對該頁面的一次投票,被鏈接的越多,就意味著被其他網(wǎng)站投票越多,這個就是所謂的“鏈接流行度”,由此來衡量多少人愿意將他們的網(wǎng)站和該網(wǎng)站掛鉤。07AdaBoostAdaboost是一種迭代算法,其核心思想是針對同一個訓(xùn)練集訓(xùn)練不同的分類器(弱分類器),然后把這些弱分類器集合起來,構(gòu)成一個更強(qiáng)的最終分類器(強(qiáng)分類器)。其算法本身是通過改變數(shù)據(jù)分布來實現(xiàn)的,它根據(jù)每次訓(xùn)練集之中每個樣本的分類是否正確,以及上次的總體分類的準(zhǔn)確率,來確定每個樣本的權(quán)值。08KNNKNN算法也稱為K最近鄰分類算法,是一個理論上比較成熟的方法,也是最簡單的機(jī)器學(xué)習(xí)算法之一。該方法的原理是:如果一個樣本在特征空間中的k個最相似(即特征空間中最鄰近)的樣本中的大多數(shù)屬于某一個類別,則該樣本也屬于這個類別。09NaiveBayes樸素貝葉斯模型發(fā)源于古典數(shù)學(xué)理論,有著堅實的數(shù)學(xué)基礎(chǔ)及穩(wěn)定的分類效率。同時,NBC模型所需估計的參數(shù)很少,對缺失數(shù)據(jù)不太敏感,算法也比較簡單。在屬性個數(shù)比較多或者屬性之間相關(guān)性較大時,NBC模型的分類效率比不上決策樹模型。而在屬性相關(guān)性較小時,NBC模型的性能最為良好。10CARTCART算法也稱為分類與回歸樹。在分類樹下面有兩個關(guān)鍵的思想。第一個是關(guān)于遞歸地劃分自變量空間的想法(二元切分法);第二個想法是用驗證數(shù)據(jù)進(jìn)行剪枝(預(yù)剪枝、后剪枝)。在回歸樹的基礎(chǔ)上的模型樹構(gòu)建難度可能增加了,但同時其分類效果也有提升。6數(shù)據(jù)挖掘的典型應(yīng)用TypicalApplicationsofDataMining1.6數(shù)據(jù)挖掘的典型應(yīng)用應(yīng)用于醫(yī)學(xué)方面,提高診斷準(zhǔn)確率眾所周知,人體奧秘?zé)o窮無盡,遺傳密碼、人類疾病等方面都蘊(yùn)含了海量數(shù)據(jù)信息。而傳統(tǒng)研究模式,單純依靠人工無法探索真正的秘密。而利用數(shù)據(jù)挖掘技術(shù)能夠有效解決這些問題,給醫(yī)療工作者帶來了極大的便利。同時,醫(yī)療體制改革背景下,醫(yī)院內(nèi)部醫(yī)療器具的管理、病人檔案資料整理等方面同樣涉及數(shù)據(jù),引進(jìn)數(shù)據(jù)挖掘技術(shù),能夠深入分析疾病之間的聯(lián)系及規(guī)律,幫助醫(yī)生診斷和治療,以達(dá)到事半功倍的效果,為保障人類健康等提供強(qiáng)大的技術(shù)支持。應(yīng)用于金融方面,提高工作有效性銀行及金融機(jī)構(gòu)中涉及儲蓄、信貸等大量數(shù)據(jù)信息。利用數(shù)據(jù)挖掘技術(shù)管理和應(yīng)用這些數(shù)據(jù)信息,能夠幫助金融機(jī)構(gòu)更好地適應(yīng)互聯(lián)網(wǎng)金融時代的發(fā)展趨勢。提高金融數(shù)據(jù)的完整性、可靠性,為金融決策提供科學(xué)依據(jù)。金融市場變幻莫測,要想在競爭中提升自身核心競爭力,需要對數(shù)據(jù)進(jìn)行多維分析和研究。在應(yīng)用中,特別是針對偵破洗黑錢等犯罪活動,可以采取孤立點(diǎn)分析等工具進(jìn)行分析,為相關(guān)工作有序開展奠定堅實的基礎(chǔ)。數(shù)據(jù)挖掘的典型應(yīng)用應(yīng)用于高校日常管理方面,實現(xiàn)高校信息化建設(shè)當(dāng)前,針對高校中存在的貧困大學(xué)生而言,受到自身家庭等因素的影響,他們學(xué)業(yè)與生活存在很多困難,而高校給予了貧困生很多幫助。為此將數(shù)據(jù)挖掘技術(shù)引入到貧困生管理工作中,能夠?qū)⑿?nèi)貧困生群體作為主要研究對象,采集和存儲在校生生活、學(xué)習(xí)等多方面信息,然后構(gòu)建貧困生認(rèn)定模型,并將此作為基礎(chǔ)進(jìn)行查詢和統(tǒng)計,為貧困生的管理工作提供技術(shù)支持,從而提高高校學(xué)生管理質(zhì)量和效率,促進(jìn)高校和諧、有序發(fā)展。應(yīng)用于電信方面,實現(xiàn)經(jīng)濟(jì)效益最大化目標(biāo)現(xiàn)代社會發(fā)展趨勢下,電信產(chǎn)業(yè)已經(jīng)不僅限于傳統(tǒng)意義上的語音服務(wù)提供商,而將語音、文字、視頻等有機(jī)整合成為一項數(shù)據(jù)通信綜合業(yè)務(wù)。電信網(wǎng)、因特網(wǎng)等網(wǎng)絡(luò)已經(jīng)融合在一起,在該背景下,數(shù)據(jù)挖掘技術(shù)應(yīng)用能夠幫助運(yùn)營商更好地開展業(yè)務(wù),如利用多維分析電信數(shù)據(jù);或者采用聚類等方法查找異常狀態(tài)及盜用模式等,不斷提高數(shù)據(jù)資源利用率,為深入地了解用戶行為,促進(jìn)電信業(yè)務(wù)的推廣及應(yīng)用,從而實現(xiàn)經(jīng)濟(jì)效益最大化目標(biāo)。本章結(jié)束啦!歡迎課后繼續(xù)交流~第2章
Python數(shù)據(jù)分析基礎(chǔ)FundamentalsofPythondataanalysisPython程序概述2.2學(xué)習(xí)目標(biāo)2.12.32.4Python常用的內(nèi)置數(shù)據(jù)結(jié)構(gòu)正則表達(dá)式文件操作1Python程序概述OverviewofPythonProgramsChapter012.1.1基礎(chǔ)數(shù)據(jù)類型數(shù)據(jù)類型在數(shù)據(jù)結(jié)構(gòu)中定義為一組性質(zhì)相同值的集合以及定義在這個集合上一組操作的總稱。Python3中有六種標(biāo)準(zhǔn)的數(shù)據(jù)類型:Number(數(shù)字)、String(字符串)、List(列表)、Tuple(元組)、Set(集合)和Dictionary(字典)。其中,不可變數(shù)據(jù)類型有Number、String和Tuple;可變數(shù)據(jù)類型有List、Dictionary和Set。2.1.2變量和賦值
變量是用來存儲數(shù)據(jù)的,它是程序中一個已經(jīng)命名的存儲單元。變量具有名字和數(shù)據(jù)類型,Python中的變量使用前不需要聲明數(shù)據(jù)類型,但必須賦值,僅當(dāng)變量賦值后才會被創(chuàng)建。賦值號為“=”,同一變量可以反復(fù)賦值,而且可以是不同類型的值。例2.1
變量賦值示例。a,b,c=12,’Python’,34.567print(a,b,c)
2.1.3操作符和表達(dá)式Python的算術(shù)表達(dá)式具有結(jié)合性和優(yōu)先級。結(jié)合性是指表達(dá)式按照從左到右、先乘除后加減的原則進(jìn)行計算。Python運(yùn)算符及優(yōu)先級如表所示。優(yōu)先級運(yùn)算符說明1**指數(shù)2~、+、-按位翻轉(zhuǎn)、一元加號、減號(正負(fù)號)3*、/、%、//乘,除,取模、取整除4+、-加法、減法5>>、<<右移、左移運(yùn)算符6&按位與7^、|按位異或、按位或8<=、<、>、>=小于等于、小于、大于、大于等于9==、!=等于、不等于10=、%=、/=、//=、-=、+=、*=、**=賦值、取模賦值、除法賦值、整除賦值、減法賦值、加法賦值、乘法賦值、冪賦值
加法賦值、乘法賦值、冪運(yùn)算賦值11is、isnot同一對象、不同對象12in、notin屬于、不屬于13not、or、and非、或、與2.1.3操作符和表達(dá)式
表達(dá)式是運(yùn)算符和操作數(shù)所構(gòu)成的序列。Python中運(yùn)算符的優(yōu)先級也可以用括號來改變,就和數(shù)學(xué)公式里面一樣,先計算最里面的括號,之后就是外面的括號。此外,Python還支持形如3<4<5的表達(dá)式。2.1.4字符串——轉(zhuǎn)義字符
所謂轉(zhuǎn)義字符是指那些字符串里具有特殊含義的字符,它們是以反斜杠(“\”)開頭的。Python中常用的轉(zhuǎn)義字符如表所示。轉(zhuǎn)義字符說明\n換行符,將光標(biāo)位置移到下一行開頭\r回車符,將光標(biāo)位置移到本行開頭\t水平制表符,即Tab鍵,一般相當(dāng)于4~8個空格\b退格(Backspace),將光標(biāo)位置移到前一列\(zhòng)在字符串行尾的續(xù)行符,即一行未完,轉(zhuǎn)到下一行繼續(xù)寫2.1.4字符串——轉(zhuǎn)義字符(1)轉(zhuǎn)義字符在書寫形式上由多個字符組成,但Python
將它們看作是一個整體,表示一個字符。例2.2
轉(zhuǎn)義字符示例。info="Python教程:/python/\n\C++教程:/cplus/\n\Linux教程:/linux_tutorial/"print(info)運(yùn)行結(jié)果如圖所示。2.1.4字符串——轉(zhuǎn)義字符(2)Python允許用'r'或'R'表示字符串內(nèi)部的字符不轉(zhuǎn)義。例2.3
轉(zhuǎn)義字符示例。print('\\\t\\')print(r'\\\t\\')運(yùn)行結(jié)果如圖2.2所示。2.1.4字符串——轉(zhuǎn)義字符(3)Python允許用'''...'''的格式表示多行內(nèi)容的字符串。例2.4
多行內(nèi)容的字符串示例。print('''line1...line2...line3''')運(yùn)行結(jié)果如圖2.3所示。2.1.4字符串——常用操作(1)字符串運(yùn)算字符串的常用運(yùn)算如表所示,其中str1=’Hello’,str2=’Python’。運(yùn)算符說明示例結(jié)果+字符串連接str1+str2HelloPython*重復(fù)輸出字符串str1*2HelloHelloin判斷子串是否屬于字符串'th'instr2Truenotin判斷子串是否不屬于字符串'th'notinstr2False2.1.4字符串——常用操作(2)字符串切片
字符串的本質(zhì)就是字符序列,可以通過在字符串后面添加[],在[]里面指定偏移量,用于提取該位置的單個字符。①
正向搜索:最左側(cè)第一個字符,偏移量是0,第二個偏移量是
1,以此類推。直到len(str)-1為止。其中str為字符串變量。②
反向搜索:最右側(cè)第一個字符,偏移量是-1,倒數(shù)第二個偏移量是-2,以此類推,直到-len(str)為止。其中str為字符串變量。
切片(slice)操作可以快速的提取子字符串。標(biāo)準(zhǔn)格式為:
<字符串>[start:end:step]
其中start、end和step都是整數(shù),分別表示起始偏移量、終止偏移量和步長。提取字符串操作遵循著“左閉右開”的原則。
假設(shè)str='Pythonprogram',當(dāng)start、end、step全為正數(shù)情況下的典型操作如表2.4所示。2.1.4字符串——常用操作操作格式說明示例結(jié)果[:]提取整個字符串str[:]Pythonprogram[start:]從start索引開始到結(jié)尾str[4:]onprogram[:end]從頭開始直到end-1str[:10]Pythonpro[start:end]從start到end-1str[4:10]onpro[start:end:step]從start提取到end-1,步長是stepstr[4:14:2]orga[:end]從開始到倒數(shù)-end個字符str[:-4]Pythonpro[start:end]從倒數(shù)第-start個到倒數(shù)第-end字符str[-10,-3]onprog[::step]從末尾開始,自右向左反向提取,步長-stepstr[::-2]mropnhy2.1.4字符串——常用方法字符串的常用方法如表2.6所示。假設(shè)str='classtissla\n',jn1='-'。方法說明示例結(jié)果len()字符串長度len(str)12strip()去掉字符串兩端的空格和換行符str.strip()classtisslacount(<子串>)查找子串在字符串中出現(xiàn)的次數(shù)str.count('ss')2find(<子串>)找到子串返回下標(biāo),多個時返回第一個str.find('ss')3replace(<串1>,<串2>)在字符串中<串1>被<串2>替換str.replace('ss','gg')claggtiggla\nsplit(<子串>)利用子串切割字符串str.split('ss')'cla','ti','la\n'join(<字符串>)將序列中的元素以指定的字符連接生成一個新的字符串。jn1.join(str)c-l-a-s-s-t-i-s-s-l-a-2.1.5流程控制——語句塊
在Python中,語句塊(Statement-block)是在條件為真(條件語句)時執(zhí)行或者執(zhí)行多次(循環(huán)語句)的一組語句。在代碼前放置空格來縮進(jìn)語句即可創(chuàng)建語句塊,語句塊中的每行必須具有同樣的縮進(jìn)量。
Python編程中的流程控制語句分為順序語句、分支語句和循環(huán)語句,其中順序語句不需要單獨(dú)的關(guān)鍵字來控制,就是一行行的執(zhí)行,也不需要特殊的說明。這里主要介紹的是分支語句和循環(huán)語句。2.1.5流程控制——分支語句
分支語句是通過條件表達(dá)式的判斷結(jié)果(True/False)來決定執(zhí)行哪個分支的代碼塊。Python中提供的分支語句為:if…else語句。有以下幾種形式:
(1)單分支if<condition>:<statementblock>
(2)雙分支if<condition>:<statement_block_1>else:<statement_block_2>
(3)多分支if<condition_1>:<statement_block_1>elif<condition_2>:<statement_block_2>......elif<condition_n>:<statement_block_n>else:
<default_statement_block>
其中各語句塊中的行必須具有相同的縮進(jìn)量,但不同語句塊之間的縮進(jìn)量可以不同。2.1.5流程控制——分支語句例2.5輸入學(xué)生的成績,利用多分支判斷出該成績符合的等級。90分以上為優(yōu),80~89為良,70~79為中,60~69為及格,60分以下為不及格。程序語句如下:score=input('請輸入成績:')
#手動輸入成績score=int(score)
#將輸入的字符串轉(zhuǎn)換為數(shù)值ifscore>=90andscore<=100:print('優(yōu)')elifscore>=80:print('良')elifscore>=70:print('中')elifscore>=60:print('及格')elifscore>=0andscore<60:print('不及格')else:
#輸入>100或<0的分?jǐn)?shù)時報錯
print('成績輸入錯誤!')2.1.5流程控制——循環(huán)語句
當(dāng)需要多次執(zhí)行一個代碼語句或代碼塊時,可以使用循環(huán)語句。Python中提供的循環(huán)語句有:while循環(huán)和for循環(huán)。(1)while循環(huán)語句
while循環(huán)語句的基本形式如下:while<condition>:
<statement_block>(2)for循環(huán)
for循環(huán)的基本形式:for<variable>in<string|range|set>:
<statement_block>2.1.5流程控制——循環(huán)語句例2.6用輾轉(zhuǎn)相除法求最大公約數(shù)。具體方法為:兩個正整數(shù)a和b,它們的最大公約數(shù)等于a除以b的余數(shù)r和b之間的最大公約數(shù)。程序語句如下:a=int(input('輸入正整數(shù)a:'))b=int(input('輸入正整數(shù)b:'))ifa<b:a,b=b,ar=a%bwhiler!=0:a,b=b,rr=a%bprint(’最大公約數(shù):’+str(b))2.1.6用戶函數(shù)Python用戶函數(shù)是預(yù)先組織好的,可重復(fù)使用的,用來實現(xiàn)單一或相關(guān)聯(lián)功能的代碼段。函數(shù)能提高應(yīng)用的模塊性和代碼的重復(fù)利用率。函數(shù)僅在調(diào)用時運(yùn)行,它將數(shù)據(jù)(稱為參數(shù))傳遞到函數(shù)內(nèi)進(jìn)行處理,最后把結(jié)果數(shù)據(jù)返回。在Python中,使用
def關(guān)鍵字定義函數(shù),語句形式為:def<function_name>(arguments):<statement_block>[return[returned_value]]2.1.6用戶函數(shù)例2.7
定義判定素數(shù)的函數(shù),利用該函數(shù)輸出100~200之間素數(shù)的個數(shù)。defis_prime(n):mark=Trueforiinrange(2,n//2+1):ifn%i==0:mark=Falsereturnmarknum=0forkinrange(100,201):ifis_prime(k):num=num+1print('100~200之間素數(shù)個數(shù)為'+str(num))2.1.7lambda函數(shù)lambda函數(shù)在Python編程語言中使用頻率非常高,使用起來非常靈活、巧妙。該函數(shù)是匿名函數(shù),即沒有名字的函數(shù)。lambd
函數(shù)的語法只包含一個語句,常用形式為:lambda[arg_1[,arg_2,…,arg_n]]:expression
其中l(wèi)ambda
是
Python預(yù)留的關(guān)鍵字;arg_1、arg_2、…、arg_n是參數(shù)列表,它的結(jié)構(gòu)與
Python中函數(shù)的參數(shù)列表是一樣的;expression是單行的、唯一的參數(shù)表達(dá)式。lambd
函數(shù)返回通過計算表達(dá)式expression得到的值。
如用戶定義函數(shù):defsum(x,y):returnx+y
用lambda來實現(xiàn)為:p=lambdax,y:x+yprint(p(4,6))lambda函數(shù)可以接收任意多個參數(shù)(包括可選參數(shù)),只能返回單個表達(dá)式的值。如:a=lambdax,y,z:(x+8)*y-zprint(a(5,6,8))2Python常用的內(nèi)置數(shù)據(jù)結(jié)構(gòu)Built-inDataStructuresCommonlyUsedinPythonChapter02內(nèi)置函數(shù)數(shù)據(jù)結(jié)構(gòu)有幾種?通俗說法列表字典集合元組ListTupleDictionarySet2.2.1列表——列表的創(chuàng)建
列表是最常用的Python數(shù)據(jù)類型,它表示為一個方括號內(nèi)由逗號分隔的若干元素,常見創(chuàng)建列表的形式有如下4種:中括號創(chuàng)建的形式為:<List_name>=[<element_1>,<element_2>,…,<element_n>]。(2)list創(chuàng)建的形式為:<List_name>=list(<tuple|string>)。(3)range()創(chuàng)建整數(shù)列表的形式為:<list_name>=range([<start_value>,]<end_value>[,<step>])。Python3中
range()返回的是一個range對象,而不是列表;我們需要通過
list()方法將其轉(zhuǎn)換成列表對象。(4)使用列表推導(dǎo)式可以非常方便的創(chuàng)建列表,在軟件開發(fā)中經(jīng)常使用。常用形式為:①
[<expression>for<variable>in<list>]。如:[iforiinrange(1,11)],創(chuàng)建集合為[1,2,3,4,5,6,7,8,9,10]。②[<expression>for<variable>in<list>if<condition>]。如:[x*2forxinrange(100)ifx%9==0],創(chuàng)建集合為[0,18,36,54,72,90,108,126,144,162,180,198]。
列表的元素不需要具有相同的類型,它是一種有序的集合,可以隨時添加、刪除和修改其中的元素。2.2.1列表——列表的創(chuàng)建例2.8創(chuàng)建列表示例。list1=['S1','張三','男',20,'計算機(jī)系']list2=list('Pythonprogram')list3=range(-3,16,2)list4=[x*3forxinrange(5)]print('list1=',list1)print('list2=',list2)print('list3=',list3)print('list4=',list4)運(yùn)行結(jié)果如圖2.4所示。2.2.1列表——列表的基本操作我們可以對列表的元素進(jìn)行讀取、增加、刪除、修改和嵌套操作。(1)讀取元素按下標(biāo)讀取元素,形式為:<list_name>[<index>]。按項遍歷整個列表,形式為:for<variable>in<list_name>:print(<variable>)。按序號遍歷整個列表,形式為:for<index>inrange(len(list_name)):print(list_name[index])。例2.9查找列表元素示例。lst=['S1','張三','男',20,'計算機(jī)系']print(lst[3])forseinlst:print(se,end='')print('\r')foriinrange(len(lst)):print(lst[i],end=',')
2.2.1列表——列表的基本操作(2)添加元素在尾部追加元素,形式為:<list_name>.append(<element>)。在某個位置插入元素,形式為:<list_name>.insert(<index>,<element>)。例2.10
列表中添加元素示例。lst=['S1','張三','男',20,'計算機(jī)系']lst.append('山東青島')lst.insert(3,'團(tuán)員')print(lst)2.2.1列表——列表的基本操作(3)刪除元素刪除列表中元素,形式為:<list_name>.remove(<element>)。按下標(biāo)刪除元素,形式為:<list_name>.pop(<index>)。切片刪除元素,形式為:del<list_name>[<start>:<end>]。清空列表,形式為:<list_name>.clear()。例2.11利用remove刪除列表中元素示例。lst=['S1','張三','男',20,'計算機(jī)系','山東青島']lst.remove('計算機(jī)系')print(lst)例2.12利用pop刪除列表中元素示例。lst=['S1','張三','男',20,'計算機(jī)系','山東青島']lst.pop(3)print(lst)例2.13利用del刪除列表中元素示例。lst=['S1','張三','男',20,'計算機(jī)系','山東青島']dellst[2:4]print(lst)2.2.1列表——列表的基本操作(4)修改元素
按下標(biāo)修改元素,形式為:<list_name>[<index>]=<new_element>;也可以先刪除列表的元素,然后再增加新元素。(5)嵌套
如果列表的元素還是列表,則稱為列表嵌套。最常用的是多維數(shù)組可以用列表嵌套表示。如3×3矩陣。
列表嵌套為:matrix=[[12,-5,3],[0,14,-11],[23,-45,8]]matrix=2.2.1列表——列表的基本操作(6)排序列表元素按值升序,形式為:<list_name>.sort()。列表元素按值降序,形式為:<list_name>.sort(reverse=True)。列表元素翻轉(zhuǎn)逆序,形式為:<list_name>.reverse()。例2.14列表排序示例。lst=['s','d','r','w','k','h','e']print(lst)lst.sort()print('升序排序結(jié)果:',lst)lst.sort(reverse=True)print('降序排序結(jié)果:',lst)此程序運(yùn)行結(jié)果如圖所示。(7)長度列表元素個數(shù)形式為:len(<list_name>)。2.2.2元組——元組的創(chuàng)建
元組表示為一個小括號內(nèi)由逗號分隔的若干元素。訪問的方式和列表一樣,使用元組的下標(biāo)進(jìn)行訪問。常見創(chuàng)建元組的形式有:圓括號創(chuàng)建的形式為:<tuple_name>=(<element_1>,<element_2>,…,<element_n>)。(2)逗號創(chuàng)建的形式為:<tuple_name>=<element_1>,<element_2>,…,<element_n>。(3)tuple創(chuàng)建形式為:<tuple_name>=tuple(<list_name>)。(4)單元素創(chuàng)建形式為:<tuple_name>=(<element>,)。
元組可以認(rèn)為是封閉的列表,一旦定義,就不可以改變(不能添加、刪除或修改)。2.2.2元組——元組的基本操作元組元素是不可變的,順序是有序的。(1)讀取元素
按下標(biāo)讀取元素,形式為:<tuple_name>[<index>]
讀取元素下標(biāo),形式為:<tuple_name>.index(<element>)(2)合并
可以直接使用+號進(jìn)行元組合并,形式為:<tuple_name_1>+<tuple_name_2>例2.15元組基本操作示例。tup_1=('S3','許文秀','女',20,'計算機(jī)系')tup_2=('S7','劉德峰','男',22,'電信系')tup=tup_1+tup_2print(tup)2.2.3字典——字典的創(chuàng)建字典是另一種可變?nèi)萜髂P?,且可存儲任意類型對象。字典的元素由鍵和值構(gòu)成,鍵和值用冒號分割,每個元素之間用逗號分割,整個字典的元素包含在花括號中?;ɡㄌ杽?chuàng)建的形式為:<dict_name>={<key_1>:<value_1>,<key_2>:<value_2>,…,<key_n>:<value_n>}。(2)空字典創(chuàng)建的形式為:<dict_name>={}|dict()。關(guān)于鍵,說明兩點(diǎn):程序需要通過鍵來訪問值,因此字典中的鍵盡量不要重復(fù)。鍵必須不可變??梢杂脭?shù)字、字符串或元組作為鍵,但不能用列表。2.2.3字典——字典的基本操作
字典中包含多個<key>:<value>對,而<key>是字典的關(guān)鍵數(shù)據(jù),因此程序?qū)ψ值涞牟僮鞫际腔趉ey的。讀取values,可以通過下標(biāo)讀取值的形式為:<dict_name>[<key>]。(2)添加元素,形式為:<dict_name>[<key>]=<value>。(3)刪除元素,形式為:del<dict_name>[<key>]。(4)修改元素,形式為:<dict_name>[<key>]=<new_value>。(5)判斷字典中是否包含某鍵,形式為:<key>in|notin<dict_name>。2.2.3字典——字典的基本操作例2.16
字典基本操作示例。
dit={'學(xué)號':'S1','姓名':'許文秀','性別':'女','年齡':20,'系部':'計算機(jī)系'}print('讀取字典值:')forkeyindit.keys():print(dit[key],end='')dit['籍貫']='廣西北海'print('\n添加元素:籍貫:廣西北海:')print(dit)deldit['性別']print('刪除元素:性別:女:')print(dit)dit['年齡']=22print('修改年齡為22:')print(dit)
程序運(yùn)行結(jié)果如圖所示。2.2.3字典——字典常用方法(1)clear()該方法用于清空字典中所有的元素,形式為:<dict_name>.clear()(2)get()該方法根據(jù)<key>來獲取<value>,形式為:<dict_name>.get(<key>)(3)update()該方法可使用一個字典所包含的元素來更新已有的字典。在執(zhí)行
update()方法時,如果被更新的字典中已包含對應(yīng)的元素,那么原值會被覆蓋;如果被更新的字典中不包含對應(yīng)的元素,則該元素被添加進(jìn)去。形式為:<dict_name>.update(<dict_name_new>)(4)items()、keys()和values()這三個方法(mathod)分別用于獲取字典中的所有元素、所有鍵和所有值,形式為:<dict_name>.<mathod>2.2.3字典——字典常用方法例2.17字典常用方法示例。dit={'學(xué)號':'S1','姓名':'許文秀','性別':'女','系部':'計算機(jī)系'}dit1={'學(xué)號':'S1','姓名':'王萍','數(shù)據(jù)庫原理':82,'數(shù)據(jù)挖掘':92}dit.update(dit1)print('update方法更新字典:')print(dit)dit2=dit.items()print('獲取字典所有元素:')print(dit2)
程序運(yùn)行結(jié)果如圖所示。2.2.4集合——集合的創(chuàng)建大括號創(chuàng)建的形式為:<set_name>={<element_1>,<element_2>,…,<element_n>}。(2)函數(shù)set()創(chuàng)建形式為:set(<list_name>|<string>)。(3)空集合創(chuàng)建的形式為:{}|set()。因為集合元素具有不重復(fù)的特點(diǎn),所以若傳入的參數(shù)有重復(fù),則會自動忽略。因此它非常適合用來消除重復(fù)元素。
例2.18
利用集合消除重復(fù)元素示例。se1=set([23,32,-4,56,-4,23,-4])se2=set('sretopsww')print(se1,'\n',se2)集合(Set)是一個無序且不重復(fù)的元素集合,是一種類似列表和字典的數(shù)據(jù)結(jié)構(gòu)。2.2.4集合——集合的基本操作因為集合是無序的,所以不可以用索引訪問集合元素,也不能做切片操作,更沒有鍵可用來獲取集合中元素的值。(1)讀取集合成員讀取集合大小,形式為:len(<set_name>)。讀取集合成員,形式為:for<variable>in<set_name>:print(<variabl>)。(2)添加元素,形式為:<set_name>.add(<element>)。(3)刪除元素,形式為:<set_name>.discard|remove(<element>)。(4)拋出元素,形式為:<set_name>.pop()。例2.19集合的基本操作示例se={23,32,-4,56,4,’a’,’m’}forxinse: print(x,end=’’)se.add('##')se.discard(32)print('\r')forxinse: print(x,end='')print('\n',se.pop())2.2.4集合——集合運(yùn)算集合之間可以進(jìn)行數(shù)學(xué)集合運(yùn)算(例如:并、交、差等),可以利用相應(yīng)的操作符或方法來實現(xiàn)。假設(shè)se1={'b','a','d','e','c'},se2={'p','r','b','o','t','e','c'},集合運(yùn)算及示例如表所示。運(yùn)算符含義方法說明示例結(jié)果|并union()se1∪se2se1|se2{'e','c','o','t','b','d','r','p','a'}&交Intersection()se1∩se2se1&se2{'e','c','b'}-差Difference()se1-se2se1-se2{'d','a'}^異或sysmmetricdifferencese1∪se2-se1∩se2se1^se2{'d','o','r','p','t','a'}3正則表達(dá)式RegularExpressionChapter032.3正則表達(dá)式
正則表達(dá)式是一個特殊的字符序列,可以方便的檢查一個字符串是否與某種模式匹配,利用它可以方便地進(jìn)行字符串的檢索、替換、匹配等操作。Python語言中re(RegularExpression)模塊擁有全部的正則表達(dá)式功能。2.3正則表達(dá)式——概述Python支持的正則表達(dá)式中常用字符及含義如表所示。模式說明示例\d匹配一個數(shù)字“\d{3}\s+\d{2,8}”的含義如下:\d{3}:表示匹配3個數(shù)字,例如'028';\s+:表示匹配至少一個空格;\d{2,8}:表示匹配2~8個數(shù)字,例如'1245’。該表達(dá)式可以匹配以任意個空格隔開區(qū)號的電話號碼。例如'01057216520'\D匹配非數(shù)字\w匹配一個字符:[A-Za-z0-9_]\W匹配非字母字符,即匹配特殊字符.匹配除換行符外的任意一個字符\s匹配任意一個空白字符,等價于[\t\n\r\f]*匹配任意個字符,包括0個+匹配至少一個字符?匹配0個或一個字符{n,m}匹配n~m個字符{n}允許前一個字符只能出現(xiàn)n次a{3}b:可以匹配'aaab'a|b匹配a或者b(P|p)ython:可以匹配'Python'或者'python'^匹配行首^\d:表示行必須以數(shù)字開頭$匹配行尾$\d:表示行必須以數(shù)字結(jié)尾2.3正則表達(dá)式——概述表達(dá)式說明[0-9a-zA-Z\_]匹配一個數(shù)字、大小寫字母或者下劃線[0-9a-zA-Z\_]+匹配至少由一個數(shù)字、大小寫字母或者下劃線組成的字符串[a-zA-Z\_][0-9a-zA-Z\_]*匹配由字母或下劃線開頭,后邊任意個有數(shù)字、字母或者下劃線組成的字符串[a-zA-Z\_][0-9a-zA-Z\_]{0,19}精確地限制了變量的長度是1-20個字符
用[]來表示范圍,表給出了常用正則表達(dá)式及含義。2.3正則表達(dá)式——match()方法Match()方法從字符串的起始位置匹配一個模式,如果不是起始位置匹配成功的話,match()就返回none。匹配到的數(shù)據(jù)通常使用方法group(num)(返回num小組字符串)或groups()(返回所有小組字符串)等方法來提?。ㄗ址袷剑?,match()方法常用形式如下:re.match(<pattern>,<string>[,flags=0])參數(shù)說明:(1)pattern:匹配的正則表達(dá)式。(2)string:要匹配的字符串。(3)
flgs:標(biāo)志位,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等。多個標(biāo)志可以通過按位
OR(|)來指定。如re.I|re.M被設(shè)置成
I
和M
標(biāo)志??蛇x標(biāo)志修飾符如表所示。要使用Python3中的re則必須引入re模塊,該模塊提供了一些正則表達(dá)式的處理方法,這些方法使用一個模式字符串做為它們的第一個參數(shù)。2.3正則表達(dá)式——match()方法修飾符說明re.I使匹配忽略大小寫re.L做本地化識別(locale-aware)匹配re.M多行匹配,影響“^”和“$”re.S表示“.”的作用擴(kuò)展到整個字符串,包括“\n”re.U根據(jù)Unicode字符集解析字符。這個標(biāo)志影響“\w”,“\W”re.X該標(biāo)志通過更靈活的格式以便將正則表達(dá)式寫得更易于理解表
可選標(biāo)志修飾符2.3正則表達(dá)式——match()方法例2.20match()方法應(yīng)用示例。importrestr1='hello123456789word_thisisjustatest'parttern='^Hello\s\d{9}.*test$''''“^”標(biāo)識開頭,這里匹配以Hello開頭的字符串;“\s”匹配空白字符串;“\d{9}”匹配9位數(shù)字;“.”匹配除了換行符之外的任意字符;“*”匹配零次或多次,二者結(jié)合起來能夠匹配任意字符(除換行符);“$”標(biāo)識結(jié)尾,這里匹配以test結(jié)尾的字符串'''result=re.match(parttern,str1,re.I)print(result)print(result.group())#group()方法輸出匹配到的內(nèi)容print(result.span())#span()方法輸出匹配的范圍2.3正則表達(dá)式——search()方法Search()方法掃描整個字符串并返回第一個成功的匹配,search()方法常用形式如下:re.search(<pattern>,<string>[,flags=0])參數(shù)同match()方法。例2.21search()方法應(yīng)用示例。importreline='Infact,catsaresmarterthandogs'result=re.search(r'(.*)are(.*?).*',line,re.M|re.I)ifresult:print('result.group():',result.group())print('result.group(1):',result.group(1))print('result.group(2):',result.group(2))2.3正則表達(dá)式——search()方法例2.22match()和search()比較示例。importreline=’Inface,catsaresmarterthandogs’matchstr=re.match(r'dogs',line,re.M|re.I)ifmatchstr:print("match-->matchstr.group():",matchstr.group())else:print("Nomatch!!")matchstr=re.search(r'dogs',line,re.M|re.I)ifmatchstr:print("search-->matchstr.group():",matchstr.group())else:print("Nomatch!!")程序運(yùn)行結(jié)果如圖2.8所示。match()方法只檢測字符串開頭位置是否匹配,匹配成功才會返回結(jié)果,否則返回None;而search()方法會在整個字符串內(nèi)查找模式匹配,直到找到第一個匹配后返回一個包含匹配信息的對象,該對象可以通過調(diào)用group()方法得到匹配的字符串,如果字符串沒有匹配,則返回None。
2.3正則表達(dá)式——sub()方法Sub()方法通過正則表達(dá)式,實現(xiàn)比字符串函數(shù)replace()更加強(qiáng)大的替換功能。sub()方法常用形式如下:sub(pattern,repl,string,count=0,flag=0)參數(shù)說明:(1)pattern:正則表達(dá)式的字符串。(2)repl被替換的內(nèi)容。(3)string正則表達(dá)式匹配的內(nèi)容。(4)count:由于正則表達(dá)式匹配的結(jié)果是多個,使用count來限定替換的個數(shù)(從左向右),默認(rèn)值是0。(5)flags是匹配模式,可以使用按位或者“|”表示同時生效,也可以在正則表達(dá)式字符串中指定。2.3正則表達(dá)式——sub()方法例2.23
sub()方法應(yīng)用示例。importrephone='0517-3214-7231#這是一個公司的電話號碼'num=re.sub(r'#.*$','',phone)#刪除注釋print('電話號碼:',num)num=re.sub(r'\D','',phone)#移除非數(shù)字的內(nèi)容print('電話號碼:',num)2.3正則表達(dá)式——findall()方法Findall()方法在字符串中找到正則表達(dá)式所匹配的所有子串,并返回一個列表;如果沒有找到匹配的,則返回空列表。findall()方法常用形式如下:findall(pattern,string,flags=0)參數(shù)說明:(1)pattern:正則表達(dá)式。(2)string:需要處理的字符串。(3)flags:說明匹配模式。例2.24提取完整的年月日和時間字段。importrestr1='se2342022-10-0907:30:002022-10-1007:25:00最新疫情'p=r'\d{4}-\d{2}-\d{2}\d{2}:\d{2}:\d{2}'content=re.findall(p,str1,re.M)print(content)2.3正則表達(dá)式——提取網(wǎng)頁中的信息例2.25提取字符串中的漢字。importrestr1='<h1>hello你好,world世界</h1>'chinese_pattern='[\u4e00-\u9fa5]+'#漢字編碼范圍chinese_str=re.findall(chinese_pattern,str1)forchinchinese_str:print(ch,end='')2.3正則表達(dá)式——提取網(wǎng)頁中的信息例2.26提取字符串中的URL。importredefFind(string):url_pattern=r'[]a-zA-Z.)+://[^\s]*'url=re.findall(url_pattern,string)returnurlstr_url='我們常用網(wǎng)站很多,下面列出兩個,如Runoob的網(wǎng)頁地址為:,Goog的網(wǎng)址為:'str1=Find(str_url)forchinstr1:ifch!='':print(ch,end='')2.3正則表達(dá)式——提取網(wǎng)頁中的信息例2.27抓取網(wǎng)頁,提取網(wǎng)頁中的網(wǎng)址和漢字信息。fromurllib.requestimporturlopen
#
urllib.request.urlopen()函數(shù)用于實現(xiàn)對目標(biāo)url的訪問importretext=urlopen('').read().decode()#正則表達(dá)式提取網(wǎng)頁中的網(wǎng)址s='/message.asp?id=35'ret=re.sub(r'(https://.+?)/.*',lambdax:x.group(1),s)print('在網(wǎng)頁數(shù)據(jù)中提取的網(wǎng)址:\n',ret)str1=re.findall(u'[\u4e00-\u9fa5]+',text)print('在網(wǎng)頁數(shù)據(jù)中提取漢字信息:\n',str1)4文件操作FileOperationChapter042.4文件操作——文件的打開與關(guān)閉
文件處理的流程為:先打開文件,得到文件句柄并賦值給一個變量;再通過句柄對文件進(jìn)行操作;最后關(guān)閉文件。
用Python內(nèi)置的open()函數(shù)打開一個文件,創(chuàng)建一個file對象,并用相關(guān)的方法才可以調(diào)用它進(jìn)行讀寫。open()函數(shù)常用形式為:file<file_variable>=open(<file_name>[,<mode>][,<buffering>])參數(shù)說明:(1)
file_name:是指打開的文件名,若非當(dāng)前路徑,需指出具體路徑。(2)mode:是指打開文件的模式,如下表所示。2.4文件操作——文件的打開與關(guān)閉模式功能說明r只讀模式默認(rèn)模式,文件必須存在,否則拋出異常w只寫模式不可讀;不存在則創(chuàng)建;存在則清空內(nèi)容x只寫模式不可讀;不存在則創(chuàng)建,存在則報錯a追加模式可讀;不存在則創(chuàng)建;存在則只追加內(nèi)容,文件指針自動移到文件尾說明:“+”表示可以同時讀寫某個文件。如r+、w+、x+、a+均表示對打開的文件進(jìn)行可讀,可寫?!癰”表示以字節(jié)的方式操作,以二進(jìn)制模式打開文件,而不是以文本模式。如:rb
或
r+b、wb
或
w+b、xb
或
w+b、ab
或
a+b。但是以b方式打開時,讀取到的內(nèi)容是字節(jié)類型,寫入時也需要提供字節(jié)類型,不能指定編碼。
文件使用完畢后必須關(guān)閉,語法形式為:<file_variable>.close()2.4文件操作——讀文件操作Python文件對象提供了三個“讀”方法:read()、readline()和readlines()。每種方法可以接受一個變量以限制每次讀取的數(shù)據(jù)量。(1)read()函數(shù)每次讀取整個文件,它通常用于將文件內(nèi)容放到一個字符串變量中。如果文件大于可用內(nèi)存,為了保險起見,可以反復(fù)調(diào)用read(size)方法,每次最多讀取size個字節(jié)(小于可用內(nèi)存)的內(nèi)容。(2)readline()函數(shù)每次只讀取一行,通常比readlines()
慢得多。僅當(dāng)沒有足夠內(nèi)存可以一次讀取整個文件時,才應(yīng)該使用readline()。(3)readlines()函數(shù)一次讀取整個文件,像read()
一樣。readlines()
自動將文件內(nèi)容分成一個行的列表,該列表可以由Python的for
...in
...結(jié)構(gòu)進(jìn)行處理。
注意:這三種方法是把每行末尾的'\n'也讀進(jìn)來了,它并不會默認(rèn)的把'\n'去掉。需要去掉時,我們可以手動去掉。2.4文件操作——讀文件操作例2.28讀取文件示例。文件名為D:\\Data_Mining\Poetry.txt,內(nèi)容為如下:春夜喜雨杜甫好雨知時節(jié),當(dāng)春乃發(fā)生,隨風(fēng)潛入夜,潤物細(xì)無聲。野徑云俱黑,江船火獨(dú)明,曉看紅濕處,花重錦官城。將文件內(nèi)容讀出并顯示出來。file='D:\\Data_Mining\poetry.txt'f=open(file,'r',encoding='utf-8')#存儲txt文件時,“編碼”必須選“UTF-8”foriinrange(2):
first_line=f.readline()#讀第1行
print(first_line)#輸出第1行data=f.read()#讀取剩下的所有內(nèi)容,文件大時不要用print(data)#輸出讀取內(nèi)容f.close()#關(guān)閉文件2.4文件操作——寫文件操作
在進(jìn)行文件寫操作時,如果該文件不存在,則會創(chuàng)建文件。如果文件存在,則將原文件中的內(nèi)容刪除,再寫入新內(nèi)容。需要說明的是,在寫文件時,只有調(diào)用close()方法時,操作系統(tǒng)才能保證把沒有寫入的數(shù)據(jù)全部寫入磁盤。write()函數(shù)是文件寫操作中一個比較簡單的操作,它將字符串寫入文件,沒有返回值。(2)writelines()函數(shù),這個函數(shù)是向文件中寫入一個序列字符串列表。2.4文件操作——寫文件操作例2.29文件寫操作示例。在文件D:\\DATA_Mining\Poetry.txt中最后一行添加內(nèi)容“《春夜喜雨》是唐詩名篇之一,是杜甫上元二年(761年)在成都草堂居住時所作?!?/p>
file='D:\\DATA_Mining\poetry.txt'f=open(file,'a+',encoding='utf-8')#打開文件str1='《春夜喜雨》是唐詩名篇之一,是杜甫上元二年(761年)在成都草堂居住時所作。'f.write('\n')f.write(str1)f.close()f=open(file,'r',encoding='utf-8')data=f.read()print(data)f.close()
程序運(yùn)行結(jié)果如圖所示。2.4文件操作——文件的其他操作
如果對文件指定的位置進(jìn)行讀寫操作,就需要先將文件讀寫指針移動到我們想要的位置,然后再對文件進(jìn)行寫入等操作。seek()方法用于移動文件讀取指針到指定位置。常用形式為:<file_variable>.seek(offset[,whence])參數(shù)說明:(1)offset:開始的偏移量,代表需要移動偏移的字節(jié)數(shù)。(2)whence:可選,默認(rèn)值為0。給offset參數(shù)一個定義,表示要從哪個位置開始偏移;0代表從文件開頭開始算起,1代表從當(dāng)前位置開始算起,2代表從文件末尾算起。
返回值:如果操作成功,則返回指定的文件位置,如果操作失敗,則返回-1。2.4文件操作——文件的其他操作例2.30seek()方法應(yīng)用示例。file='D:\\Data_Mining\poetry.txt'f=open(file,'r+',encoding='utf-8')print('文件名為:',)line=f.readline()print('讀取的數(shù)據(jù)為:',line)f.seek(0,1)#重新設(shè)置文件讀取指針到開頭line=f.readline()print('讀取的數(shù)據(jù)為:',line)f.close()程序運(yùn)行結(jié)果如圖所示。本章結(jié)束啦!歡迎課后繼續(xù)交流~第3章Python數(shù)據(jù)挖掘中的常用模塊CommonModulesinPythonDataMiningNumPy模塊3.2學(xué)習(xí)目標(biāo)3.13.33.43.5Pandas模塊Matplotlib圖表繪制基礎(chǔ)Scikit-learn股票數(shù)據(jù)簡單分析Python數(shù)據(jù)挖掘中的常用模塊Python具有強(qiáng)大的擴(kuò)展能力,其中的數(shù)據(jù)分析與挖掘常用模塊幾乎可以滿足各種需求??茖W(xué)計算模塊NumPy提供了矩陣運(yùn)算;基于NumPy的數(shù)據(jù)分析處理模塊Pandas提供了一些數(shù)據(jù)挖掘的工具;數(shù)據(jù)可視化模塊Matplotlib
具有Python中類似MATLAB的繪圖工具;針對Python編程語言免費(fèi)軟件的機(jī)器學(xué)習(xí)模塊Scikit-learn具有常用的分類、回歸和聚類等算法。
1NumPy模塊NumPyModule3.13.1.1NumPy數(shù)據(jù)類型
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公關(guān)專員工作總結(jié)
- 人工智能銷售工作總結(jié)
- 制藥客服工作總結(jié)
- 汽車維修前臺服務(wù)員工作總結(jié)
- 小學(xué)母親節(jié)做賀卡的精美作文集錦六篇
- 2024年度建筑工程土石料供應(yīng)與服務(wù)合同3篇
- 時尚顧問工作總結(jié)
- 酒店管理的技巧
- 娛樂場所助理職責(zé)描述
- 燈光師勞動合同三篇
- 音樂行業(yè)商業(yè)計劃書
- 《供應(yīng)商質(zhì)量會議》課件
- 高壓電纜安裝指導(dǎo)書
- 越劇團(tuán)管理制度
- 2020山東春季高考數(shù)字媒體真題
- 任務(wù)3干鮑魚漲發(fā)
- 氣體檢測系統(tǒng)中英文對照外文翻譯文獻(xiàn)
- 湖北省武漢市洪山區(qū)2022-2023學(xué)年四年級上學(xué)期期末考試科學(xué)試題
- 新一代大學(xué)英語發(fā)展篇綜合教程2答案
- 公務(wù)員調(diào)任(轉(zhuǎn)任)審批表 - 陽春人才網(wǎng)
- 土地利用動態(tài)遙感監(jiān)測規(guī)程
評論
0/150
提交評論