python字符串類型


python中的字符串

python中的字符串類型為str,也是平時操作的類型。但除了str類型,還有一個專門的名為"string"的模塊(導入即可知),是很早以前沒有str類型的時候用的,現在幾乎不用。

在python 3.x中,字符串的類型str是Unicode的。除此之外還有byte類型、bytearray類型。關於byte和bytearray,參考bytes和bytearray、編碼和解碼

一些和字符相關的官方手冊:

  1. string模塊
  2. str類型詳細說明
  3. 字面常量
  4. byte和bytearray
  5. byte和bytearray操作

字符串常量

下面是幾個字符串:

'malong'
'malong\'s girl friend'  # 包含了單引號
'malong\n'               # \n換行了
"malong\n"               # 換行了
'malong
girl friend'             # 換行了
'malong\\n'              # 沒換行
'''malong's girl'''      # 包含了單引號
"""malong
shuai"""                 # 換行了

python中可以使用單引號、雙引號、三引號包圍字符串,並可以使用反斜線轉義特殊字符:

  • 單、雙引號是完全一致的,不像其他語言一樣有強、弱引用之分
  • 三引號('''xxx'''"""xxx""")包圍的字符完全是字面符號,包圍什么就得到什么,包括換行,且不會進行任何轉義、替換等
    • 使用這種塊字符串的方式,在輸入需要換行的字符串時非常方便
    • 而且可以作為塊注釋符注釋一段代碼。這表示這段被包圍的代碼解釋為字符串,但因為沒有賦值給變量,所以直接丟棄了
  • 反斜線\可以轉義特殊字符,例如在字符串中保留單引號"a\'b"

但是python在輸出字符串的時候,總是傾向於使用單引號,除非字符串中包含了單引號。對於那些非打印字符,將總是使用十六進制的方式輸出。

例如:

>>> "aaa",'aaa'
('aaa', 'aaa')

>>> print("aa\na")
aa
a
>>> print('aa\na')
aa
a

>>> '''aaaa
... aaa
... '''
'aaaa\naaa\n'

>>> '\001'    # 二進制字符,十六進制格式輸出
'\x01'

raw字符串

雖然可以通過反斜線\轉義去調整字符串,但帶上反斜線有時候會嚴重影響可讀性。如果不想使用反斜線轉義,可以考慮使用三引號包圍,也可以使用r來聲明后面的字符串是raw字符串,這里面的所有字符都是字面意義的,不會進行任何轉義。

例如:

>>> 'abc\nd'
'abc\nd'
>>> len('abc\nd')
5

>>> r'abc\nd'
'abc\\nd'
>>> len(r'abc\nd')
6

經常在open()函數打開Windows文件的時候會使用raw字符串。例如下面三種方式:

open('d:\new\test.txt')   # (1)
open('d:\\new\\test.txt') # (2)
open(r'd:\new\test.txt')  # (3)

(1)中解釋字符串的時候,發現里面有\n\t,它們會分別解釋為換行符和制表符,這顯然不可能是想要打開的文件。所以,在(2)中,使用反斜線將反斜線自身進行了轉義。而(3)中使用r聲明這是一個raw字符串,里面的轉義序列不會進行轉義,而是作為普通字符,所以這里的\表示的是路徑的分隔符號。

當然,考慮到可移植性的問題,open()函數中直接使用斜線也可以表示windows中的路徑分隔符。所以下面是有效的:

open('d:/new/test.txt')

注意,raw字符串不能以反斜線結尾,除非對其轉義。例如r'abc\ndef\'是錯誤語法,但r'abc\ndef\\'是正確的語法,它表示后面有兩個反斜線字符。

>>> r'abc\nd\a\\'
'abc\\nd\\a\\\\'

>>> print(r'abc\nd\a\\')
abc\nd\a\\

>>> r'abc\nd\a\'
  File "<stdin>", line 1
    r'abc\nd\a\'
               ^
SyntaxError: EOL while scanning string literal

字符串轉換

數值和字符串類型不能直接放在一起操作,例如9 + "9"是錯誤的。要將一個數值類型轉換成字符串類型,可以使用str()方法或repr()方法。

>>> str(8)
'8'
>>> repr(8)
'8'

它們都表示返回字符串類型的數據。

當使用print()輸出str()或repr()轉換的內容,它們的結果會不一樣:

>>> print(str('a'))
a
>>> print(repr('a'))
'a'

一般來說使用str()即可,在學習到__str__()__repr__()之前,沒必要去區分str()和repr()。

操作字符串

在python中,操作字符串的方式有多種,大概概括有:

  1. 字符串是一個序列,且是不可變序列,所以序列的通用操作和不可變序列的操作都能應用在str上
  2. string對象自身實現了很多方法,比如大小寫轉換、子串搜索、截斷等等
  3. 字符串連接,如"abc" "def""abc" + "def"是等價的,都是"abcdef""a" * 3得到"aaa"
  4. 字符串格式化(本文不介紹,因為內容太長,見后面的文章)

例如:

>>> len("abc")
3

>>> 'abc' 'def'
'abcdef'
>>> 'abc' + 'def'
'abcdef'

>>> 'abc' * 3
'abcabcabc'
>>> 3 * 'abc'
'abcabcabc'

通過字符串的乘法"*"操作,可以輕松地重復給定數量的字符。例如:

>>> print("-" * 20)
--------------------
>>> print("-" * 20)
--------------------

輕松地就能得到長度一樣的分割線。

注意,這兩個符號不能操作數值、字符串的混合表達式,因為python不會自動轉換隱式轉換數據類型。

>>> "3" + 3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: must be str, not int

因為python中的字符串是一種序列類型,所以可以使用in來測試字符串中是否包含某個字符或子串。

>>> 'o' in "hello"
True
>>> 'a' in "hello"
False
>>> 'll' in "hello"
True

同樣,因為是序列類型,可以使用for來遍歷整個字符串:

>>> str = "longshuai"

>>> for i in str:
...     print(i, end=",")
...
l,o,n,g,s,h,u,a,i,

在for遍歷字符串的過程中,控制變量i會取得字符串中的每個字符。

字符串的索引和分片操作

字符串是一種序列,可以應用序列的一種非常方便的分片操作。關於序列的相關操作(包括分片),詳細內容見python序列操作,此處介紹一些基本的操作。

必須注意,因為字符串是不可變對象,無法原處修改,所以無論是索引取值還是分片操作,都會創建新字符串對象。

索引取單個元素

例如,通過索引從字符串中取元素:

>>> str = "malong"
>>> str[0]
'm'
>>> str[1]
'a'

索引位可以是負數,表示從尾部開始取元素,-1表示倒數第一個元素,-2表示倒數第二個元素。

>>> str[-1]
'g'
>>> str[-2]
'n'

所以,-i的索引位等價於len() - i的索引位。

>>> str[-1]
'g'
>>> str[len(str) - 1]
'g'

分片取多個元素

分片的方式是使用[i:j][i:j:k]的方式,表示從索引位i開始取到索引位j(不包含j),i或j都可以省略。如果指定了k,則表示每隔k個元素取一次,也就是取一次元素之后跳過(k-1)一個元素。i、j、k都可以使用負數。

例如:

>>> str = 'malong'
>>> str[1:3] 
'al'

[1:3]表示從索引位1取到索引位3,不包括3的元素。

可以使用負數的索引位。下面的表示從第3個元素取到倒數第2個元素,但不包含倒數第二個。

>>> str[2:-2]
'lo'

i和j都可以使用負數。

>>> str[-4:-2]
'lo'

可以省略i或j,或都省略。[:j]表示從頭取到索引位為j的元素(不包含j),[i:]表示從索引位i開始取到結尾,[:]表示從頭取到尾,也就是拷貝一份字符串。

>>> str[:3]
'mal'
>>> str[:-1]
'malon'

>>> str[1:]
'along'
>>> str[-4:]
'long'

>>> str[:]
'malong'

指定k時,可以跳過指定間隔的元素。默認為1,表示每隔一個元素取一次,也就是不跳過任何元素。指定為2時表示取1次跳過一個元素。

>>> str
'malong'

>>> str[::1]
'malong'

>>> str[::2]
'mln'

所以,取奇數位的字符和偶數位的字符就很簡單了。

>>> str[::2]   # 取奇數位
'mln'
>>> str[1::2]  # 取偶數位
'aog'

如果k為負數,則表示反序取元素。例如:

>>> 'abcde'[::-1]
'edcba'
>>> 'abcde'[::-2]
'eca'

再看下面反序輸出的例子。

>>> 'abcdefgh'[5:0:-1]
'fedcb'

表示反序0-5的元素abcdef,但不包含0位,即得到fedcb。也就是說得到索引位1-5的反序結果。

所以:

>>> 'abcdefgh'[5:0:-2]
'fdb'

字符串方法

因為內容較多,本人已從官方手冊翻譯並整理成單獨的文章,見python字符串方法整理

修改字符串

字符串是不可變數據類型,要修改字符串,只能通過分片新建字符串對象並進行合並,或者直接使用字符串方法。

例如:

>>> s = "hello"
>>> s[0] = "H"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment

要修改第一個元素,可以從原始字符串中切片取出后面的字符,並結合修改的目標字符構建一個新的字符串,並賦值給原始變量。

>>> s = "hello"
>>> s = "H" + s[1:]
>>> s
'Hello'

再例如,將一個新字符串追加到源字符串的尾部:

>>> s = "hello"
>>> s = s + " world"
>>> s
'hello world'

>>> s = "hello world"
>>> s = s[:6] + "your " + s[6:]
>>> s
'hello your world'

>>> s = "hello world"
>>> where = s.find("world")
>>> where
6
>>> s = s[:where] + "your " + s[where:]
>>> s
'hello your world'

因為會創建新對象,所以會創建新內存空間。但這並不一定意味着效率會有多差,python對於不使用的內存空間會自動回收,在有可能的情況下python會立即重用這段空間。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM