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

2.8 字符串

本節介紹一個使用頻率非常高的數據類型——字符串,它屬于不可變序列。

字符串通常用來描述一段文本信息,它只是純粹的文本,可以包含字符、數字等ASCII編碼字符,也可以包含漢字、韓文、日文等Unicode編碼字符。

2.8.1 字符串的聲明

字符串有3種聲明方式:單引號、雙引號、三引號(三引號用于聲明多行文本)。

1)單引號聲明方式

注意:這里輸入的是一對單引號,但是里邊沒有包含任何內容,它的結果就是一個空的字符串。

2)雙引號聲明方式

當我們直接在交互式提示符下面寫“name”時,它以內部呈現的方式顯示為單引號,當然這個不影響它最終的結果特性。

如果字符串里面包含單引號,定界符就用雙引號,反之亦然。例如:

3)三引號聲明方式

在Python中還有一種聲明字符串的方法,就是三引號,即左側三個引號,右側三個引號,它可以聲明一個多行的字符串。假定聲明的文本信息不只一行,而是有多行,那么可以直接使用三引號來進行聲明(這個三引號不管是單引號還是雙引號都可以,只要左右兩側保持一致就行)。

用三引號聲明的字符串從表面上來看是為了保存多行信息,但事實上在某些特定的場景有特定的用途,在方法或類定義時它可以作為方法或類成員的一個文檔聲明信息,出現在幫助文檔或幫助信息里。

2.8.2 轉義字符

如果一個字符串用雙引號或單引號作為定界符,而在引號中又想出現一個特定的單引號或雙引號,這時可用稱為轉義字符的方式來實現。

當在交互式提示符下聲明某些特定的變量時,有些字符輸入可能會有些麻煩,例如,使用單引號來聲明一個變量s,由于單引號聲明的時候它不能聲明多行字符串,例如:

實際上我們希望網址在下一行輸出,但用單引號或雙引號聲明方式又沒辦法輸入換行符,因此,最后的結果就顯示在一行上了,未能達成目標。

如果不用三引號,就使用單引號或雙引號,那中間的字符能否換行顯示呢?其實也是可以的。通過前面的例子可知,當使用三引號來聲明多行字符串的時候,它的換行是通過一個特定的符號“\n”來實現的,所以,“\n”并不是真正在屏幕上出現一個“\n”,它表示一個換行,因此,可以進行如下聲明來達到目的。

這里的“\n”是一個特定的或特殊的轉義字符,這樣的轉義字符其實有很多。因為在電腦編碼中,有些字符是不打印的,有些是不顯示的,還有些有特殊的結構,這些情況都可以使用特定的以“\”開頭的某一個轉義字符來表示。

通常以反斜線“\”開頭的特殊字符表示的是一個轉義字符,但這樣有時會給字符串的聲明帶來一定的麻煩,例如,假定現在想表示一個路徑:path=“c:\abc\xyz\tag.txt”,命令輸入后會報錯。

原因在于,當我們在普通的字符串中寫上“\”時,它總是和后面的字符形成一個轉義字符,即它把“\a”當作一個整體,但它報錯的位置并不是“\a”,因為“\a”本身是一個正確的轉義字符,系統把“\x”也當作一個轉義字符來解釋,而轉義字符中沒有“\x”,因此,系統報錯。后面的“\t”是正確的,可當作 “Tab”鍵來識別。

因此,如果在聲明字符串時,字符串中本身就有從左到右的一個反斜線“\”,而且并不想表示轉義字符,此時有兩種解決辦法。

方法一:把反斜線“\”本身使用轉義字符來進行聲明,即“\\”,前一個“\”表示轉義,后一個“\”是真正想出現的字符,這樣,最終會出現一個字符“\”。

如果在聲明字符串時,輸入一個轉義字符,很容易出錯,那么可以采用下面的方法。

方法二:“r”后跟原始字符串,忽略轉義字符。

在字符串前面加一個字符“r”(raw,原始的意思),“r”表示聲明,意思是說對于后面出現的“\”,不要當作轉義字符來解釋,而是真實地出現反斜杠“\”。

這樣在聲明字符串時,如果不想出現以反斜杠開頭的轉義字符,那么就在前面加上“r”來忽略轉義字符,只形成一個原始的字符串。

轉義字符是為了呈現在電腦中無法呈現的,或者在鍵盤上無法輸入的內容的特殊符號。常用轉義字符如表2-15所示。

表2-15 常用轉義字符

2.8.3 字符串序列通用操作

字符串也是一個序列類型,屬于序列中的不可變序列。所以,它不支持類似于列表中的可變操作,但它支持序列的通用操作。

1.str字符串支持序列的通用操作

序列的通用操作如判斷元素是否在序列之內、連接序列、重復序列元素、下標獲取元素、訪問指定索引范圍、按步長訪問指定索引范圍、獲取序列長度、獲取最小值、獲取最大值等都可以用在字符串上。但它不支持可變序列及列表的通用操作,因為它有不可變的特性,即字符串不支持原位改變,也不支持擴展操作。如:

1)返回Unicode編碼d對應的單個字符

chr(d):返回Unicode編碼d對應的單個字符

【例】 輸出Unicode編碼從9801開始的10個字符[5]。

2)獲取字符的Unicode編碼

ord(x):獲取字符x的Unicode編碼。

字符串不支持可變序列的如刪除、修改等操作,但作為字符串本身我們會經常碰到需要反復修改它里面的字符的情況。由于字符串的使用頻率非常高,所以Python語言在設計的時候也考慮到了這一點。它可以實現我們想要的目標操作,但是它實現的機制和方法不太一樣。在Python標準庫里內置了很多方法,可以用在字符串上實現一些多元化的操作。

2.8.4 字符串常用內置方法

假設已經定義了一個字符串s,字符串常用內置方法如表2-16所示。

表2-16 字符串常用內置方法

當然字符串內置的方法還有很多,這里只是列舉了一部分。更多方法請使用help命令進行查閱。

關于字符串使用時的幾點說明:

1)字符串拼接

假設有如下的字符串 s,發現其倒數第 2 個字符寫錯了,現在要把它修改正確,可以通過字符串拼接的方法來實現。

盡管不能用原位賦值的方式來進行修改,但是可以按照索引把某一段字符取出來,然后再和其他的字符拼接在一起來達成目標,從而實現替換的功能。

2)字符串的替換方法.replace()

以上通過對字符串切片拼接的方法雖然達成了目標,但這是一種變通的方法,如果要替換的內容比較多,則這種方法的靈活性比較低。這時可以使用字符串自帶的“replace()”方法,這個方法是依附于字符串對象的。

它具備兩個最基本的參數,第一個是要被替換的舊字符,第二個是替換后的新字符,當然它可以是字符串。看下面的示例。

注意:雖然由 s1='aaaaa'得到了'bbbbb',但字符串 s1 并未改變,原因是字符串本身是不可變序列,它是不能改變的!但可以變通地得到改變后的值,即把改變后的值重新賦值給字符串變量s1,讓s1重新指向一個新的對象。

3)拆分、連接方法

還有兩個非常常見的操作,就是將字符串按照特定的字符拆分成一個列表,或將一個列表或可迭代的集合用指定的字符連接成一個字符串。第 3 章遍歷目錄樹要頻繁地用到這兩個方法。

s.split():用于拆分字符串。

s.join():用于將序列中的元素連接成一個字符串,但序列中的元素必須要求是字符串類型的。

join()方法的本意是把一個由字符型數據構成的列表中的元素通過指定的連接符形成一個新的字符串,因此,如果列表中的元素不是字符串類型數據,則不能用此方法進行連接。

split()和join()是非常方便并且在實際開發中使用頻率非常高的兩個方法。

4)格式化字符串方法

關于字符串有一個非常常用的方法——“format()”,用于格式化字符串。

s.format():用來格式化字符串。

先看它的基本操作。

但這樣使用很容易出錯,并且這樣進行“+”連接的效率也不高,而使用 format()可以更高效。

很顯然,將“name”傳遞給第一個位置、“age”傳遞給第二個位置、“job”傳遞給第三個位置,等等。

當然,如果 format()中的參數順序及占位符都是有規律的,就可以把索引“0、1、2”省略掉,如上面的第二個 print 語句,但不提倡這樣,因為如果在同一個位置出現多個結果或在不同的位置出現同一個結果就比較麻煩。但如果帶有參數就好辦了,如上面的第三個 print 語句,有兩個地方都出現了“姓名”,因此,在兩個不同的地方都用占位符{0}來表示。這里的占位符{}也稱為槽,理解為在需要輸出內容的地方事先挖個槽進行占位,所以,有時又把字符串的格式化輸出叫作輸出的槽機制。槽的內部格式為:

{<參數序號>:<格式控制標記>}

無論是否省略“<參數序號>”,只要有“<格式控制標記>”,就不能省略“:”。“<格式控制標記>”用來控制參數顯示時的格式,包括<填充><對齊><寬度><,><精度><類型>6個字段,這些字段是可選的,可以組合使用。

<填充>:用于填充的單個字符。

<對齊>:有3種對齊方式,“<”——左對齊;“>”——右對齊;“^”——居中對齊。

<寬度>:設定的輸出寬度。

<,>:數字的千分位分隔符。

<精度>:浮點數小數部分的精度或字符串的最大輸出長度。

<類型>:整型(用b、c、d、o、x、X表示),浮點型(用e、E、f%表示)。

說明:只有當輸出格式設計得有寬度時才需要考慮對齊和填充的問題!

此外,如果想再輸出一個“部門”信息,而事先并沒有定義存儲“部門”信息的變量,這時可以在 format()參數表中再指定一個變量名稱“department”。若之前沒有定義這個變量,那么可以在后面括號里的參數中加上“department='tech'”,也能得到想要的結果,即在花括號里可以寫上下標索引,也可以寫上一個變量。如果花括號里寫的是變量,則必須要保證在后面傳值的時候給這個變量賦值。

另外,還可以在格式化字符串及前面的占位符中通過添加一些參數或特殊指定的方式給它加上一些高級的語法。這樣使用的好處是不需要像拼接一樣轉換它的類型

其中,{0:10}冒號前面的0表示format()方法中下標索引為0的參數,冒號后面的10表示該參數輸出時所占的位數,如果前面{}的順序與 format()方法中參數的順序保持一致,那還可以省略掉花括號里冒號前的0和1(但不推薦)。還可通過“>”或“<”來指定右對齊或左對齊,“^”是居中對齊。但請注意:“>”或“<”都要放在冒號的后面。

說明:字符串默認左對齊,數字默認右對齊。

我們經常會碰到將一些數值,特別是浮點型數值進行格式化處理的問題,可以通過格式化字符串的高級語法來指定。

注意:

(1)這樣并沒有影響原來的值,只是在呈現的時候進行了處理。

(2){:f}和{}都是普通的輸出方式,即值是多少直接就輸出多少。

(3){:f}輸出時在后面加了一個“0”,以保持固定的位數;而{}完全是原樣輸出。

還可以指定輸出數據的寬度,以及按不同進制數據形式來顯示,如下:

這里的“{:x},{:o},{:b}”分別表示十六進制數、八進制數、二進制數。還要注意:“{:o}”是小寫的字母“o”而不是數字“0”。

以上介紹了字符串的一些常用方法,這些方法可以通過官方文檔進行查詢[6]或通過help(str)命令進行查詢。

以上只介紹了部分字符串方法,當需要更多操作時,我們先不要考慮一些特殊的實現方式,而應該考慮我們正在操作的字符串是不是自帶了一些類似的或可以實現當前功能的方法??梢酝ㄟ^查詢一些相關的資料和文檔來解決問題。

主站蜘蛛池模板: 旬邑县| 井陉县| 贞丰县| 徐州市| 十堰市| 德州市| 拜泉县| 吉水县| 侯马市| 巴林右旗| 嫩江县| 聂拉木县| 资兴市| 蕲春县| 崇仁县| 惠州市| 临清市| 岐山县| 滕州市| 梁山县| 海晏县| 那坡县| 宝丰县| 堆龙德庆县| 岑溪市| 彭阳县| 出国| 颍上县| 峡江县| 河南省| 南澳县| 确山县| 广河县| 抚顺县| 凤冈县| 石泉县| 鹤庆县| 永胜县| 巴青县| 共和县| 安陆市|