警:人生苦短,我用Python
本章內容將講述Python學習中的基本概念和基本型別,部分具體知識需要Python直譯器輔助理解,在開始學習前請開啟Python直譯器,如果未曾安裝請看前文“Python入門(學習筆記)”,裡面有Windows作業系統Python直譯器安裝的教程。
Linux作業系統安裝教程:http://c.biancheng.net/view/4162.html
mac作業系統安裝教程:http://c.biancheng.net/view/4164.html
一、程式語言的分類
我們編寫的原始碼是人類語言,我們自己能夠輕鬆理解;但是對於計算機硬體(CPU),原始碼就是天書,根本無法執行,計算機只能識別某些特定的二進位制指令,在程式真正執行之前必須將原始碼轉換成二進位制指令。所謂的二進位制指令,也就是機器碼,是指 CPU 能夠識別的硬體層面的“程式碼”,簡陋的硬體(比如古老的微控制器)只能使用幾十個指令,強大的硬體(PC 和智慧手機)能使用成百上千個指令。
然而,究竟在什麼時候將原始碼轉換成二進位制指令呢?不同的程式語言有不同的規定:
1.編譯型語言
有的程式語言要求必須提前將所有原始碼一次性轉換成二進位制指令,也就是生成一個可執行程式(Windows 下的 .exe),比如C語言、C++、Golang、Pascal(Delphi)、彙編等,這種程式語言稱為編譯型語言,使用的轉換工具稱為編譯器。總結:①編譯型語言執行後會生成一個額外的可執行程式,是電腦能夠直接識別並執行的;②編譯型語言的原始碼和可執行程式不能跨平臺使用。2.解釋型語言(Python就是解釋型)
有的程式語言可以一邊執行一邊轉換,需要哪些原始碼就轉換哪些原始碼,不會生成可執行程式,比如 Python、JavaScript、PHP、Shell、MATLAB 等,這種程式語言稱為解釋型語言,使用的轉換工具稱為直譯器。總結:①解釋型語言執行不會產生額外的檔案;②解釋型語言在執行時翻譯,執行一個程式碼功能就翻譯一個程式碼功能。二、變數(變數是Python識別符號的一種)
任何程式語言都需要處理資料,比如數字、字串、字元等,我們可以直接使用資料,也可以將資料儲存到變數中,方便以後使用。
變數(Variable)可以看成一個小箱子,專門用來“盛裝”程式中的資料。每個變數都擁有獨一無二的名字,透過變數的名字就能找到變數之中的資料。
從底層看,程式中的資料最終都要存放到記憶體條中,在程式語言中,最終需要存放的資料都要存放到“記憶體條”中,而變數就是這塊“記憶體條”的名字。
和變數相對應的是常量(Constant),它們都是用來“盛裝”資料的小箱子,不同的是:變數儲存的資料可以被多次修改,而常量一旦儲存某個資料之後就不能修改了。
在程式語言中,將資料放入變數的過程叫做賦值(Assignment)。Python 使用等號=作為賦值運算子,具體格式為:
name = value
name 表示變數名;value 表示值,也就是要儲存的資料。
在python中,每個變數在使用前都必須賦值,變數賦值以後該變數才會被建立。
賦值的例子
變數的值不是一成不變的,它可以隨時被修改,只要重新賦值即可;另外你也不用關心資料的型別,可以將不同型別的資料賦值給同一個變數。如下圖所示:
變數的值的修改
注意,變數的值一旦被修改,之前的值就被覆蓋了,不復存在了,再也找不回了。換句話說,變數只能容納一個值。
除了賦值單個數據,你也可以將表示式的執行結果賦值給變數,例如:
賦值多個數據
注意,變數是識別符號的一種,它的名字不能隨便起,要遵守 Python 識別符號命名規範,還要避免和 Python 內建函式以及 Python 關鍵字重名。
3.變數的使用
在使用Python變數時,只需要知道變數的名字即可,幾乎在Python程式碼的任何地方都可使用變數,詳情請看下面的演示:
變數的使用
除此之外,Python變數的使用還有單個定義和多個定義之分:
(1)單個定義——變數名=值(也是要儲存的資料)——即a=10
(2)多個定義——變數名,變數名,......=值1,值2,......——即a,b,c,......=10,20,30,......
(3)變數使用單個定義或多個定義沒有必要的區別,靠個人習慣選擇。同時在編寫程式碼過程中可以透過變數名得到儲存值。
4.Python是一門弱型別的語言(補充內容)
在程式語言內部,有強型別和弱型別之分。
在強型別的程式語言中,定義變數時要指明變數的型別,而且賦值的資料也必須是相同型別的,C語言、C++、Java 是強型別語言的代表。
和強型別語言相對應的是弱型別語言,Python、JavaScript、PHP 等指令碼語言一般都是弱型別的。弱型別語言有兩個特點:
變數無須宣告就可以直接賦值,對一個不存在的變數賦值就相當於定義了一個新變數。變數的資料型別可以隨時改變,比如,同一個變數可以一會兒被賦值為整數,一會兒被賦值為字串。注意,弱型別並不等於沒有型別區分!弱型別是說在書寫程式碼時不用刻意關注型別,但是在程式語言的內部仍然是有型別的。我們可以使用 type() 內建函式類檢測某個變數或者表示式的型別,例如:
Python變數的資料型別
三、Python識別符號命名規範
Python 語言的識別符號必須以字母、下劃線(_)開頭,後面可以跟任意數目的字母、數字和下畫線(_)。此處的字母並不侷限於 26 個英文字母,可以包含中文字元、日文字元等。
1.命名規範的作用
使你的變數名符合Python程式的底層規則與邏輯,如果不符合,則程式報錯,無法執行。同時方便自我對已寫程式碼的記憶,不至於產生忘記某些程式碼所屬含義的可能。
2.如何進行規範的命名
(1)規則(不能違反,否則會出問題,不可選):
識別符號可以由字母、數字、下劃線(_)組成,其中數字不能作為開頭使用。識別符號不能是 Python 關鍵字,但可以包含幾個關鍵字。識別符號不能包含空格。如果違反規則,則程式碼執行時會報錯
正確以及錯誤的識別符號命名示範
舉例,例如下面變數,有些是合法的,有些是不合法的:
abc_xyz:合法。HelloWorld:合法。abc:合法。xyz#abc:不合法,識別符號中不允許出現“#”號。abc1:合法。1abc:不合法,識別符號不允許數字開頭。(2)規範(違反可能會產生隱性問題,但不會立即表現出來,是可選的):
①一般使用英文字母、下劃線和數字組成。可以隨意組合,但不能違反規則
②見名知意,最好使用英文單詞命名
如果不符合規範,程式碼執行時不會報錯,但可能有隱性問題,而隱性問題具體可表現為,遺忘所寫程式碼裡部分變數名的含義,同時在工作中與同事的對接,會讓對接的工作量增加。
3.總結:
(1)最好是符合規則且見名知意的規範命名
(2)識別符號命名只能是黑色,如果不是黑色,則命名違反了規則,需要立馬更換命名
補充:在Python中,不同的程式碼會有不同的顏色,而變數名只能是黑色,如果你所書寫的變數名不是黑色,則不是變數名。
四、變數和引用(邏輯內容)
1.儲存值:意指變數儲存的是其地址值
在Python中,可以透過地址值找到對應的變數
2.內建函式id(值):其作用為獲取指定的資料的地址值
3.總結:變數儲存的是地址值,透過地址值找到對應的資料,進行使用。
五、關鍵字
關鍵字是預先保留的識別符號,每個關鍵字都有特殊的含義。程式語言眾多,但每種語言都有相應的關鍵字,Python 也不例外,它自帶了一個‘keyword’ 模組,用於檢測關鍵字。
在Python直譯器中,要獲取關鍵字列表可以使用內建函式help()
help('keyword')獲取關鍵字列表
或者透過keyword模組匯入關鍵字列表:import keyword
keyword模組匯入關鍵字列表
注意:①關鍵字中,除False、None和True之外,其餘關鍵字首字母均為小寫。且在Python語言中是區分大小寫的,比如False是一個關鍵字,而false則是一個變數名。
②Python是一門動態語言,根據時間在不斷變化,關鍵字列表並非一成不變,在將來可能會發生改變。
除此之外,keyword模組還提供了關鍵字的判斷方法
關鍵字的判斷
如果是關鍵字,則返回True;不是關鍵字,則返回False。
Python關鍵字及其含義
總結:
1.關鍵字是指在Python中具有特殊含義和功能的單詞,不能作為變數名使用。
2.關鍵字本身已經被Python直譯器給佔用了,在敲寫程式碼的過程中,不能賦予關鍵字其他的含義。
3.關鍵字的特殊含義以及功能是由Python這門程式語言本身定義的。
六、內建函式
Python 直譯器自帶的函式叫做內建函式,這些函式可以直接使用,不需要匯入某個模組。
(一)函式的概念:函式就是一段封裝好的、可以重複使用的程式碼,它使得我們的程式更加模組化,不需要編寫大量重複的程式碼。
在Python中,函式不僅有內建函式,也有標準庫函式。而內建函式和標準庫函式是不一樣的。在Python直譯器中,它給使用者提供了一些常用功能,並給它們起了獨一無二的名字,這些常用功能就是內建函式。Python 直譯器啟動以後,內建函式也生效了,可以直接拿來使用。
Python 標準庫相當於直譯器的外部擴充套件,它並不會隨著直譯器的啟動而啟動,要想使用這些外部擴充套件,必須提前匯入。Python 標準庫非常龐大,包含了很多模組,要想使用某個函式,必須提前匯入對應的模組,否則函式是無效的。
內建函式是直譯器的一部分,它隨著直譯器的啟動而生效;標準庫函式是直譯器的外部擴充套件,匯入模組以後才能生效。一般來說,內建函式的執行效率要高於標準庫函式。
Python 直譯器一旦啟動,所有的內建函式都生效了;而匯入標準庫的某個模組,只是該模組下的函式生效,並不是所有的標準庫函式都生效。
(二)舉例:打包程式碼(也叫輸出程式碼)——print()
內建函式的數量必須被嚴格控制,否則 Python 直譯器會變得龐大和臃腫。一般來說,只有那些使用頻繁或者和語言本身繫結比較緊密的函式,才會被提升為內建函式。例如,在螢幕上輸出文字就是使用最頻繁的功能之一,所以 print() 是 Python 的內建函式。
在 Python 2.x 中,print 是一個關鍵字;到了 Python 3.x 中,print 變成了內建函式。
因為一個功能不是一兩行就能完成的,可能有幾十上百行,為了使幾十上百行的程式碼只實現我們指定的一個或者多個功能,於是Python就幫我們定義好了能實現這個的功能函式print()。
除了 print() 函式,Python 直譯器還提供了更多內建函式,下表列出了 Python 3.x 中的所有內建函式。
Python 3.x內建函式
如果要了解內建函式的具體功能和用法,可以透過下面的網址去詳細瞭解:
https://docs.python.org/zh-cn/3/library/functions.html
七、輸入輸出
(一)初步理解:
1.輸入(input)
(1)輸入的含義:人輸入資料到電腦
(2)輸入的作用:①接收使用者輸入的資料;
②搭配變數儲存使用者輸入的資料。
(3)輸入的使用:①輸入是內建函式
②內建函式使用規則是“內建函式名+(‘’)”,而輸入的使用規則是“input+(‘’)”
(4)注意:input接收到的所有資料型別都是字串型別
2.輸出(print)
(1)輸出的含義:電腦輸出資料(電腦顯示資料)
(2)輸出的作用:把你想要展示出來的內容顯示在螢幕上
(3)輸出的使用:①輸出是print,使用規則“print+(‘輸出的內容’)”
(4)輸出語法的進階:①在使用完輸出語法print後,系統會預設換行,我們可以透過修改print後的end引數讓其不換行。
②print(要展示的內容,end=‘/n’)
(二)進階理解:
1.輸出
①print()函式語法格式:print(self, *args, sep=’ ‘, end=’\n’, file=None)*args:位置引數sep:分隔
位置引數和分隔的用法
end:print函式最後預設列印的內容
end引數用法
file:結果列印的地方,預設在控制檯輸出
②格式化輸出
常用的格式化符號
2.輸入
1.input函式語法格式:x = input(‘ ’)小括號裡放入提示資訊從鍵盤獲取的資料會給到左邊的變數xinput會將使用者的值都當作字串來對待
八、資料型別
(一)數值,數字(Number)
在Python中,數值用Number表示,通常分為:
1.Int(整數),比如1
(1)初步內容:
整數就是沒有小數部分的數字,Python中的整數包括正整數、0和負整數。
(2)進階內容(整數的不同進位制):
在 Python 中,可以使用多種進位制來表示整數:
1) 十進位制形式我們平時常見的整數就是十進位制形式,它由 0~9 共十個數字排列組合而成。注意,使用十進位制形式的整數不能以 0 作為開頭,除非這個數值本身就是 0。
2) 二進位制形式由 0 和 1 兩個數字組成,書寫時以0b或0B開頭。例如,101 對應十進位制數是 5。
3) 八進位制形式八進位制整數由 0~7 共八個數字組成,以0o或0O開頭。注意,第一個符號是數字 0,第二個符號是大寫或小寫的字母 O。在 Python 2.x 中,八進位制數字還可以直接以0(數字零)開頭。
4) 十六進位制形式由 0~9 十個數字以及 A~F(或 a~f)六個字母組成,書寫時以0x或0X開頭,
補充:如果你對不同進位制以及它們之間的轉換方法不瞭解,請檢視下面的連結:
1.進位制詳解:http://c.biancheng.net/view/1724.html
2.進位制之間的轉換:http://c.biancheng.net/view/1725.html
2.float(小數)
(1)初步內容:float例子,比如1.1,1.2
(2)進階內容:
Python中關於float小數有兩種書寫形式
①十進位制形式:十進位制形式就是上述的初步內容,也是我們日常所看到的小數的形式34.6,34.5,35.7等等,注意必須要有小數點,否則會被Python當做整數處理。
②指數形式:Python中小數的指數形式的寫法為
aEn或aen
a 為尾數部分,是一個十進位制數;n 為指數部分,是一個十進位制整數;E或e是固定的字元,用於分割尾數部分和指數部分。整個表示式等價於 a×10n。
指數形式的小數舉例:
2.1E5 = 2.1×105,其中 2.1 是尾數,5 是指數。3.7E-2 = 3.7×10-2,其中 3.7 是尾數,-2 是指數。0.5E7 = 0.5×107,其中 0.5 是尾數,7 是指數。注意,只要寫成指數形式就是小數,即使它的最終值看起來像一個整數。例如 14E3 等價於 14000,但 14E3 是一個小數。
小數在Python中的使用
從執行結果可以看出,Python 能容納極小和極大的浮點數。print 在輸出浮點數時,會根據浮點數的長度和大小適當地捨去一部分數字,或者採用科學計數法。f5 的值是 120000,但是它依然是小數型別,而不是整數型別。讓人奇怪的是 f6,12.3*0.1的計算結果很明顯是 1.23,但是 print 輸出卻不精確。這是因為小數在記憶體中是以二進位制形式儲存的,小數點後面的部分在轉換成二進位制時很有可能是一串無限迴圈的數字,無論如何都不能精確表示,所以小數的計算結果一般都是不精確的。
3.bool(布林型),只有兩個值——①True(真,1),②False(假,0)
Python 提供了 bool 型別來表示真(對)或假(錯),比如常見的5 > 3比較算式,這個是正確的,在程式世界裡稱之為真(對),Python 使用 True 來代表;再比如4 > 20比較算式,這個是錯誤的,在程式世界裡稱之為假(錯),Python 使用 False 來代表。
True 和 False 是 Python 中的關鍵字,當作為 Python 程式碼輸入時,一定要注意字母的大小寫,否則直譯器會報錯。
值得一提的是,布林型別可以當做整數來對待,即 True 相當於整數值 1,False 相當於整數值 0。因此,下邊這些運算都是可以的:
>>> False+11>>> True+12
注意,這裡只是為了說明 True 和 Flase 對應的整型值,在實際應用中是不妥的,不要這麼用。總的來說,bool 型別就是用於代表某個事情的真(對)或假(錯),如果這個事情是正確的,用 True(或 1)代表;如果這個事情是錯誤的,用 False(或 0)代表。
4.complex(複數)
複數(Complex)是 Python 的內建型別,直接書寫即可。換句話說,Python 語言本身就支援複數,而不依賴於標準庫或者第三方庫。複數由實部(real)和虛部(imag)構成,在 Python 中,複數的虛部以j或者J作為字尾,具體格式為:
a + bj
a 表示實部,b 表示虛部。
例項:Python複數的使用
執行結果
透過執行結果可以發現,複數在 Python 內部的型別是 complex,Python 預設支援對複數的簡單計算。
(二)String(字串)——字串及以下至字典部分的內容置於之後講,此處省略詳細內容。
(三)List(列表)
(四)Tuple(元組)
(五)Dictionary(字典)
注意:在編輯器中可使用內建函式type()檢視各項資料的型別。
九、數值型別計算
(一)數值型別計算含義:
1.在Python中數值型別計算又稱運算子計算,主要是進行運算子之間的數學計算。
2.數值型別計算的作用:可以透過運算得出結果
(二)算術運算子(重點):
算術運算子也即數學運算子,用來對數字進行數學運算,比如加減乘除。
Python常用算術運算子
1.加法運算子“ + ”:
加法的運算子運算很簡單,和數學中的規則一樣,請看下面程式碼
加法運算程式碼
運算結果
2.減法運算子“ - ”:
①減法運算也和數學中的規則相同,請看下面程式碼:
減法運算程式碼
運算結果
②求負:
‘-’除了可以用作減法運算之外,還可以用作求負運算(正數變負數,負數變正數),請看下面的程式碼:
求負運算程式碼
運算結果
3.乘法運算子“ * ”:
①乘法運算也和數學中的規則相同,請看程式碼:
乘法運算程式碼
運算結果
②重複字串:
乘法運算子除了可以用作乘法運算,還可以用來重複字串,也可以將n個同樣的字串連線起來,請看程式碼:
重複字串程式碼
運算結果
4./ 和 // 除法運算子:
Python 支援/和//兩個除法運算子,但它們之間是有區別的:
/表示普通除法,使用它計算出來的結果和數學中的計算結果相同。//表示整除,只保留結果的整數部分,捨棄小數部分;注意是直接丟掉小數部分,而不是四捨五入。請看下面的程式碼:
除法運算子程式碼
運算結果
從運算結果可以發現:
/的計算結果總是小數,不管是否能除盡,也不管參與運算的是整數還是小數。當有小數參與運算時,//結果才是小數,否則就是整數。需要注意的是,除數始終不能為 0,除以 0 是沒有意義的,這將導致 ZeroDivisionError 錯誤。在某些程式語言中,除以 0 的結果是無窮大(包括正無窮大和負無窮大)。
5.求餘運算子“ % ”:
Python % 運算子用來求得兩個數相除的餘數,包括整數和小數。Python 使用第一個數字除以第二個數字,得到一個整數的商,剩下的值就是餘數。對於小數,求餘的結果一般也是小數。注意,求餘運算的本質是除法運算,所以第二個數字也不能是 0,否則會導致“ ZeroDivisionError” 錯誤。Python % 使用示例:
print("-----整數求餘-----")print("15%6 =", 15%6)print("-15%6 =", -15%6)print("15%-6 =", 15%-6)print("-15%-6 =", -15%-6)print("-----小數求餘-----")print("7.7%2.2 =", 7.7%2.2)print("-7.7%2.2 =", -7.7%2.2)print("7.7%-2.2 =", 7.7%-2.2)print("-7.7%-2.2 =", -7.7%-2.2)print("---整數和小數運算---")print("23.5%6 =", 23.5%6)print("23%6.5 =", 23%6.5)print("23.5%-6 =", 23.5%-6)print("-23%6.5 =", -23%6.5)print("-23%-6.5 =", -23%-6.5)
執行結果:
-----整數求餘-----15%6 = 3-15%6 = 315%-6 = -3-15%-6 = -3-----小數求餘-----7.7%2.2 = 1.0999999999999996-7.7%2.2 = 1.10000000000000057.7%-2.2 = -1.1000000000000005-7.7%-2.2 = -1.0999999999999996---整數和小數運算---23.5%6 = 5.523%6.5 = 3.523.5%-6 = -0.5-23%6.5 = 3.0-23%-6.5 = -3.5
從執行結果可以發現兩點:
只有當第二個數字是負數時,求餘的結果才是負數。換句話說,求餘結果的正負和第一個數字沒有關係,只由第二個數字決定。%兩邊的數字都是整數時,求餘的結果也是整數;但是隻要有一個數字是小數,求餘的結果就是小數。6.次方(乘方)運算子“ ** ”:
Python中,**運算子是用來求一個數x的y次方,也即次方(乘方)運算子。
由於開方是次方的逆運算,所以也可以使用 ** 運算子間接地實現開方運算。
Python ** 運算子示例:
print('----次方運算----')print('3**4 =', 3**4)print('2**5 =', 2**5)print('----開方運算----')print('81**(1/4) =', 81**(1/4))print('32**(1/5) =', 32**(1/5))
執行結果:
----次方運算----3**4 = 812**5 = 32----開方運算----81**(1/4) = 3.032**(1/5) = 2.0
(三)賦值運算子(重點):
賦值運算子用來把右側的值傳遞給左側的變數(或者常量);可以直接將右側的值交給左側的變數,也可以進行某些運算後再交給左側的變數,比如加減乘除、函式呼叫、邏輯運算等。Python 中最基本的賦值運算子是等號=;結合其它運算子,=還能擴展出更強大的賦值運算子。
1.基本賦值運算子:
= 是Python中最常見、最基本的賦值運算子,用來將一個表示式的值賦給另一個變數,具體請看下面的例子:
#將字面量(直接量)賦值給變數n1 = 100f1 = 47.5s1 = "http://c.biancheng.net/python/"#將一個變數的值賦給另一個變數n2 = n1f2 = f1#將某些運算的值賦給變數sum1 = 25 + 46 sum2 = n1 % 6s2 = str(1234) #將數字轉換成字串s3 = str(100) + "abc"
連續賦值
Python 中的賦值表示式也是有值的,它的值就是被賦的那個值,或者說是左側變數的值;如果將賦值表示式的值再賦值給另外一個變數,這就構成了連續賦值。請看下面的例子:
a = b = c = 100
= 具有右結合性,我們從右到左分析這個表示式:
c = 100 表示將 100 賦值給 c,所以 c 的值是 100;同時,c = 100 這個子表示式的值也是 100。b = c = 100 表示將 c = 100 的值賦給 b,因此 b 的值也是 100。以此類推,a 的值也是 100。最終結果就是,a、b、c 三個變數的值都是 100。
= 和 === 和 == 是兩個不同的運算子,= 用來賦值,而 == 用來判斷兩邊的值是否相等,千萬不要混淆。
擴充套件後的賦值運算子(進階內容)=還可與其他運算子(包括算術運算子、位運算子和邏輯運算子)相結合,擴充套件成為功能更加強大的賦值運算子,如下圖所示。擴充套件後的賦值運算子將使得賦值表示式的書寫更加優雅和方便。
Python擴充套件賦值運算子
舉例:n1 = 100f1 = 25.5n1 -= 80 #等價於 n1=n1-80f1 *= n1 - 10 #等價於 f1=f1*( n1 - 10 )print("n1=%d" % n1)print("f1=%.2f" % f1)執行結果為:n1=20f1=255.00
通常情況下,只要能使用擴充套件後的賦值運算子,都推薦使用這種賦值運算子。但是請注意,這種賦值運算子只能針對已經存在的變數賦值,因為賦值過程中需要變數本身參與運算,如果變數沒有提前定義,它的值就是未知的,無法參與運算。例如,下面的寫法就是錯誤的:
n += 10
該表示式等價於 n = n + 10,n 沒有提前定義,所以它不能參與加法運算。
十、字串
簡介:字串的引號使用共分為3種,常用的為單引號' '和雙引號" ",在字串較長或特別長的情況下,使用三引號"' "'
(一)字串的含義:
字串的意思就是“一串字元”,比如“Hello,Charlie”是一個字串,“How are you?”也是一個字串。Python 要求字串必須使用引號括起來,使用單引號也行,使用雙引號也行,只要兩邊的引號能配對即可。
(二)字串的使用:
字串的內容幾乎可以包含任何字元,英文字元也行,中文字元也行。
字串既可用單引號括起來,也可用雙引號括起來,它們沒有任何區別。例如如下程式:
str_1='hello word python!'str_2="hello word python!"print(str_1)print(str_2)
但需要說明的是,Python 有時候沒有我們期望的那麼聰明。如果字串內容本身包含了單引號或雙引號,此時就需要進行特殊處理:
方式1.使用不同的引號將字串括起來。
方式2.對引號進行轉義。
先看第一種處理方式。假如字串內容中包含了單引號,則可以使用雙引號將字串括起來。例如:
str3 = 'I'm a coder'
由於上面字串中包含了單引號,此時 Python 會將字串中的單引號與第一個單引號配對,這樣就會把 'I' 當成字串,而後面的 m a coder' 就變成了多餘的內容,從而導致語法錯誤。
為了避免這種問題,可以將上面程式碼改為如下形式:
str3 = "I'm a coder"
上面程式碼使用雙引號將字串括起來,此時 Python 就會把字串中的單引號當成字串內容,而不是和字串開始的引號配對。
假如字串內容本身包含雙引號,則可使用單引號將字串括起來,例如如下程式碼:
str4 = '"Spring is here,let us jam!", said woodchuck.'
(三)跳脫字元:
接下來看第二種處理方式:使用跳脫字元。Python 允許使用反斜線(\)將字串中的特殊字元進行轉義。假如字串既包含單引號,又包含雙引號,此時必須使用跳脫字元,例如如下程式碼:
str5 = '"we are scared,Let\'s hide in the shade",says the bird'
(四)拼接字串:
如果直接將兩個字串緊挨著寫在一起,Python 就會自動拼接它們,例如如下程式碼:
str='hello,'"word python"print(str)
上面的程式碼將會輸出:
hello,word python
上面這種寫法只是書寫字串的一種特殊方法,並不能真正用於拼接字串。Python 使用加號(+)作為字串的拼接運算子,例如如下程式碼:
str_1= "Python "str_2= "iS Funny"#使用+拼接字串str_3 = str_1+str_2print(str_3)
(五)長字串:
前面簡介有提到過字串使用三引號"' "'的情況,在三引號的字串中,通常能放置任何內容,包括放置單引號、雙引號都可以,如果所定義的長字串沒有賦值給任何變數,那麼這個字串就相當於被直譯器忽略了,也就相當於註釋掉了。實際上,使用三個引號括起來的長字串完全可以賦值給變數,例如如下程式:
str = '''"Let's go fishing", said Mary."OK, Let's go", said her brother.they walked to a lake'''printstr)
上面程式使用三個引號定義了長字串,該長字串中既可包含單引號,也可包含雙引號。當程式中有大段文字內容要定義成字串時,優先推薦使用長字串形式,因為這種形式非常強大,可以讓字串中包含任何內容,既可包含單引號,也可包含雙引號。此外,Python 還允許使用跳脫字元(\)對換行符進行轉義,轉義之後的換行符不會“中斷”字串。例如如下程式碼:
str_2= 'The quick brown fox \jumps over the lazy dog'print(str_2)
上面 str_2字串的內容較長,故程式使用了跳脫字元(\)對內容進行了轉義,這樣就可以把一個字串寫成兩行。需要說明的是,Python 不是格式自由的語言,因此 Python 程式的換行、縮排都有其規定的語法。所以,Python 的表示式不允許隨便換行。如果程式需要對 Python 表示式換行,同樣需要使用跳脫字元(\)進行轉義,程式碼如下:
num = 20 + 3 / 4 + \ 2 * 3print(num)
上面程式中有一個表示式,為了對該表示式換行,程式需要使用跳脫字元。
(六)進階內容_1 repr和字串:
有時候,我們需要將字串與數值進行拼接,而 Python 不允許直接拼接數值和字串,程式必須先將數值轉換成字串。為了將數值轉換成字串,可以使用 str() 或 repr() 函式,例如如下程式碼:
str_1 = "這是數字: "p = 99.8#字串直接拼接數值,程式報錯print(str_1 + p)#使用str()將數值轉換成字串print(str_1 + str(p))#使用repr()將數值轉換成字串print(str_1 + repr(p))
上面程式中直接拼接字串和數值,程式會報錯。str() 和 repr() 函式都可以將數值轉換成字串,其中 str 本身是 Python 內建的型別(和 int、float 一樣),而 repr() 則只是一個函式。此外,repr 還有一個功能,它會以 Python 表示式的形式來表示值。對比如下程式碼:
st = "I will play my fife"print (st)print(repr(st))
上面程式碼中 st 本身就是一個字串,但程式依然使用了 repr() 對字串進行轉換。執行上面程式,可以看到如下輸出結果:
I will play my fife'I will play my fife'
透過上面的輸出結果可以看出,如果直接使用 print() 函式輸出字串,將只能看到字串的內容,沒有引號;但如果先使用 repr() 函式對字串進行處理,然後再使用 print() 執行輸出,將可以看到帶引號的字串,這就是字串的 Python 的表示式形式。在互動式直譯器中輸入一個主量或表示式時,Python 會自動使用 repr() 函式處理該變數或表示式。
(七)進階內容_2 使用 input 獲取使用者輸入:
input() 函式用於向用戶生成一條提示,然後獲取使用者輸入的內容。由於 input() 函式總會將使用者輸入的內容放入字串中,因此使用者可以輸入任何內容,input() 函式總是返回一個字串。
例如如下程式:
msg = input("請輸入你的值:")print (type(msg))print(msg)
第一次執行該程式,我們輸入一個整數,執行過程如下:
請輸入你的值:2<class 'str'>2
第二次執行該程式,我們輸入一個浮點數,執行過程如下:
請輸入你的值: 1.2<class 'str'>1.2
第三次執行該程式,我們輸入一個字串,執行過程如下:
請輸入你的值:Hello<class 'str'>Hello
從上面的執行過程可以看出,無論輸入哪種內容,始終可以看到 input() 函式返回字串,程式總會將使用者輸入的內容轉換成字串。
(八)進階內容_3 Python原始字串:
由於字串中的反斜線都有特殊的作用,因此當字串中包含反斜線時,就需要對其進行轉義。比如寫一條 Windows 的路徑 G:\publish\codes\02\2.4,如果在 Python 程式中直接這樣寫肯定是不行的,需要寫成 G:\\publish\\codes\\02\\2.4,這很煩人,此時可藉助於原始字串來解決這個問題。原始字串以“r”開頭,原始字串不會把反斜線當成特殊字元。因此,上面的 Windows 路徑可直接寫成 r'G:\publish\codes\02\2.4'。關於原始字串的用法看如下程式:
s1 = r'G:\publish\codes\02\2.4'print(s1)
如果原始字串中包含引號,程式同樣需要對引號進行轉義(否則 Python 同樣無法對字串的引號精確配對),但此時用於轉義的反斜線會變成字串的一部分。例如如下程式碼:
# 原始字串包含的引號,同樣需要轉義s2 = r'"Let\'s go", said Charlie'print(s2)
上面程式碼會生成如下輸出結果:
"Let\'s go", said Charlie
由於原始字串中的反斜線會對引號進行轉義,因此原始字串的結尾處不能是反斜線,否則字串結尾處的引號就被轉義了,這樣就導致字串不能正確結束。如果確實要在原始字串的結尾處包含反斜線怎麼辦呢?一種方式是不要使用原始字串,而是改為使用長字串寫法(三引號字串);另一種方式就是將反斜線單獨寫出來。例如如下程式碼:
s3 = r'Good Morning' '\\'print(s3)
上面程式碼開始寫了一個原始字串 r'Good Morning',緊接著程式使用 '\\' 寫了一個包含反斜線的字串,Python 會自動將這兩個字串拼接在一起。執行上面的程式碼會生成如下輸出結果: