官术网_书友最值得收藏!

2.7 Python基礎

Python是一種面向對象的解釋型程序設計語言,在1989年由Guido van Rossum在荷蘭國家數學和計算機科學研究所設計,并于1991年公開發行。

Python的源代碼和解釋器CPython全部遵循GPL(General Public License,通用公共許可)協議。任何人均可到Python的官方網站[39],以源代碼或二進制形式下載Python解釋器及其標準擴展庫,也可以自由分發。該網站還提供了大量的第三方Python模塊、程序、工具及附加文檔。

Python語言結構簡單,容易學習。Python包含豐富的跨平臺標準庫,可以方便地在UNIX、Windows和Mac操作系統之間切換。作為一種粘合劑語言,Python可以方便地粘合其他語言編寫的代碼,如C、C++和FORTRAN編寫的程序。雖然Python語言功能強大,操作簡潔,但本節主要講解Python語言的網絡數據抓取功能,即如何使用簡單的Python語言編寫代碼,快速而準確地抓取網頁上的內容。

雖然可以使用工具從網站上收集數據,但很多個性化數據的獲取依舊需要使用編程來實現。考慮到易用性,Python才是數據獲取的最佳選擇[40](見圖2.48)。

圖2.48 編程語言排行

2.7.1 環境配置

Mac操作系統自帶的Python不需配置即可使用,允許多個版本同時存在。圖2.49顯示系統中包含Python2.7.10和Python3.7.0兩個版本。

圖2.49 Mac系統安裝的兩個Python版本

Windows系統下,Python的安裝非常簡單。雙擊下載的安裝包,出現Python安裝向導,見圖2.50,建議勾選界面底部的“Install launcher for all users (recommended)”和“Add Python3.5to PATH”選項,選擇“Install Now”,然后單擊“下一步”按鈕,即可完成安裝。

圖2.50 Python安裝向導

說明:

① 如果希望修改安裝位置,可以選擇“Customize installation”自定義安裝模式。

② 如果沒有勾選“Add Python3.5to PATH”選項,需要設置環境變量,設置方法如下。

右擊“計算機”,在出現的快捷菜單中選擇“屬性|高級系統設置”,在“高級”選項卡中選擇“環境變量”,在彈出的對話框的“系統變量”中選擇“Path”,見圖2.51,然后單擊“編輯”按鈕;在彈出的“編輯系統變量”對話框的“變量值”中添加Python的安裝路徑,見圖2.52。如Python的安裝路徑是“C:\python”,則添加“;C:\python”(不區分大小寫),前面的“;”是為了分隔多個安裝路徑。

安裝結束后,可以在“cmd命令行”中輸入“python”,如果出現圖2.53所示的Python版本的數據,則表明安裝正確。

另外,退出Python的函數是“exit( )”。

也可以選擇“開始”菜單的“Python3.5|IDLE(Python3.564-bit)”,出現圖2.54所示的信息,表明安裝正確。

圖2.51 設置Python環境變量

圖2.52 編輯系統變量

圖2.53 命令行顯示Python版本的數據

圖2.54 Python交互窗口

2.7.2 第一個Python程序

我們用2.7.1節介紹的第二種方法進入Python交互窗口,完成第一個Python程序。先嘗試Python的使用方法,使用“print("hello world")”函數實現輸出,見圖2.55。

圖2.55 第一次使用Python

然后新建第一個Python程序,并運行該程序,見圖2.56,具體步驟如下。

<1> 選擇“File|New File”菜單命令,新建程序文件。然后輸入如下代碼,注意英文大小寫。

<2> 選擇“File|Save”菜單命令,保存文件為“1.py”。

<3> 選擇“Run|Run Module”菜單命令或按F5鍵運行程序,結果見圖2.56。

圖2.56 程序“1.py”運行結果

說明:

① 函數print( )是Python的一個重要輸出函數,功能是將括號中的一個或多個對象輸出。本例中將字符串“hello world”直接輸出。實際上,該函數還可以輸出數值、布爾、列表和字典等對象。

② Python語言嚴格區分大小寫,使用函數時注意括號和雙引號均為英文格式。

2.7.3 變量和運算符

變量是在程序運行過程中值允許改變的量。變量存儲在計算機的內存中,Python變量不需要聲明,變量被賦值后就意味著創建了變量,即根據賦值的數據類型在內存中開辟一塊空間保存變量的值,因此變量可以是整數,也可以是小數,還可以是字符等,在后續章節中有更詳細的介紹和使用。常見的變量使用方法如下。

第1條語句為變量var1賦值為整數1,第2條語句為變量var2賦值為小數“3.14”,第3條語句為變量var3賦值為字符串"abc"。

用“=”為變量賦值,左側是變量名,右側是變量值。Python也允許同時為多個變量賦相同或不同的值,格式如下。

變量名是標識符的一種,必須嚴格遵守Python標識符的規定。變量名的首字符必須是字母或下劃線,其他字符可以包含字母、數字和下劃線。注意,變量名不可以是Python保留的關鍵字。查看Python關鍵字的方法是進入幫助功能,然后輸入“keywords”,具體方法如下。

注意:help( )函數的功能是查看函數或模塊用途的詳細說明,按q鍵退出幫助。

Python的關鍵字有25個,見圖2.57。

圖2.57 Python的關鍵字

變量被賦值后,可以使用type( )函數查看變量中保存值(或者說對象)的數據類型,使用id( )函數查看其分配的內存空間,具體方法如下。

說明:

① 變量var1保存的對象是整數數據(int),變量var2保存的對象是浮點(也稱為小數)型數據(float),這兩種數據統稱為數值型數據。變量var3保存的對象是字符串(str)。

② 對象是有數據類型的,但變量無數據類型。如上例中的小數“3.14”是浮點型數據類型的對象,被賦予變量var2,變量可以被多次賦值,每次賦值的對象的數據類型可以是不同的。例如:

Python有6種數據類型,分別是Number(數字)、String(字符串)、List(列表)、Tuple(元組)、Sets(集合)、Dictionary(字典)。本節主要介紹前3種數據類型。

1.Number(數字,也稱為數值)型數據

Python支持4種數值型數據,除了前面使用的int和float,還有bool(布爾)和complex(復數)。

布爾型數據僅包含“True”和“False”兩個值,對應的數字分別是“1”和“0”,它們可以與數字相加,任意布爾型數據也可以相加。例如:

復數型數據由實數和虛數構成,如“a + bj”,或者用函數complex(a,b)表示。例如:

2.String(字符串)型數據

字符串是由單引號(')或雙引號(")括起來的零個或多個字符。字符串的索引以“0”為初始值,索引“-1”為右側末尾的位置。如2.7.2節中第一個Python程序中的字符串"hello world",字符串的索引值可以方便地將字符串中的部分字符取出,例如:

說明:

① “[0]”表示字符串的第1個字符,“[-1]”表示字符串的最后一個字符。

② “[3:]”表示字符串的第4個至最后一個字符。

③ “var8*2”表示復制當前字符串,數字表示復制的次數。

④ "UCASS" + var8表示將兩個字符串連接。

⑤ “[6:9]”表示字符串的第7~9個字符。

字符串使用“+”運算符時,必須保證左右兩側均是字符串,若數據類型不正確,可能導致出錯。例如:

說明:

① 表達式“100+ var8”中,“+”運算符左側不是字符串,運算后產生了錯誤。

② 可以使用str(100)函數將數字100變成字符串"100",即可避免這類問題。

字符串中的“\”是轉義特殊字符,具有特殊的含義。如“\n”表示換行,如不希望“\”轉義,可以在字符串前面添加字符“r”,常見的轉義特殊字符見表2.6。例如:

表2.6 轉義特殊字符

字符串還有一個經常使用的函數len( ),其功能是返回字符串的長度。例如:

3.List(列表)型數據

Python的列表型數據功能強大,在進行網頁內容獲取的時候被頻繁使用。列表由寫在“[ ]”之間、用“,”分隔的元素構成。列表中元素的類型可以不同,最常用的元素類型是數字、字符串和嵌套列表(即列表中的一個元素是另一個列表)。定義列表類型的變量方法如下。

與字符串類似,也可以使用索引值表示列表中的元素。例如:

說明:

① “print(var9)”表示輸出列表的全部元素。

② “var9[0]”表示列表的第1個元素。

③ “var9[2:]”表示列表的第3個至最后一個元素。

④ “var9*2”表示復制當前列表2次。

列表的常用函數有append( )、reverse( )、count( )、index( )、insert( )、remove( )和sort( )等。

函數append( )的功能是將參數追加入列表對象的結尾。reverse( )函數的功能是將列表對象中的元素按所在位置進行反轉。count( )函數的功能是返回列表中某元素的個數。例如:

函數index( )的功能是返回參數在列表中的索引位置。函數insert( )的功能是在任何位置增加一個列表元素。函數remove( )的功能是刪除列表元素。例如:

說明:

① 函數insert( )包含兩個參數,第一個參數是索引值,第二個參數是插入內容。

② 函數remove( )只有一個參數,即刪除的列表元素,若列表中包含參數,則刪除列表中找到的第一個列表元素,如上例var9.remove("abc")只刪除第一個元素"abc",而未刪除第二個"abc"元素。若參數并不能在列表中找到,則返回錯誤提示數據。

思考:列表var9包含兩個相同的元素'abc',則函數index('abc')返回哪個的索引值?

函數sort( )的功能是對列表元素進行從小到大的排序,若列表元素的數據類型不同,則無法排序(有些Python版本也支持數據類型不同的列表元素排序,如Python2.7.10),顯示錯誤數據。例如:

說明:

① 函數sort( )出現無法排序的錯誤提示,是因為列表元素有字符串,還有整數和小數,而字符串和數值型數據是無法比較大小的。

② 函數sort( )使用“reverse=True”參數時,是按照從大到小降序排列。

③ 函數sort( )使用“key=len”參數時,是按照長度從小到大升序排列。

④ 單獨使用var9的功能與print(var9)相同,功能是輸出列表的全部元素。

Python語言支持的運算符包括算術運算符、比較(關系)運算符、賦值運算符、邏輯運算符、位運算符、成員運算符和身份運算符。賦值運算符在前面的案例中已經多次使用,算術運算符、比較(關系)運算符和邏輯運算符應用廣泛。

4.算術運算符

算術運算符見表2.7。假設變量a賦值為23,變量b賦值為10,變量c賦值為“TV”。

表2.7 算術運算符

說明:

① 乘法運算符的左右兩側均為數字型數據時,表示兩個數字相乘。當左側為字符串、右側為整數n時,表示復制左側字符串n次。

②23除以10的商是2余數是3,所以取模運算“a % b=3”,而整除運算“a // b=2”。

5.比較(關系)運算符

比較運算符見表2.8。假設變量a賦值為23,變量b賦值為10。

表2.8 比較運算符

說明:比較運算符的運算結果只能是“True”或“False”。“True”或“False”都是Python關鍵字,首字母大寫,且默認為藍色顯示。

6.邏輯運算符

邏輯運算符見表2.9。假設變量a賦值為23,變量b賦值為10,變量c賦值為0,變量d賦值為“True”,變量e賦值為“False”。

表2.9 邏輯運算符

說明:任何非零數字型數據均認為是邏輯值“True”,邏輯值“True”和“False”可以與數字型數據進行算術運算,此時邏輯值“True”被認為是數字1,“False”是數字0。

7.成員運算符

成員運算符見表2.10。假設變量a賦值為“abc”,變量b賦值為“Abc”(注意字符串的大小寫),變量c賦值為列表['ABC','UCASS','abc']。

表2.10 成員運算符

2.7.4 條件語句

Python語言包含三種語句,最簡單的是順序語句,即按照語句的先后順序執行。第二種是條件語句,根據條件進行判斷和選擇執行的語句。第三種是循環語句,根據條件決定執行的次數。

條件語句也稱為分支語句或if語句,格式如下。

說明:

① 必須使用4個空格的縮進表示語句塊的開始和結束。

② 條件和else后面的“:”必須書寫。

③ 根據需要,決定elif語句的個數及是否包含else語句。

1.單分支條件語句

條件語句的使用方法有多種情況,最簡單的單分支條件語句只包含一個if,沒有elif和else。只有一個分支。例如,新建一個程序文件test.py。

程序運行結果如下:

說明:變量a賦值為整數10,輸出時必須使用函數str(a)轉換為字符串,才能使用“+”運算符。

2.雙分支條件語句

雙分支條件語句包含兩個分支,根據條件是“True”還是“False”來決定執行的分支。例如:

程序運行結果如下:

說明:縮進表示語句塊的開始和結束,最后一行語句沒有任何縮進,不屬于if語句,也不屬于else語句,是單獨的一條順序語句,無論條件“a>0”的結果是“True”還是“False”,均執行該條語句。

3.多分支條件語句

多分支條件語句包含三個或以上的分支,根據條件結果執行相應的分支。例如:

程序運行結果如下:

說明:

① 判斷變量a是否是零值的語句是“a==0”,不能寫成“a=0”,前者“==”是比較運算符,后者“=”是賦值運算符。

② 本例中條件語句只包含一個elif分支,實際上可以根據需要包含多個elif分支,只有當前面的所有條件均不為“True”時才執行else語句。

③ 各條件不能有交集。

4.注釋

注釋是對程序代碼的解釋和說明。注釋并不執行,對程序的運行結果也沒有任何影響,主要用于幫助自己或他人更好地理解代碼。注釋要準確簡潔,格式一致,盡量保證注釋與所注釋的代碼相鄰,一般在代碼的上方或右側進行注釋。例如:

程序運行結果如下:

說明:

① 單行注釋以“#”開頭,可以在所注釋代碼的上方或右側。

② 多行注釋需要在注釋的上面使用3個英文引號、下面使用3個英文引號。引號可以是單引號或雙引號,但上下引號必須一致。

2.7.5 循環語句

在編寫程序時經常需要完成大量的重復工作,為了減少代碼的長度,提高程序可讀性,降低復雜度,可以使用循環語句完成這類問題。

Python包含兩種循環語句:for循環、while循環。

1.for循環語句

Python中的for循環語句可以方便地遍歷一個序列的全部元素,如一個列表中的每個元素,一個字符串中的每個字符。例如:

遍歷列表元素的代碼如下:

程序運行結果如下:

說明:

① 程序共循環4次。第1次循環取出列表langs中的第一個元素'Java'并打印,然后依次取出第二個、第三個、第四個元素并打印。

② 循環語句中的變量c用于臨時存儲每次循環取出的元素,此變量名只需符合標識符規則即可,名字可以任意設定。

遍歷列表元素的方法不止一種,也可以使用如下代碼實現。

說明:

① 函數len(langs)用于返回langs列表的元素個數,本例返回“4”。

② 函數range(start,end,step)包含3個參數。start設置計數的起始值。end設置計數的結束值,但不包括end。step設置每次增加的間距,默認為1。本例的range(0,4)表示從0開始,每次增加1,包含1、2、3但不包含4,即打印langs[0]、langs[1]、langs[2]、langs[3],遍歷了列表的全部元素。

遍歷字符串的代碼如下。

程序運行結果如下:

說明:

① 循環語句中的變量c用于臨時存儲字符串中的每個字符。

② 本循環語句共循環3次。

2.while循環語句

Python中,while循環語句包含一個執行條件,當條件滿足時就執行某段程序,直至條件不再滿足。例如:

使用while循環語句遍歷列表元素的代碼如下。

程序運行結果如下:

說明:

① 本例中的函數len(langs)的返回值是4。變量i的初始值是0,滿足條件,則循環1次,變量i的值重新賦值為1;然后循環判斷條件是否滿足,直到變量i賦值為4時,條件不再滿足,退出循環。本例共循環4次。

② 本例中的變量i必須在while循環語句前賦值,否則變量i沒有賦值,無法進行條件判斷。

循環語句while和for中經常使用break語句終止循環(即使滿足循環條件也會停止執行)。continue語句用于跳出本次循環,執行下一次循環。注意,break語句將終止整個循環。例如:

程序運行結果如下:

說明:

① 程序的功能是從1開始的整數相加,當和大于10時不再相加跳出循環,打印輸出。

② for循環語句的循環體包含兩條語句。第一條是“sum= sum + i”,第二條是if語句,當條件“sum >10”的結果是“True”時,執行break語句,即條件滿足退出for循環語句,執行for循環語句后面的print語句。

③ 程序最后的print語句的縮進格式表示這條語句不屬于for循環,如該語句縮進,則屬于for循環,該語句循環4次,輸出如下。

例如,語句continue如下。

程序運行結果如下:

說明:

① 程序的功能是將1~10中的奇數相加,當超出10時不再相加跳出循環,打印輸出。

② for循環語句的循環體包含兩條語句。第一條是if語句,當條件“i %2==0”的結果是“True”時,即當變量i是偶數時,執行continue語句,跳出本次循環,即不執行第二條語句“sum= sum + i”,進入下一次循環。

循環語句還有一種包含else子句的用法,當循環條件不滿足結束循環時執行,但循環被break語句終止時不執行。

輸出20~30之間的質數的代碼如下:

程序運行結果如下:

說明:

① 這是一個循環嵌套,即for循環語句中包含另一個for循環語句。

② 第二個for循環語句的范圍是range(2,n//2),“n//2”表示n整除2的值。

③ 循環語句中的if語句的條件“n % x==0”表示當n能被x整除時,執行break語句終止內部的for循環,即不執行后面的else語句。但不影響外部for循環,即終止內部嵌套的for循環后,繼續執行外部for循環。

④ 當內部for循環一直沒有滿足if條件,但因為超出range(2,n//2)范圍而終止時,執行else語句,即n不能整除2~n//2的所有整數,則可判斷其為質數。

思考:若將else語句縮進到與if語句同列,則運行結果如何?

2.7.6 輸入和輸出

Python語言經常使用print( )函數完成輸出,使用函數input( )實現輸入。函數print( )在前面的案例中已經多次使用,本節介紹如何使用該函數完成格式化輸出,例如:

程序運行結果如下:

說明:

① 函數print( )中的“%”符號表示轉換說明符的開始。轉換說明符的具體含義見表2.11。

② 函數print( )還可以設置左對齊,顯示正負號,設置最小字段寬度和精度等格式,具體參見幫助文檔[41]

表2.11 字符串格式化轉換類型

函數input( )的功能是返回用戶輸入的字符串,默認的標準輸入是鍵盤,每次僅讀入一行文本。

程序運行結果如下:

說明:

① 函數input( )包含一個參數時用于提示用戶輸入的內容。

② 程序運行input( )時,需要用戶手動輸入內容并回車后才能繼續執行其他語句。

2.7.7 文件的讀/寫

文件對象用于建立與磁盤文件的聯系,可以實現文件內容的讀取,將字符串寫入文件,或將獲取的網絡數據使用文件對象存儲,方便后續的修改和使用。

讀/寫文件前,先用open( )函數打開一個文件,該函數的功能是返回一個文件對象。其格式如下:

說明:

① 第一個參數表示文件的名字,第二個參數說明打開文件的模式,即如何使用該文件,該參數省略,表示文件以“r”模式打開。文件的打開模式見表2.12。文件的打開模式可以有多種組合,如“r”模式表示以只讀方式打開文件,“r+”模式是文件既可讀也可寫,從文件頭部開始寫,覆蓋原文件的內容,但不會創建不存在的文件。“w+”模式是文件既可讀也可寫,若文件存在,則覆蓋整個文件,與“r+”模式不同的是,若文件不存在,則新建文件。

表2.12 模式參數

② 通常情況下,文件是以文本模式打開的,讀寫采用默認的UTF-8編碼格式,以二進制模式打開的情況使用較少,一般以字節的形式進行讀寫操作。

文件對象file的常用函數見表2.13。

表2.13 文件對象的常用函數

例如,讀取文件內容的代碼如下:

說明:

① 代碼的第1行以只讀方式打開文件“test.txt”,函數open( )生成文件對象f。

② “f.name”的功能是返回文件對象f的文件名。

③ 函數f.read(10)從文件頭部開始讀取10字節后,賦值給變量line。

例如,將字符串寫入文件的代碼如下:

說明:

① 代碼第2行以只寫方式打開文件“test.txt”,若該文件不存在,則新建此文件。

② 代碼“f. write(var1)”的功能是將變量var1的字符串寫入對象f指向的文件“test.txt”。

③ 最后一行代碼用于關閉文件。

例如,從一個文件中讀取內容寫入另一個文件的代碼如下:

說明:

① 第1行缺少文件打開模式,默認表示文件以只讀模式打開。

② 循環語句while多次執行,直到文件“input.txt”中的內容全部被讀取。循環體中使用if語句判定是否退出循環,當內容全部讀取后,再次讀取時變量line的值為空,不符合條件,則使用語句break結束循環。

③ 最后2行代碼分別關閉兩個文件。

主站蜘蛛池模板: 巴彦县| 鸡西市| 托里县| 巴里| 蕲春县| 嘉善县| 四平市| 海伦市| 通化县| 布尔津县| 镇雄县| 新泰市| 平安县| 凤冈县| 东乌珠穆沁旗| 长沙市| 常熟市| 晴隆县| 建湖县| 乐业县| 库伦旗| 安龙县| 长武县| 龙海市| 施秉县| 林周县| 怀柔区| 冕宁县| 南投市| 漳浦县| 嵊泗县| 洪湖市| 共和县| 合阳县| 兴仁县| 丰顺县| 衡阳市| 新余市| 渑池县| 常宁市| 巨野县|