- Python網絡爬蟲與數據分析從入門到實踐
- 馬國俊
- 5099字
- 2024-12-28 12:00:33
1.2 Python語法入門
本節開始講解Python的基本語法,包括變量、數據類型、分支和循環語句等,這是學習Python編程的基礎,請讀者務必熟練掌握。
在講解Python的語法前,先講一個知識點,在Python語法里,是通過縮進來定義代碼的層次結構的,即同一層次的代碼都向左對齊,而下一個層次的代碼塊會有4個空格的縮進。
不同層次代碼塊縮進的空格數是約定俗成的,當然如果縮進空格數是3或者5也可以,最好做到整個程序統一,否則會降低代碼的可讀性,并會給維護代碼的工作帶來一定的難度。
1.2.1 Python常量和變量
一種編程語言通常會有常量和變量,Python語言也不例外。在Python語言中,常量就是其值不變的量,例如:數字、字符串、布爾值、空值就是常量。
變量則是在程序運行過程中,其值可以變化的量。Python變量占用內存一塊空間,用來存放變量的值(或地址),存放的值是可以發生改變的。
每一個Python變量都有一個名字,并嚴格遵循變量的命名規則:
(1)變量名必須以字母或下畫線開頭(但以下畫線開頭的變量在Python中還有特殊含義,請注意),不得使用中文或數字開頭。
(2)變量名中不能有空格或標點符號(如逗號、括號、斜線、反斜線、引號、問號、冒號、句號等)。
(3)不能使用關鍵字作為變量名,也不建議使用系統內置的模塊名、函數名、類型名作為變量名,如果這樣做可能會導致代碼無法運行。例如,不能使用input作為變量名,因為input()是一個輸入函數。
(4)變量名區分英文字母的大小寫,如name和Name是不同的變量。
(5)每個變量在使用前都必須賦值,變量賦值以后才會被創建,給變量賦值可以使用任意類型的數據。例如,Name="wang kai"(創建一個字符串變量);y_1=39(創建一個整型變量)。
1.2.2 基本數據類型
開發Python程序時,不免要和各種數據類型打交道,常見的數據類型有整型、浮點型、字符串類型和布爾型。在如下的SimpleData.py范例程序中演示了對各種基本數據類型數據的操作。

在解析上述程序代碼前,請讀者注意兩點:第一,由于在本程序中的所有代碼都是處于同一層次,所以均是靠左對齊,且沒有縮進;第二,在諸如第2行和第4行的后面,我們是用“#”作為前導符來編寫單行的注釋。
第1行代碼定義了一個整型變量times,并將16賦值給該變量。在第2行的print語句中,對times進行了加1操作,所以輸出結果是17。在第3行的val變量數值之前,使用0x前綴表示該數值為十六進制。第4行的打印語句輸出該變量的值應該是255。
第5行代碼定義的price變量帶有小數點,這種數據類型是浮點型數據,除了直接用小數點定義外,還可以用帶e的科學記數法的方式來定義,比如第7行通過3e5定義了光的速度,單位是千米,表示的數字是3后面帶5個零,在第9行通過1e-9定義了1納米的長度,具體的數量級是1乘以10的-9次方。
在第11行代碼中,isExpensive變量的值是布爾值True,因為price小于30,從第12行的輸出語句的輸出結果可以得知,最終輸出的是True??梢灾苯影裈rue或False賦值給布爾類型變量,也可以采用類似第11行代碼的方式—通過表達式的運算結果來賦值。
以上范例程序演示了基本數據類型的運算或操作。請注意,由于在Python程序里定義變量時無須指定該變量的數據類型,比如在第1行定義times時無須用int times=16的方式來聲明變量的數據類型,在Python語言中,將16賦值給times變量就已經表示times即被定義為整型變量。
另外,在Python中定義變量時,變量名盡量要有含義,比如從第5行定義的變量名price,我們就能看出它是“價格”的意思,不建議用a或者b之類無具體含義的字母作為變量名來定義變量。
1.2.3 字符串
在Python語言中,可以用單引號和雙引號來定義字符串。
Python提供了若干可供調用的操作字符串的方法(method),以下我們通過StringDemo.py范例程序學習字符串的常見用法。

本范例程序的第1行代碼通過單引號的方式創建了名為logMsg的字符串變量。第2行代碼通過“+”這個運算符實現了字符串串接的操作,請注意在第2行代碼中待串接的字符串是用雙引號定義的。隨后通過第4行的輸出語句輸出串接兩個字符串后的結果。
第5行代碼在給twoLineStr字符串變量賦值的字符串中引入了“\n”這個換行符,通過第6行的輸出語句,我們能看到對應的換行效果。如果把其中的“\n”換成“\t”,就能看到引入制表符(Tab字符)的空格效果?!癨n”和“\t”叫作轉義字符,也是加“\”來表示常見的那些不能顯示的ASCII字符,除了“\n”和“\t”,還有其他的轉義符。
在第7行代碼里調用了len方法獲得字符串的長度然后打印輸出。第8行代碼通過replace方法替換源字符串中子字符串,該方法中的第一個參數表示待替換的子字符串,第二個參數表示用于替換的子字符串,該句的輸出結果是for Strforg.py,connect Str,源字符串中的“in”都被替換成“for”。
第9行和第10行代碼演示了通過find方法查找特定字符或字符串的用法,其中第9行是在logMsg字符串變量里查找“String”子字符串,返回結果是3,表示在源字符串的索引位置3找到了(其實是第4個字符位置,因為字符串索引值從0開始),而第10行是查找“Exist”子字符串,因為在源字符串中沒找到,所以返回-1。
第11行和第12行代碼給出的index方法也能起到查找的作用,與find方法的區別是,如果在index語句里出現類似第12行沒找到的情況,不會像find方法那樣返回-1,而是會拋出異常。對應地,如果去掉第12行注釋語句的前導符“#”使該行語句變為可執行,那么就能看到“由于沒找到所以拋出異常”的情況。
上述范例程序演示了字符串的常用操作。在項目的實際應用中,經常還需要對字符串進行分片操作,在如下的StrSplit.py范例程序中演示了如何使用分片操作。

在Python中會用[起始值:終止值]的方式對字符串執行分片操作,其含義是,根據[起始值:終止值]的值來截取(分片)相應的字符串,字符串中的字符使用索引值來引用,字符串的第一個字符的索引值為0,以此類推。
以下我們來分析上述程序代碼執行分片操作的具體方法。
用法1:如第2行和第3行代碼那樣,[]運算中的起始值和終止值都有值,且為正數。索引值從0開始,在字符串“in String.py”中第一個字符“i”的索引值是0,索引值為4的字符是“t”。在具體分片截取字符串的時候,得到的子字符串包含起始索引值對應的字符,但不包含終止索引值對應的字符,因此第2行語句分片得到的字符串為“in S”,同理第3行語句分片得到的結果為“n S”。
用法2:如第4行和第5行代碼那樣,[]運算中的起始值和終止值中只有一個有值,且為正數。比如第4行語句中起始值空缺,這表示從默認的起始位開始分片。而第5行只有起始值,這表示分片的結束默認在字符串的結尾。因此,第4行語句得到的字符串是“in St”,第5行語句得到的字符串是“py”。
用法3:如第6行代碼,只有一個值,這表示只截取該索引值指定的字符,這里值是-1,負號表示從字符串右邊開始計算,-1則表示截取字符串右邊的第1個字符,因而結果是“y”。
用法4:如第7行代碼,起始值和終止值中有一個值是負數。因為負數表示從字符串的右邊開始計算,這里的“5:-3”表示從第5個索引值位置開始,包含索引值是5的字符,截取到從字符串右邊算起第3個字符,因而結果是“ring”。
注意
執行分片操作后的新字符串和原字符串就沒有關聯了,對其中一個字符串進行操作不會影響到另一個字符串,比如第8行代碼,對字符串變量str進行分片的結果是創建了新字符串變量newStr,在第9行里調用replace方法對原字符串進行了替換操作,但從第10行語句輸出新字符串的結果上來看,新字符串并沒有受字符串替換的影響。
1.2.4 單行注釋和多行注釋
前面講述了在Python程序中注釋的用法??捎谩?”號進行單行注釋,如果要注釋多行,則可以用一對“' ' '”(三個單引號)。在如下的MoreLineComment.py范例程序中,不僅演示了多行注釋的效果,還演示了在注釋中包含中文的方式。

本范例程序第1行代碼的作用是表示本段程序代碼采用utf-8的編碼方式。如果要在程序代碼中使用中文,則需要加上如第1行所示的表明采用何種編碼的語句。
從第2行到第5行代碼用一對“' ' '”標注了多行中文注釋,請注意多行注釋需要以“' ''”開始,也要以“' ' '”結尾。在第7行里,通過print語句輸出了中文,在控制臺里就能看到中文。
1.2.5 條件分支語句
在Python程序中,可以用if…elif…else的語法來編寫程序中的條件分支語句,具體的語法如下:

在上述代碼塊中,if和elif語句后面都跟著判斷條件,條件判斷的結果為布爾值,如判斷條件的結果為true,則執行其后代碼塊所包含的語句。
如果if或elif的判斷條件的結果都不是true,那么會執行else后面代碼塊所包含的語句。使用if分支語句時,請注意兩點:第一,if、elif和else語句之后,均需要帶“:”冒號;第二,由于Python是采用縮進方式來表示程序中代碼的層次關系,因此if、elif和else之后的語句都需要縮進以表示各自所屬的代碼塊層次。在如下的IfDemo.py范例程序中以判斷閏年來演示相關條件分支語句的用法。

年份能被4整除但不能被100整除,或者能被400整除的,都是閏年。照此規則,首先在第3行的if語句中讓year取400的余數,如果能被400整除,則在第4行編寫打印語句以輸出“是閏年”的提示信息。
如果無法被400整除,則執行第5行的elif流程,判斷年份能否被4整除且不能被100整除,如果滿足此條件,也是閏年。如果不滿足第3行和第5行的if和elif條件,則執行第7行的else流程,在第8行輸出“不是閏年”的提示信息。
在本范例程序中,由于2022不能被400整除且不能被4整除(不能被4整除,就不用判斷是否非100的倍數),因此會執行第8行的語句輸出“不是閏年”的提示信息。
1.2.6 循環語句
在Python程序中可以通過for和while實現程序的循環執行,其中通過for語句,能依次遍歷元素中的所有項,在如下的ForDemo.py范例程序中演示了相關用法。

本范例程序的第1行代碼定義了一個字符串,隨后用第2行和第3行的for循環語句,遍歷并輸出了這個number字符串變量中的字符。請注意,第2行的for語句后面同樣要帶上冒號。
在第5行開始的for循環中,遍歷了第4行定義的languageArr對象,第6行的輸出語句會輸出“Python”“C#”“Java”和“Go”字符串,它們都是換行輸出(也就是每個字符串獨占一行)。
Python語言中while的語法如下所示:

如果第1行的判斷條件的結果為True,就執行其后循環代碼塊中的語句,否則就退出while循環。
在如下的WhileDemo.py范例程序中,通過while語句計算1到101所有奇數的和。

本范例程序在第3行的while語句中,循環的條件是num≤101,即num值小于等于101時,會執行第4行到第6行的代碼塊(即循環體)。在該while循環的代碼塊中,第4行執行奇數累加的運算,在第5行執行對num的加2運算。該范例程序運行結束時,我們可以看到第7行輸出的奇數和為2601。
在使用while循環語句時請注意如下兩點:第一,在循環體內需要像第5行那樣更新循環的條件值,如果不更新,就會出現死循環的現象;第二,注意邊界值,比如若去掉第6行的注釋符號,就能確認最后一個被相加的奇數是101,但如果在第3行的while語句中,不慎將條件語句錯寫成while num <101,那么只會累加1到99的奇數和,導致程序出現邏輯錯誤,得出錯誤的答案。
1.2.7 break和continue
在for和while循環語句中,可以使用break語句終止循環,在下面的BreakDemo.py范例程序中可以看到具體的用法。

本范例程序在第2行到第5行的for循環中,依次遍歷第1行定義的languageArr變量中的元素。遍歷時會通過第4行的if語句判斷當前元素是否等于字符串'Python',如果相等,則執行第5行的break語句退出for循環。
運行上述范例程序后,我們會發現該程序的輸出結果中不包含'Go'字符串,則說明當遍歷到'Python'元素時,就已經退出了for循環,不再繼續遍歷后面的'Go'元素。
執行break語句可以退出當前所在循環的循環體,而執行continue語句則可以退出當前循環體本輪次的循環。下面通過ContinueDemo.py范例程序中來看看continue語句的用法。

本范例程序的第3行的條件判斷語句,如果當前遍歷到的元素是'C++',就會執行第4行的continue語句結束本輪次的循環,繼續下一輪次的循環,而不是退出當前的整個for循環體。
結束本輪次的循環后,會繼續遍歷后繼的'Python'和'Go'這兩個元素,所以該范例程序的輸出結果中會包含除了'C++'元素之外的其他三個元素。
1.2.8 格式化輸出
在前面的章節中給出了print打印語句的用法,在實際項目中,print語句更常見的用法是進行格式化輸出。下面的PrintDemo.py范例程序演示了格式化輸出。

本范例程序第2行的print語句中,%s表示以字符串的形式輸出指定參數,第1行注解中的文字信息就是第2行print語句的輸出結果,由此可知,第2行中的兩個%s均被其之后由%指定的兩個參數所替代。
第4行的代碼演示了%s、%d和%f的綜合用法,其中%d表示格式化輸出整型數據,%f表示格式化輸出浮點型數據。同樣地,它們會被%后指定的參數所替代。第3行注釋中的信息就是第4行print語句的輸出結果,由此可知,%f可以用來指定浮點數輸出的格式,如果要指定小數點后面的位數,可以如第6行那樣,用%.2f的方式指定浮點數的輸出格式,即輸出時保留2位小數。
第8行通過%e以科學記數法的格式輸出數據,第7行注釋中的信息就是輸出結果。
雖然在Python語言中還有其他格式化輸出語句,但是在上述范例程序化中給出的格式化輸出字符串、數字、浮點數和科學記數法的用法是比較常見的,其他不太常用的用法,本書就不再贅述了。
- iOS Game Programming Cookbook
- Web程序設計及應用
- 零基礎搭建量化投資系統:以Python為工具
- 精通軟件性能測試與LoadRunner實戰(第2版)
- Learning OpenCV 3 Computer Vision with Python(Second Edition)
- Mastering Xamarin.Forms(Second Edition)
- INSTANT Adobe Edge Inspect Starter
- Rust游戲開發實戰
- 監控的藝術:云原生時代的監控框架
- Ext JS 4 Plugin and Extension Development
- 人人都能開發RPA機器人:UiPath從入門到實戰
- 實戰Python網絡爬蟲
- 前端架構設計
- R語言:邁向大數據之路
- 計算機視覺實戰:基于TensorFlow 2