版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Python基礎(chǔ)及應(yīng)用課件第4章Python基礎(chǔ)及應(yīng)用課件第4章目錄什么是數(shù)據(jù)結(jié)構(gòu)Tuple(元組)List(列表)Dict(字典)字符串目錄什么是數(shù)據(jù)結(jié)構(gòu)什么是數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)是指相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合,是計(jì)算機(jī)存儲(chǔ)組織數(shù)據(jù)的形式。我們可以將生活中的事物聯(lián)系抽象為特定的四種數(shù)據(jù)結(jié)構(gòu)集合結(jié)構(gòu),線性結(jié)構(gòu),樹形結(jié)構(gòu),圖狀結(jié)構(gòu)。什么是數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)是指相互之間存在一種或多種特定關(guān)系的數(shù)什么是數(shù)據(jù)結(jié)構(gòu)1.集合結(jié)構(gòu)在數(shù)學(xué)中集合的樸素定義是指具有某種特定性質(zhì)的事物的總體,具有無序性和確定性。計(jì)算機(jī)中的集合結(jié)構(gòu)顧名思義正是對(duì)生活中集合關(guān)系的抽象,比如對(duì)于一筐雞蛋,筐就是一個(gè)集合,其
2、中的元素就是每個(gè)雞蛋。什么是數(shù)據(jù)結(jié)構(gòu)1.集合結(jié)構(gòu)什么是數(shù)據(jù)結(jié)構(gòu)2.線性結(jié)構(gòu)線性結(jié)構(gòu)和集合結(jié)構(gòu)非常類似,但是線性結(jié)構(gòu)是有序的并且元素之間有聯(lián)系,比如排隊(duì)中的人就可以看做一個(gè)線性結(jié)構(gòu),每個(gè)人是一個(gè)元素同時(shí)每個(gè)人記錄自己前面和后面的人是誰,這樣存儲(chǔ)到計(jì)算機(jī)中后我們可以從任意一個(gè)人訪問到另一個(gè)人。樹形結(jié)構(gòu)和圖狀結(jié)構(gòu)這里暫不介紹,我們的學(xué)習(xí)會(huì)以前兩種為主,因?yàn)樗鼈冎苯訉?duì)應(yīng)了 Python 的基本數(shù)據(jù)類型。什么是數(shù)據(jù)結(jié)構(gòu)2.線性結(jié)構(gòu)TupleTuple又叫元組,是一個(gè)線性結(jié)構(gòu),它的表達(dá)形式是這樣的:即用一個(gè)圓括號(hào)括起來的一串對(duì)象就可以創(chuàng)建一個(gè)Tuple,之所以說它是一個(gè)線性結(jié)構(gòu)是因?yàn)樵谠M中元素是有序的,
3、比如我們可以這樣去訪問它的內(nèi)容這段代碼會(huì)輸出:TupleTuple又叫元組,是一個(gè)線性結(jié)構(gòu),它的表達(dá)形式是切片1.背景切片操作符的和C/C+的下標(biāo)運(yùn)算符非常像,但是在 C/C+ 中,只能用來取出指定下標(biāo)的元素,所以它在 C/C+ 中叫做下標(biāo)運(yùn)算符。在Python中,這個(gè)功能被極大地?cái)U(kuò)展了它不但能取一個(gè)元素,還能取一串元素,甚至還能隔著取、倒著取,反向取等等。由于取一串元素的操作更像是在切片,所以我們稱它為切片操作符。靈活使用切片操作符,往往可以大大簡(jiǎn)化代碼,這也是Python提供的便利之一。切片1.背景切片:取一個(gè)元素如果我們有一個(gè) Tuple,并且我們想取出其中一個(gè)元素,我們可以使用具有一個(gè)
4、參數(shù)的下標(biāo)運(yùn)算符:絕大部分編程語言下標(biāo)都是從0開始的,也就是說在Python中對(duì)于一個(gè)有n個(gè)元素的Tuple,自然數(shù)下標(biāo)的范圍是0n-1。所以這里會(huì)輸出tuple1中下標(biāo)為2的第3個(gè)元素:5這是切片操作符最簡(jiǎn)單的形式,它只接收一個(gè)參數(shù)就是元素的下標(biāo),切片:取一個(gè)元素如果我們有一個(gè) Tuple,并且我們想取出其切片:取一個(gè)元素特別地,Python支持負(fù)數(shù)下標(biāo)表示從結(jié)尾倒著取元素,比如我們?nèi)绻肴〕鲎詈笠粋€(gè)元素:但是要注意的是負(fù)數(shù)下標(biāo)是從-1開始的,所以對(duì)于一個(gè)含有n個(gè)元素的 Tuple,它的負(fù)數(shù)下標(biāo)范圍為-1-n,因此這里得到的是下標(biāo)為4的最后1個(gè)元素,輸出為: 9切片:取一個(gè)元素特別地,Pyt
5、hon支持負(fù)數(shù)下標(biāo)表示從結(jié)尾倒切片:取一個(gè)元素如果我們?nèi)×艘粋€(gè)超出范圍的元素: 那么 Python 解釋器會(huì)拋出一個(gè) IndexError 異常:Traceback (most recent call last):這個(gè)異常的詳細(xì)信息是下標(biāo)超出了范圍。如果遇到這種情況,我們就需要檢查一下代碼是不是訪問了不存在的下標(biāo)。切片:取一個(gè)元素如果我們?nèi)×艘粋€(gè)超出范圍的元素:切片:取連續(xù)的元素這段代碼會(huì)輸出: (1, 3, 5)我們會(huì)發(fā)現(xiàn)結(jié)果仍然是一個(gè) Tuple,由第1個(gè)到第4個(gè)元素之間的元素構(gòu)成,其中包含第1個(gè)元素,但是不包含第4個(gè)元素。這種切片操作接收兩個(gè)參數(shù),開始下標(biāo)和結(jié)束下標(biāo),中間用分號(hào)隔開,也就
6、是上面例子中的0和3,但是要注意的是元素下標(biāo)區(qū)間是左閉右開的。如果對(duì)之前講循環(huán)時(shí)候的 range 還有印象的話,可以發(fā)現(xiàn)它們區(qū)間都是左閉右開的,這是Python中的一個(gè)規(guī)律。切片:取連續(xù)的元素切片:取連續(xù)的元素特殊地,如果我們從第0個(gè)開始取,或者我們要一直取到最后一個(gè),我們可以省略相應(yīng)的參數(shù),比如:第一句表示從第1個(gè)元素取到第3個(gè)元素,第二句表示從第4個(gè)元素取到最后一個(gè),所以輸出為:同樣地,這里也可以使用負(fù)下標(biāo)。切片:取連續(xù)的元素特殊地,如果我們從第0個(gè)開始取,或者我們要切片:以固定間隔取連續(xù)的元素上述取連續(xù)元素的操作其實(shí)還可以進(jìn)一步豐富,例如:這段代碼會(huì)輸出: (3, 7)這里表示的含義就是
7、從第2個(gè)元素取到第5個(gè)元素,每2個(gè)取第一個(gè)。于是我們?nèi)〕隽说?個(gè)和第4個(gè)元素。這也是切片操作符的完整形式,即 開始:結(jié)束:間隔,例如上面的 1:4:2。特殊地,這個(gè)間隔可以是負(fù)數(shù),表示反向間隔,例如這句代碼會(huì)輸出:(9, 7, 5, 3, 1)。翻轉(zhuǎn)了整個(gè)Tuple。切片:以固定間隔取連續(xù)的元素上述取連續(xù)元素的操作其實(shí)還可以進(jìn)修改這里說“修改”并不是原位的修改,因?yàn)門uple的元素一旦指定就不可再修改,而是通過創(chuàng)建一個(gè)新的 Tuple 來實(shí)現(xiàn)修改。這段代碼會(huì)輸出:修改這里說“修改”并不是原位的修改,因?yàn)門uple的元素一旦修改我們通過創(chuàng)建tuple3和tuple4,“修改”了tuple1和tu
8、ple2。同時(shí)要注意的是,之前在講字符串的時(shí)候提到的加法和乘法對(duì)Tuple的操作也是類似的,效果分別是兩個(gè)Tuple元素合并為一個(gè)新的Tuple和重復(fù)自身元素返回一個(gè)新的Tuple。修改我們通過創(chuàng)建tuple3和tuple4,“修改”了tup遍歷遍歷有兩種方法遍歷遍歷有兩種方法遍歷這段代碼會(huì)輸出:1 3 5 7 9 1 3 5 7 9 我們?cè)?print 函數(shù)中加了一個(gè)使結(jié)束符為空的參數(shù),這個(gè)用法會(huì)在下一章函數(shù)中講到,這里只要知道這樣會(huì)使print不再自動(dòng)換行就行了。我們可以通過一個(gè) for 循環(huán)或者 while 循環(huán)直接順序訪問元組的內(nèi)容。顯然for循環(huán)不僅可讀性高而且更加簡(jiǎn)單,在大多數(shù)情況
9、下應(yīng)該優(yōu)先采用for循環(huán)。另外值得一提的是,之所以Tuple可以這樣用for遍歷是因?yàn)門uple包括后面馬上要提到的List和Dict對(duì)象本身是一個(gè)可迭代的對(duì)象,這個(gè)概念之后會(huì)細(xì)講,這里只要學(xué)會(huì)for循環(huán)的用法就行了。遍歷這段代碼會(huì)輸出:1 3 5 7 9 1 3 5 7 9 查找在 Tuple 中查找元素可以用 in,比如:這段代碼會(huì)輸出: We found 3!in 是一個(gè)使用廣泛的判斷包含的運(yùn)算符,類似地還有 not in。in的作用就是判斷特定元素是否在某個(gè)對(duì)象中,如果包含就返回 True,否則返回 False。查找在 Tuple 中查找元素可以用 in,比如:內(nèi)置函數(shù)此外有一些內(nèi)置函
10、數(shù)可以作用于Tuple上,比如:從上到下分別是求tuple1的長度、tuple1中最大的元素、tuple2中最小的元素。這些函數(shù)對(duì)接下來即將講到的List和Dict也有類似的作用。內(nèi)置函數(shù)此外有一些內(nèi)置函數(shù)可以作用于Tuple上,比如:ListList又叫列表,也是一個(gè)線性結(jié)構(gòu),它的表達(dá)形式是:List的性質(zhì)和Tuple是非常類似的,上述Tuple的操作都可以用在List上,但是List有一個(gè)最重要的特點(diǎn)就是元素可以修改,所以List的功能要比Tuple更加豐富。由于List的查找和遍歷語法和Tuple是完全一致的,所以這里就不再贅述了,我們把主要精力放到List的特性上。ListList又叫
11、列表,也是一個(gè)線性結(jié)構(gòu),它的表達(dá)形式是:添加之前已經(jīng)提到了,List是可以修改的,因此我們可以在尾部添加一個(gè)元素,比如:添加之前已經(jīng)提到了,List是可以修改的,因此我們可以在尾部添加輸出: 1, 2, 3, 4, 5, 6append方法的作用是在List后面追加一個(gè)元素,類似地,我們還有 extend 和 insert可以用于添加元素,比如:這段代碼會(huì)輸出:添加輸出: 1, 2, 3, 4, 5, 6添加extend接收一個(gè)參數(shù),內(nèi)容為要合并進(jìn)這個(gè)list的一個(gè)可迭代對(duì)象,所以這里可以傳入一個(gè)List或者Tuple。insert接收兩個(gè)參數(shù),分別是下標(biāo)和被插入的對(duì)象,可以在指定下標(biāo)位置插入
12、指定對(duì)象。添加刪除由于List元素是可以修改的,因此刪除也是允許的,List刪除元素有三種方法:del 操作符pop 方法remove 方法刪除刪除:del 操作符del 是一個(gè)Python內(nèi)建的一元操作符,只有一個(gè)參數(shù)是被刪除的對(duì)象,比如:這段代碼會(huì)輸出:1, 3, 4, 5del一般用來刪除指定位置的元素。刪除:del 操作符del 是一個(gè)Python內(nèi)建的一元操作刪除:pop 方法pop方法沒有參數(shù),默認(rèn)刪除最后一個(gè)元素,比如:這段代碼會(huì)輸出:刪除:pop 方法pop方法沒有參數(shù),默認(rèn)刪除最后一個(gè)元素,刪除:remove 方法remove方法接收一個(gè)參數(shù),為被刪除的對(duì)象,比如:這段代碼會(huì)
13、輸出:同時(shí)我們也可以看出remove是從前往后查找,刪除遇到第一個(gè)相等的元素。刪除:remove 方法remove方法接收一個(gè)參數(shù),為被刪修改List可以在原位進(jìn)行修改,直接用下標(biāo)訪問就可以,比如:這段代碼會(huì)輸出:這樣第三個(gè)元素就被修改了。修改List可以在原位進(jìn)行修改,直接用下標(biāo)訪問就可以,比如:修改還記得我們剛剛學(xué)習(xí)的切片操作符嗎?對(duì)于List來說可以一次修改一段值,比如:這段代碼會(huì)輸出:修改還記得我們剛剛學(xué)習(xí)的切片操作符嗎?對(duì)于List來說可以一修改也可以等間隔賦值:這段代碼會(huì)輸出:修改也可以等間隔賦值:修改很多時(shí)候我們希望在遍歷過程中修改值,那么就有了問題,如果我們刪除了一個(gè)值,那么之
14、后會(huì)不會(huì)遍歷到已刪除的值?而如果我們?cè)谖膊刻砑恿艘粋€(gè)值,那么之后新添加的值會(huì)不會(huì)被遍歷到?在Python中遍歷List時(shí)候修改值是完全安全的,不會(huì)遍歷到刪除的值并且新添加的值會(huì)正常遍歷,下面是一個(gè)例子:修改很多時(shí)候我們希望在遍歷過程中修改值,那么就有了問題,如果修改修改修改在for循環(huán)中的建立的循環(huán)變量item只是原對(duì)象list1中元素的一個(gè)拷貝,所以直接修改item不會(huì)對(duì)list1造成任何影響,我們依舊需要用下標(biāo)或者List的方法來修改list1的值。之前我們都是通過while來完成跟下標(biāo)有關(guān)的循環(huán)的,這里就介紹一下如何用for來進(jìn)行下標(biāo)相關(guān)的循環(huán),那就是利用enumerate返回一個(gè)迭代器
15、,這個(gè)迭代器可以同時(shí)生成下標(biāo)和對(duì)應(yīng)的值用于遍歷。當(dāng)然由于我還沒有講到函數(shù)和面向?qū)ο蟮南嚓P(guān)知識(shí),這里只要有個(gè)印象即可,能模仿使用更好。修改在for循環(huán)中的建立的循環(huán)變量item只是原對(duì)象list排序和翻轉(zhuǎn)很多時(shí)候,我們希望數(shù)據(jù)是有序的,而List提供了sort方法用于排序和reverse方法用于翻轉(zhuǎn),比如:排序和翻轉(zhuǎn)很多時(shí)候,我們希望數(shù)據(jù)是有序的,而List提供了s排序和翻轉(zhuǎn)代碼會(huì)輸出:第一個(gè) reverse方法的作用就是將List前后翻轉(zhuǎn),第二個(gè)sort方法是將元素從小到大排列,第三個(gè) sort 加了一個(gè) reversed=True 的參數(shù),所以它會(huì)從大到小排列元素。排序和翻轉(zhuǎn)代碼會(huì)輸出:推導(dǎo)
16、式列表推導(dǎo)式是一種可以快速生成 List 的方法。比如生成一個(gè)含有 0-100 中所有偶數(shù)的列表:怎么理解這個(gè)語法呢?這里的語法很像經(jīng)典集合論中對(duì)集合的定義,其中最開始的 i 是代表元素,而后面的for i in range(101) 說明了這個(gè)元素的取值范圍,最后的一個(gè) if 是限制條件。推導(dǎo)式列表推導(dǎo)式是一種可以快速生成 List 的方法。推導(dǎo)式同時(shí)代表元素還可以做一些簡(jiǎn)單的運(yùn)算,比如:這里輸出的結(jié)果是:0, 1, 4, 9, 16, 25, 36, 49, 64, 81這里我們依靠列表推導(dǎo)式就快速生成了 100 以內(nèi)的完全平方數(shù)。另外值得一提的是,列表推導(dǎo)式不僅簡(jiǎn)潔、可讀性高,更關(guān)鍵的是
17、相比之前的循環(huán)生成列表推導(dǎo)式的效率要高得多,因此在寫 Python 代碼中應(yīng)該善于使用列表推導(dǎo)式。推導(dǎo)式同時(shí)代表元素還可以做一些簡(jiǎn)單的運(yùn)算,比如:DictDict中文名為字典,與上面的Tuple和List不同,是一種集合結(jié)構(gòu),因?yàn)樗鼭M足集合的三個(gè)性質(zhì)即無序性,確定性和互異性。創(chuàng)建一個(gè)字典的語法是:這段代碼我們定義了一個(gè) zergling ,它擁有 5 點(diǎn)攻擊力,具有 4.13 的移動(dòng)速度,消耗 50 塊錢。Dict 使用花括號(hào),里面的每一個(gè)對(duì)象都需要有一個(gè)鍵,我們稱之為 Key,也就是冒號(hào)前面的字符串,當(dāng)然它也可以是 int、float 等基礎(chǔ)類型。冒號(hào)后面的是值,我們稱之為 Value,同樣
18、可以是任何基礎(chǔ)類型。所以Dict除了被叫做字典以外還經(jīng)常被稱為鍵值對(duì)、映射等。DictDict中文名為字典,與上面的Tuple和List不DictDict的互異性體現(xiàn)在它的鍵是唯一的,如果我們重復(fù)定義一個(gè)Key,后面的定義會(huì)覆蓋前面的,比如:# 請(qǐng)不要這么做這段代碼會(huì)輸出:6DictDict的互異性體現(xiàn)在它的鍵是唯一的,如果我們重復(fù)定Dict相比Tuple和List,Dict 有以下特點(diǎn):(1)查找比較快(2)占用更多空間(3)Key不可重復(fù),且不可變(4)數(shù)據(jù)不保證有序存放這里最重要的特點(diǎn)就是查找速度快,對(duì)于一個(gè)Dict來說無論元素有10個(gè)還是10萬個(gè)查找某個(gè)特定元素花費(fèi)的時(shí)間都是相近的,而
19、List或者Tuple查找特定元素花費(fèi)的時(shí)間會(huì)隨著元素?cái)?shù)目的增長線性增長。Dict相比Tuple和List,Dict 有以下特點(diǎn):訪問Dict 的訪問和 List 與 Tuple 類似,但是必須要用Key作為索引:這里會(huì)輸出: 50如果執(zhí)行注釋里的錯(cuò)誤用法,會(huì)拋出 KeyError 異常,因?yàn)镈ict是無序的,所以無法用下標(biāo)去訪問,報(bào)錯(cuò)為:訪問Dict 的訪問和 List 與 Tuple 類似,但是訪問:使用 in為了避免訪問不存在的 Key,這里有三種辦法第一種辦法是使用 in 操作符,比如:in 操作符會(huì)在Dict所有的Key中進(jìn)行查找,如果找到就會(huì)返回 True,反之返回 False,因
20、此可以確保訪問的時(shí)候Key一定是存在的。訪問:使用 in為了避免訪問不存在的 Key,這里有三種辦法訪問:使用 get 方法第二種辦法是使用 get 方法,比如:get 方法可以節(jié)省一個(gè) if 判斷,它如果訪問了一個(gè)存在的 Key,則會(huì)返回對(duì)應(yīng)的 Value,反之返回 None。訪問:使用 get 方法第二種辦法是使用 get 方法,比如訪問:使用 defaultdict這種辦法需要用到一個(gè) import,它的作用是導(dǎo)入一個(gè)外部的包,這里僅作了解。這段代碼會(huì)輸出:None可以看到 defaultdict 在訪問不存在的 Key 的時(shí)候會(huì)直接返回 None。訪問:使用 defaultdict這種
21、辦法需要用到一個(gè) im修改修改 Dict 中 Value 非常簡(jiǎn)單,和 List 類似只要直接賦值即可:修改修改 Dict 中 Value 非常簡(jiǎn)單,和 List 添加添加的方式和 Python 中聲明變量的方法類似,比如:和List不同的是,由于Dict沒有順序,所以 Dict 不使用 append 等方法進(jìn)行添加,而是只要對(duì)要添加的Key直接賦值就會(huì)自動(dòng)創(chuàng)建新Key,當(dāng)然如果Key已經(jīng)存在的話會(huì)覆蓋原來的值。添加添加的方式和 Python 中聲明變量的方法類似,比如:添加還有一種與上面 get 方法對(duì)應(yīng)的操作,調(diào)用 setdefault 方法:這段代碼會(huì)輸出:添加還有一種與上面 get 方
22、法對(duì)應(yīng)的操作,調(diào)用 setde添加setdefault 是一個(gè)復(fù)合的 get 操作,它接收兩個(gè)參數(shù),分別是 Key 和 Value。首先它會(huì)嘗試去訪問這個(gè) Key,如果存在則返回它對(duì)應(yīng)的值,如果不存在,則創(chuàng)建這個(gè) Key 并將值設(shè)置為 Value,然后返回Value。添加刪除和之前 List 的刪除類似,可以使用 del來刪除,比如:當(dāng)然除了del,Dict也提供了pop方法來刪除元素,不過稍有區(qū)別,比如:可以看到Dict刪除元素的時(shí)候需要一個(gè)Key作為參數(shù),那么有沒有像List那種方便的pop呢?這就要用到popitem了,比如:但是要注意的是,由于Dict本身的無序性,這里popitem刪
23、除的是最后一次插入的元素。刪除和之前 List 的刪除類似,可以使用 del來刪除,比遍歷于Dict由Key和Value構(gòu)成,因此Dict的遍歷是跟Tuple和List有些區(qū)別的。我們先看看如何單獨(dú)獲得Key和Value的集合:這段代碼會(huì)輸出:遍歷于Dict由Key和Value構(gòu)成,因此Dict的遍歷是遍歷我們注意到,這兩個(gè)輸出前面帶有 dict_keys 和 dict_values,因?yàn)檫@兩個(gè)方法的返回值是特殊的對(duì)象而不是 List,所以不能直接使用下標(biāo)訪問,比如:直接下標(biāo)訪問會(huì)報(bào)錯(cuò):遍歷我們注意到,這兩個(gè)輸出前面帶有 dict_keys 和 遍歷它們的用途是遍歷,我們可以用 for 循環(huán)去
24、遍歷:這段代碼會(huì)輸出:遍歷它們的用途是遍歷,我們可以用 for 循環(huán)去遍歷:遍歷類似地,還有一個(gè) items 方法,可以同時(shí)遍歷 Key、Value 對(duì),和之前講到的enumerate非常類似,比如:這段代碼會(huì)輸出:這樣就可以遍歷整個(gè)Dict了。遍歷類似地,還有一個(gè) items 方法,可以同時(shí)遍歷 Key遍歷不過有一點(diǎn)要注意的是,在遍歷過程中可以修改但是不能添加刪除,比如:這樣是會(huì)報(bào)錯(cuò)的,但是修改已有的值是沒問題的,比如:這一點(diǎn)要尤其注意。遍歷不過有一點(diǎn)要注意的是,在遍歷過程中可以修改但是不能添加刪嵌套只有 Tuple、List、Dict 往往是不夠的,我們有時(shí)候需要表示更加復(fù)雜的對(duì)象,因此這
25、時(shí)候我們就需要嵌套使用這三種類型,比如如果我們想表示一艘航空母艦:嵌套只有 Tuple、List、Dict 往往是不夠的,我們嵌套有了這種操作,我們就可以存儲(chǔ)關(guān)系非常復(fù)雜的數(shù)據(jù)了,然后可以通過如下的方式去訪問嵌套的元素:這段代碼會(huì)輸出:嵌套有了這種操作,我們就可以存儲(chǔ)關(guān)系非常復(fù)雜的數(shù)據(jù)了,然后可嵌套可以看出,我們?nèi)绻褂们短椎?Tuple、List、Dict,可以通過一層一層地訪問去訪問或者修改,比如carrier本身就是一個(gè)Dict,因此我們可以用Key訪問,接著carriercost又返回了一個(gè)Dict,于是我們依舊需要用Key訪問,所以我們最終是用carriercostmineral 這
26、種方式訪問到了我們想要的數(shù)據(jù)。嵌套字符串字符串是計(jì)算機(jī)與人交互過程中使用最普遍的數(shù)據(jù)類型。我們?cè)谟?jì)算機(jī)看到的一切文本,實(shí)際上都是一個(gè)個(gè)字符串。在之前的幾章的學(xué)習(xí)里,我們輸出的內(nèi)容都非常的簡(jiǎn)陋,只有一個(gè)數(shù)字或者一句話。本章會(huì)教您如何從屏幕上輸入內(nèi)容以及如何按照特定的需求來構(gòu)造字符串。字符串字符串表示我們先來看一下字符串的表示方式,實(shí)際上在之前輸出 hello world 的時(shí)候我們已經(jīng)用過了,代碼如下:字符串表示我們先來看一下字符串的表示方式,實(shí)際上在之前輸出 字符串表示這里使用了4種字符串的表示方式,依次認(rèn)識(shí)一下吧。str1 和 str2 使用了一對(duì)雙引號(hào)或單引號(hào)來表示一個(gè)單行字符串。而 st
27、r3 和 str4 使用了三個(gè)雙引號(hào)或單引號(hào)來表示一個(gè)多行字符串。那么使用單引號(hào)和雙引號(hào)的區(qū)別是什么?仔細(xì)觀察一下 str1 和 str2 ,在 str1 中,字符串內(nèi)容包含單引號(hào),在 str2 中,字符串內(nèi)容包括雙引號(hào)。字符串表示這里使用了4種字符串的表示方式,依次認(rèn)識(shí)一下吧。字符串表示如果在單引號(hào)字符串中使用單引號(hào),會(huì)出現(xiàn)如下報(bào)錯(cuò):其實(shí)在輸入的時(shí)候就可以看到字符串的后半段完全沒有正常的高亮,而且回車執(zhí)行后還報(bào)了 SyntaxError的錯(cuò)誤。這是因?yàn)閱我?hào)在單引號(hào)字符串內(nèi)不能直接出現(xiàn),Python不知道單引號(hào)是字符串內(nèi)本身的內(nèi)容還是要作為字符串的結(jié)束符來處理。所以兩種字符串最大的差別就是可
28、以直接輸出雙引號(hào)或單引號(hào),這是 Python 特有的一種方便的寫法。字符串表示如果在單引號(hào)字符串中使用單引號(hào),會(huì)出現(xiàn)如下報(bào)錯(cuò):字符串表示但是另一個(gè)問題出現(xiàn)了,如果要同時(shí)輸出單引號(hào)和雙引號(hào)呢?也就是說我們要用一種沒有歧義的表達(dá)方式來告訴Python這個(gè)字符是字符串本身的內(nèi)容而不是結(jié)束符,這就需要用到轉(zhuǎn)義字符了。字符串表示轉(zhuǎn)義字符右表所示是Python中的轉(zhuǎn)義字符。實(shí)際上所有的編程語言都會(huì)使用轉(zhuǎn)義字符,因?yàn)闆]有編程語言會(huì)不支持字符串,只不過不同的編程語言可能略有差別。轉(zhuǎn)義字符右表所示是Python中的轉(zhuǎn)義字符。轉(zhuǎn)義字符使用轉(zhuǎn)義字符我們就能輸出所有不能直接輸出的字符了,例如,我們可以在 IPytho
29、n 或者 PyCharm 中執(zhí)行這兩句代碼,然后會(huì)聽到一聲“嗶”。這是因?yàn)閍是控制字符而不是用于顯示的字符,它的作用就是讓主板蜂鳴器響一聲。轉(zhuǎn)義字符使用轉(zhuǎn)義字符我們就能輸出所有不能直接輸出的字符了,例轉(zhuǎn)義字符特殊地,如果我們想輸出一個(gè)不加任何轉(zhuǎn)義的字符串,可以在前面加一個(gè) r,表示raw string,比如:這段代碼會(huì)輸出:可以看到其中的 n 并沒有被當(dāng)做換行輸出。轉(zhuǎn)義字符特殊地,如果我們想輸出一個(gè)不加任何轉(zhuǎn)義的字符串,可以格式化字符串如果僅僅是輸出一個(gè)字符串,那么我們通過 print 函數(shù)就可以直接輸出。但是我們可能會(huì)遇到以下幾種應(yīng)用情景:今天是 2000 年 10 月 27 日今天的最高氣
30、溫是 26.7 攝氏度 我們支持張先生上面三個(gè)字符串中,第一個(gè)字符串,我們希望其中的年、月、日是可變的,第二個(gè)字符串,我們希望溫度是可變的,第三個(gè)字符串中,我們希望姓氏是可變的。我們一共有三種方式可以完成這種操作,其中一種方法只支持3.6以上的Python版本,使用時(shí)需要注意。格式化字符串如果僅僅是輸出一個(gè)字符串,那么我們通過 prin格式化字符串我們先看看 Python 3.6 之前的兩種方法。對(duì)于字符串中的%d, %f, %s,可以簡(jiǎn)單理解為一個(gè)指定了數(shù)據(jù)類型的占位符,會(huì)由百分號(hào)后面的數(shù)據(jù)依次填充進(jìn)去。格式化字符串我們先看看 Python 3.6 之前的兩種方法格式化字符串這段代碼的輸出為
31、:這個(gè) 26.700000 跟我們想象的結(jié)果不太一樣,有效數(shù)字太多了,那么我們?cè)趺纯刂颇??格式化字符串這段代碼的輸出為:格式化字符串實(shí)際上在我們使用格式化字符串的時(shí)候,發(fā)生了浮點(diǎn)數(shù)到字符串的轉(zhuǎn)換,這種轉(zhuǎn)換存在一個(gè)默認(rèn)的精度。要想改變這個(gè)精度,我們需要在格式化字符串的時(shí)候添加一些參數(shù):這樣的話,就會(huì)輸出:這樣就保留了一位小數(shù)。對(duì)于 %f來說,控制有效數(shù)字的方法是 %整數(shù)長度.小數(shù)長度f ,其中兩個(gè)長度都是可以省略的。格式化字符串實(shí)際上在我們使用格式化字符串的時(shí)候,發(fā)生了浮點(diǎn)數(shù)格式化字符串上面是第一種格式化字符串的方式,但是它需要指定類型才能輸出,要記這么多占位符有點(diǎn)麻煩也不太人性化,所以接下來講
32、解一種更加靈活的辦法,就是字符串的 format 方法。這里出現(xiàn)了一個(gè)陌生的名詞“方法”,一個(gè)面向?qū)ο蟪绦蛟O(shè)計(jì)里的概念。舉個(gè)例子來簡(jiǎn)單說明:由于還沒有接觸過函數(shù)的概念,因此這行代碼我們暫時(shí)可以這么理解:我們對(duì)object這個(gè)對(duì)象以arg1, arg2, arg3的方式做了dosomething的操作,其中點(diǎn)表示調(diào)用相應(yīng)對(duì)象的方法。總之這里我們只要有一個(gè)模糊的認(rèn)知并且知道語法就行了,具體的原理會(huì)隨著學(xué)習(xí)的深入逐漸明白。格式化字符串上面是第一種格式化字符串的方式,但是它需要指定類格式化字符串對(duì)于字符串的format的方法,我們依舊是從一個(gè)例子入手:format中的參數(shù)被依次填入到了之前字符串的大括
33、號(hào)中,所以輸出為:格式化字符串對(duì)于字符串的format的方法,我們依舊是從一個(gè)格式化字符串如果我們想改變一下浮點(diǎn)數(shù)輸出的精度,則需要:3.3f 我們已經(jīng)認(rèn)識(shí)了,表示整數(shù)3位小數(shù)3位,前面的0=是什么呢?在這之前我們先看0是什么意思,看另一個(gè)例子:這段代碼會(huì)輸出:結(jié)合例子不難看出,0=前面的0其實(shí)是格式化的順序,也就是說默認(rèn)格式化順序是從左到右的,我們也可以顯示指定這個(gè)順序,不過如果需要用到自定義格式,這個(gè)順序必須顯式給出。格式化字符串如果我們想改變一下浮點(diǎn)數(shù)輸出的精度,則需要:格式化字符串特別地,字符串在Python中是一個(gè)不可變的對(duì)象,format方法的本質(zhì)是創(chuàng)建了一個(gè)新的字符串作為返回值,
34、而原字符串是不變的,這浪費(fèi)了空間也浪費(fèi)了時(shí)間,而在Python3.6引入的格式串可以有效的解決這個(gè)問題。格式化字符串格式化字符串關(guān)于格式串我們看一個(gè)例子:字符串前加一個(gè)f表示這是一個(gè)格式串,接下來Python就會(huì)在當(dāng)前語境中尋找大括號(hào)中的變量然后填進(jìn)去,如果變量不存在會(huì)報(bào)錯(cuò)。對(duì)于上面這個(gè)例子,會(huì)輸出如下結(jié)果:今天是 2000 年 10 月 27 日今天的最高氣溫是 26.7 攝氏度我們支持張先生相對(duì)前兩種格式化字符串的方式,這種方式非常靈活,比如:# 字符串嵌套表達(dá)式a = 1.5b = 2.5str1 = fa + b = a + b# 字符串排版,表示居中,數(shù)字是寬度str2 = fa:
35、a:10, b: b:10.# 指定位數(shù)和精度# 這種新格式化方式可以嵌套使用width = 3precision = 5str3 = fa: a:width.precision.# 進(jìn)制轉(zhuǎn)換str4 = fint: 31, hex: 31:x, oct: 31:oprint(str1)print(str2)print(str3)print(str4)這段代碼的輸出是:a + b = 4.0a: 1.5 , b: 2.5 .a: 1.5.int: 31, hex: 1f, oct: 37另外值得一提的是,如果需要取消轉(zhuǎn)義,可以連用 f 和 r,比如str5 = frthis n will no
36、t be new lineprint(str5)特殊地,如果在格式串中如果想輸出花括號(hào),需要兩個(gè)相同的花括號(hào)連用,例如:str6 = f print(str6)這段代碼的輸出為: 可以看到大括號(hào)被正常輸出。格式化字符串關(guān)于格式串我們看一個(gè)例子:格式化字符串字符串前加一個(gè)f表示這是一個(gè)格式串,接下來Python就會(huì)在當(dāng)前語境中尋找大括號(hào)中的變量然后填進(jìn)去,如果變量不存在會(huì)報(bào)錯(cuò)。對(duì)于上面這個(gè)例子,會(huì)輸出如下結(jié)果:格式化字符串字符串前加一個(gè)f表示這是一個(gè)格式串,接下來Pyt格式化字符串相對(duì)前兩種格式化字符串的方式,這種方式非常靈活,如右圖:格式化字符串相對(duì)前兩種格式化字符串的方式,這種方式非常靈活,
37、格式化字符串這段代碼的輸出是:另外值得一提的是,如果需要取消轉(zhuǎn)義,可以連用 f 和 r,比如格式化字符串這段代碼的輸出是:格式化字符串特殊地,如果在格式串中如果想輸出花括號(hào),需要兩個(gè)相同的花括號(hào)連用,例如:這段代碼的輸出為:可以看到大括號(hào)被正常輸出。格式化字符串特殊地,如果在格式串中如果想輸出花括號(hào),需要兩個(gè)字符串輸入Python 有一個(gè)內(nèi)建的輸入函數(shù),input。我們可以通過這個(gè)函數(shù)來獲取一行用戶輸入的文本,比如:由于input返回的是輸入的字符串,如果我們需要的不是字符串,那么需要對(duì) input 進(jìn)行一次類型轉(zhuǎn)換。另外需要注意的是,input一次只獲取一行的內(nèi)容,也就是說只要回車input
38、就會(huì)立即返回當(dāng)前這一行的內(nèi)容,并且不會(huì)包含換行符。字符串輸入Python 有一個(gè)內(nèi)建的輸入函數(shù),input。我字符串運(yùn)算字符串也是可以進(jìn)行一些運(yùn)算的,我們先看一個(gè)例子:這段代碼會(huì)輸出:字符串運(yùn)算字符串也是可以進(jìn)行一些運(yùn)算的,我們先看一個(gè)例子:字符串運(yùn)算字符串支持以下操作符字符串運(yùn)算字符串支持以下操作符內(nèi)建方法右側(cè)表摘錄自 Python 官方的文檔,其中中括號(hào)表明是可選參數(shù)。下面舉一些例子來看一看這些方法怎么使用。內(nèi)建方法右側(cè)表摘錄自 Python 官方的文檔,其中中括號(hào)表內(nèi)建方法1.count(sub, start, end)其中,start 和 end 均為可選參數(shù),默認(rèn)是字符串開始和結(jié)尾,
39、輸出是: 22.find(sub, start, end)默認(rèn)返回第一次出現(xiàn)的位置,找不到返回 -1,比如:輸出是:0 -1內(nèi)建方法1.count(sub, start, end內(nèi)建方法3.isalpha() 和 isdigit()用來判斷是不是純數(shù)字或者純字母,比如:輸出是:內(nèi)建方法3.isalpha() 和 isdigit()內(nèi)建方法4.join(iterable)理解join需要用到后面的知識(shí),這里只要有一個(gè)直觀的感覺就好了,比如:輸出:就是以特定的分割符把一個(gè)可迭代對(duì)象連接成字符串。內(nèi)建方法4.join(iterable)內(nèi)建方法5.lstrip(chars), rstrip(chars) 和 strip(chars)這三個(gè)非常方法的功能接近,比如:輸出是:內(nèi)建方法5.lstrip(chars), rstrip(內(nèi)建方法這里我們?yōu)榱四軌蚯逦吹綌?shù)據(jù)的內(nèi)容,我們引入了一個(gè)新的內(nèi)建函數(shù) repr ,它的作用是將一個(gè)對(duì)象轉(zhuǎn)化成供解釋器可讀取的字面量,所以我們能看到轉(zhuǎn)義符號(hào)和兩邊的引號(hào)等等字
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026湖南郴州市宜章縣婦幼保健院招募見習(xí)生2人考試參考試題及答案解析
- 2026廣東東莞市沙田鎮(zhèn)社區(qū)衛(wèi)生服務(wù)中心第一期招聘納入崗位管理編制外人員4人考試備考試題及答案解析
- 2026湖南張家界桑植縣第一季度縣直事業(yè)單位選調(diào)工作人員9人考試備考試題及答案解析
- 2026貴州銅仁市第二人民醫(yī)院收費(fèi)室見習(xí)生招募考試參考試題及答案解析
- 2026陜西寶雞市科技創(chuàng)新交流服務(wù)中心招聘高層次人才3人考試備考試題及答案解析
- 2026浙江紹興市口腔醫(yī)院第一次招聘博士研究生1人考試參考試題及答案解析
- 2026重慶市萬州區(qū)太龍鎮(zhèn)人民政府招聘非全日制公益性崗位人員4人考試備考試題及答案解析
- 久治縣醫(yī)共體2026年面向社會(huì)公開招聘編外臨聘人員16人考試參考試題及答案解析
- 2026浙江麗水學(xué)院招聘(引進(jìn))高層次人才71人(2026年第1號(hào))考試備考試題及答案解析
- 2026上海寶山區(qū)行知科創(chuàng)學(xué)院“蓄電池計(jì)劃”招募考試參考試題及答案解析
- YY/T 0729.3-2009組織粘合劑粘接性能試驗(yàn)方法第3部分:拉伸強(qiáng)度
- GB/T 5187-2008銅及銅合金箔材
- GB/T 26218.1-2010污穢條件下使用的高壓絕緣子的選擇和尺寸確定第1部分:定義、信息和一般原則
- GB/T 18934-2003中國古典建筑色彩
- GB/T 15114-1994鋁合金壓鑄件
- 農(nóng)民工討薪突發(fā)事件應(yīng)急預(yù)案
- 心理健康試卷分析及分析報(bào)告
- GB 19195-2003普及(娛樂)類卡丁車通用技術(shù)條件
- 有限合伙GP和LP合作協(xié)議(持股平臺(tái)使用,可做章程使用)
- 地下空間權(quán)評(píng)估
- 化工可行性研究報(bào)告之年產(chǎn)2萬噸甲醇鈉甲醇溶液生產(chǎn)裝置建設(shè)項(xiàng)目可行性研究報(bào)告暨可行性研究報(bào)告
評(píng)論
0/150
提交評(píng)論