注:本文所有代碼均經(jīng)過Python 3.7實際運行檢驗,保證其嚴謹性。
字符串的表示
Python提供了4種表示字符串的方法:
s1 = '我'
s2 = "我"
s3 = '''我'''
s4 = """我"""
大多數(shù)情況下,以上4種字符串的表示效果是一樣的,只要注意前后的引號一定是成對的;換句話說,前面是單引號后面一定也是單引號,前面是3個雙引號,后面句不能用3個單引號結(jié)尾。
默認來說,單純的字符串一般多用第1種,即兩個單引號。3個單引號和3個雙引號有特殊的用途,就是它們可以用于多行字符串引用,如下面的例子:
s = '''
人生到處知何似,應(yīng)似飛鴻踏雪泥:
泥上偶然留指爪,鴻飛那復(fù)計東西。
老僧已死成新塔,壞壁無由見舊題。
往日崎嶇還記否,路長人困蹇驢嘶。'''
print(s)
<<< # 正確輸出,且是分行的。
人生到處知何似,應(yīng)似飛鴻踏雪泥:
泥上偶然留指爪,鴻飛那復(fù)計東西。
老僧已死成新塔,壞壁無由見舊題。
往日崎嶇還記否,路長人困蹇驢嘶。
<<<
這種這種功能是2個單引號或2個雙引號表示法所不能做到的。如果多行字符串用2個單引號或2個雙引號來表示的話,系統(tǒng)會報錯。如下所示:
s = '人生到處知何似,應(yīng)似飛鴻踏雪泥:
泥上偶然留指爪,鴻飛那復(fù)計東西。
老僧已死成新塔,壞壁無由見舊題。
往日崎嶇還記否,路長人困蹇驢嘶。'
print(s)
<<<
File "C:\xxxxx\test.py", line 1
s = '人生到處知何似,應(yīng)似飛鴻踏雪泥:
^
SyntaxError: EOL while scanning string literal
<<<
轉(zhuǎn)義符\
轉(zhuǎn)義符表達特定字符的本意。
轉(zhuǎn)義符和某些字母搭配有固定的意思,比如
"\b"回退,"\n"換行(光標(biāo)移動到下行首),"\r"回車(光標(biāo)移動到本行首)等。
字符串操作符
n * x 或 x * n:復(fù)制n次字符串x。
字符串處理函數(shù)
hex(x):整數(shù)x轉(zhuǎn)化為以字符串形式表示的十六進制的數(shù)。
oct(x):整數(shù)x轉(zhuǎn)化八進制以字符串形式表示的八進制的數(shù)。
chr(u):u為Unicode編碼,返回其對應(yīng)的字符。
ord(x):x為字符,返回其對應(yīng)的Uniocde編碼。比如ord("A")輸出65,ord("B")輸出66,ord("a")輸出97。
Unicode編碼
Python 3的字符串的編碼方式
- 統(tǒng)一字符編碼,即覆蓋幾乎所有字符的編碼方式。
- 0到1114111(0x10FFFF)空間,每個編碼對應(yīng)一個字符。
- Python字符串中每個字符都是Unicode編碼字符。
for i in range(12):
print(chr(9800 + i), end = "")
<<<????????????
以上是輸出Unicode中十二星座的符號。
字符串處理方法
“方法”(method),在編程中是一個專有名詞。
“方法”特指<a>.<b>()風(fēng)格中的函數(shù)<b>()。
方法本身也是函數(shù),但與<a>有關(guān),<a>.<b>()風(fēng)格(面向?qū)ο缶幊蹋┦褂谩?lt;a>.<b>()就是對象.方法()。a是對象,b是方法。
字符串和變量都是<a>,也就是對象,存在一些方法。
字符串的方法及引用
str.lower()或str.upper()——返回字符串的副本,全部字符小寫/大寫。
str.split(sep=None, num=-1)——返回一個列表。
其中,sep是separater的前三個字母,表示分隔符。sep分隔符默認為所有的空字符,包括空格、換行(\n)、制表符(\t)等,也可以為空(即不帶任何東西,不帶引號,如(str.split()),也可以為空格(如str.split(" ")),但不能為空字符串(str.split("")),否則會報錯ValueError: empty separator;num表示分隔的次數(shù),默認為-1,即全部分隔。
此方法可以將字符串轉(zhuǎn)化成列表。如"A, B, C".split(",")結(jié)果為['A', 'B', 'C']。
s = 'a-b-c'
l = s.split('-')
print(l)
l = s.split() #分隔符sep為空的情況。
print(l)
l = s.split('-', 1) #分隔次數(shù)為1的情況。
print(l)
<<<
['a', 'b', 'c']
['a-b-c'] #分隔符sep為空的情況。#
['a', 'b-c'] #分隔次數(shù)為1的情況。#
<<<
str.count(sub)——返回子串sub在str中出現(xiàn)的次數(shù)。
str.replace(old, new)——返回字符串str的副本,其中所有old子串被替換為new。
str.center(width[, fillchar])——字符串str根據(jù)寬度width居中,fillchar可選。
s1 = "Python"
s2 = s1.center(20, "=")
print("s2是:")
print(s2)
print("len(s2) =", len(s2))
<<<
s2是:
=======Python======= #字符串s2的長度len為20
len(s2) = 20
<<<
str.strip()——返回str的副本,這個副本原字符串的頭和尾的空格,以及位于頭尾的\n \t之類的字符給刪掉了。注意,字符中間的空格等符號不刪除。比如" Py thon ".strip()返回為"Py thon"。
str.strip(chars)——從str中去掉在其左側(cè)和右側(cè)chars字符串中含有的字符。如"= python= ".strip(" =np")的輸出為"ytho"。
sep.join(seq)——sep表示分隔符,可以為空,但當(dāng)sep為空時,就沒有分隔符了。seq表示要連接的元素序列,比如字符串、元組、字典、集合。如果序列里的元素為int,必須轉(zhuǎn)化為str才能使用該方法。實現(xiàn)的效果是,把seq轉(zhuǎn)換為字符串,并且在seq中的除最后元素外每個元素后增加一個sep,返回一個以分隔符sep連接各個元素后生成的字符串。此方法主要為了字符增加分隔符,將列表等seq轉(zhuǎn)化為字符串。
值得注意的是,字典雖然是無序的,但是使用了sep.join(seq)方法后,輸出的字符串只輸出鍵而不輸出值,而且其鍵輸出的順序是按照字典本身的順序來的。集合則遵循無序的原則。
s = "abcde" # seq為字符串時
l = ['a', 'b', 'c', 'd', 'e'] # seq為列表時
d = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}
S = {'a', 'b', 'c', 'd', 'e'}
i = '' # sep為空
j = "-" # sep不為空
print("sep為空時:字符串轉(zhuǎn)化為{},列表轉(zhuǎn)化為{}。".format(i.join(s), i.join(l)))
print("sep不為空時:字符串轉(zhuǎn)化為{},列表轉(zhuǎn)化為{}。".format(j.join(s), j.join(l)))
print("sep為空時:字典轉(zhuǎn)化為{},集合轉(zhuǎn)化為{}。".format(i.join(d), i.join(S)))
print("sep不為空時:字典轉(zhuǎn)化為{},集合轉(zhuǎn)化為{}。".format(j.join(d), j.join(S)))
<<<
sep為空時:字符串轉(zhuǎn)化為abcde,列表轉(zhuǎn)化為abcde。
sep不為空時:字符串轉(zhuǎn)化為a-b-c-d-e,列表轉(zhuǎn)化為a-b-c-d-e。
sep為空時:字典轉(zhuǎn)化為abcde,集合轉(zhuǎn)化為ceabd。
sep不為空時:字典轉(zhuǎn)化為a-b-c-d-e,集合轉(zhuǎn)化為c-e-a-b-d。
<<<
上述字符串的諸多方法中,str.split(sep=None, num=-1)和sep.join(seq)兩個可能是比較重要且容易弄混的。它們的重要性在于它們能夠使得字符串和列表(后面要學(xué)的一種重要數(shù)據(jù)類型)之間互相轉(zhuǎn)換。請對它們稍微留意一二,多看看它們在本文里相應(yīng)的例子。
字符串的索引和切片
字符串還有一種非常重要的操作,也是最常用的操作之一,那就是切片(slicing)。
而字符串的切片操作是根據(jù)索引(index)進行的,其目的是從字符串提取里面的元素或子串。
索引(indexing)
任意一個字符串,除了有其字面上的元素外,其實還有字面外的隱藏元素,也就是字面元素對應(yīng)的“編號”。比如s = 'abc','a'不光是s中的元素,還是s中的第1個元素。
Python中字符串有兩套編號:
- 從左向右的編號,采用非負整數(shù)編號。從0開始編號,向右依次加1。對s = 'abc'而言,s[0] = 'a'表示s的第1個元素,s[1] = 'b'表示s的第2個元素,依此類推。
- 從右向左的編號,采用負整數(shù)編號。從-1開始,向左依次減1。對s = 'abc'而言,s[-1] = 'c'表示s的倒數(shù)第1個元素,s[-2] = 'b'表示s的
倒數(shù)第2個字符,依此類推。
s = 'abc'
s[0] # s的第1個元素
Out[10]: 'a'
s[1]
Out[11]: 'b'
s[-1] # s的倒數(shù)第1個元素
Out[12]: 'c'
s[-2]
Out[13]: 'b'
切片(Slicing)
切片語法的原型是s[start:stop:stepSize],其中start、stop和stepSize三個參數(shù)均是可選參數(shù)。
start:切片開始的元素的索引(index),該索引對應(yīng)的元素包含在切片后的字符串當(dāng)中。
stop:切片結(jié)束的元素的索引(index),該索引對應(yīng)的元素不包含在切片后的字符串當(dāng)中。
stepSize:切片時的步長,默認為1。
要正確理解切片的這幾個函數(shù)。請參考range()函數(shù)中的同樣的參數(shù),它們的含義是相通的。range()函數(shù)詳解請移步Python零基礎(chǔ)入門學(xué)習(xí)02:Python基本數(shù)據(jù)類型:數(shù)字類型查看最后一部分。
切片語法的最簡形式是s[:],其效果就是s字符串本身,即s[:]=s。其簡單形式還有s[::],效果等同于s[:]。還有s[start: : ]、s[:stop:]、s[: :stepSize]等形式。
'abc'[1:3],表示從index=1的元素開始獲取,直到取到index=3的元素,但不獲取index=3的元素。這里是切片的幾個例子:
s = 'abc'
s[1:3]
Out[15]: 'bc'
s[:]
Out[16]: 'abc'
s[1:]
Out[17]: 'bc'
s[1::2]
Out[18]: 'b'
To be continued.