W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
關(guān)于字符串的內(nèi)容,已經(jīng)有兩節(jié)進(jìn)行介紹了。不過,它是一個(gè)話題中心,還要再繼續(xù)。
例如這樣一個(gè)字符串python
,還記得前面對(duì)字符串的定義嗎?它就是幾個(gè)字符:p,y,t,h,o,n,排列起來。這種排列是非常嚴(yán)格的,不僅僅是字符本身,而且還有順序,換言之,如果某個(gè)字符換了,就編程一個(gè)新字符串了;如果這些字符順序發(fā)生變化了,也成為了一個(gè)新字符串。
在python中,把像字符串這樣的對(duì)象類型(后面還會(huì)冒出來類似的其它有這種特點(diǎn)的對(duì)象類型,比如列表),統(tǒng)稱為序列。顧名思義,序列就是“有序排列”。
比如水泊梁山的108個(gè)好漢(里面分明也有女的,難道女漢子是從這里來的嗎?),就是一個(gè)“有序排列”的序列。從老大宋江一直排到第108位金毛犬段景住。在這個(gè)序列中,每個(gè)人有編號(hào),編號(hào)和每個(gè)人一一對(duì)應(yīng)。1號(hào)是宋江,2號(hào)是盧俊義。反過來,通過每個(gè)人的姓名,也能找出他對(duì)應(yīng)的編號(hào)。武松是多少號(hào)?14號(hào)。李逵呢?22號(hào)。
在python中,給這些編號(hào)取了一個(gè)文雅的名字,叫做索引(別的編程語言也這么稱呼,不是python獨(dú)有的。)。
前面用梁山好漢的為例說明了索引。再看python中的例子:
>>> lang = "study python"
>>> lang[0]
's'
>>> lang[1]
't'
有一個(gè)字符串,通過賦值語句賦給了變量lang。如果要得到這個(gè)字符串的第一個(gè)單詞s
,可以用lang[0]
。當(dāng)然,如果你不愿意通過賦值語句,讓變量lang來指向那個(gè)字符串,也可以這樣做:
>>> "study python"[0]
's'
效果是一樣的。因?yàn)閘ang是標(biāo)簽,就指向了"study python"
字符串。當(dāng)讓python執(zhí)行lang[0]
的時(shí)候,就是要轉(zhuǎn)到那個(gè)字符串對(duì)象,如同上面的操作一樣。只不過,如果不用lang這么一個(gè)變量,后面如果再寫,就費(fèi)筆墨了,要每次都把那個(gè)字符串寫全了。為了省事,還是復(fù)制給一個(gè)變量吧。變量就是字符串的代表了。
字符串這個(gè)序列的排序方法跟梁山好漢有點(diǎn)不同,第一個(gè)不是用數(shù)字1表示,而是用數(shù)字0表示。不僅僅python,其它很多語言都是從0開始排序的。為什么這樣做呢?這就是規(guī)定。當(dāng)然,這個(gè)規(guī)定是有一定優(yōu)勢(shì)的。此處不展開,有興趣的網(wǎng)上去google一下,有專門對(duì)此進(jìn)行解釋的文章。
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | |
---|---|---|---|---|---|---|---|---|---|---|---|
s | t | u | d | y | p | y | t | h | o | n |
上面的表格中,將這個(gè)字符串從第一個(gè)到最后一個(gè)進(jìn)行了排序,特別注意,兩個(gè)單詞中間的那個(gè)空格,也占用了一個(gè)位置。
通過索引能夠找到該索引所對(duì)應(yīng)的字符,那么反過來,能不能通過字符,找到其在字符串中的索引值呢?怎么找?
>>> lang.index("p")
6
就這樣,是不是已經(jīng)能夠和梁山好漢的例子對(duì)上號(hào)了?只不過區(qū)別在于第一個(gè)的索引值是0。
如果某一天,宋大哥站在大石頭上,向著各位弟兄大喊:“兄弟們,都排好隊(duì)?!钡刃值軅兣藕弥螅谓f:“現(xiàn)在給各位沒有老婆的兄弟分配女朋友,我這里已經(jīng)有了名單,我念叨的兄弟站出來。不過我是按照序號(hào)來念的。第29號(hào)到第34號(hào)先出列,到旁邊房子等候分配女朋友?!?/p>
在前面的例子中l(wèi)ang[1]能夠得到原來字符串的第二個(gè)字符t,就相當(dāng)于從原來字符串中把這個(gè)“切”出來了。不過,我們這么“切”卻不影響原來字符串的完整性,當(dāng)然可以理解為將那個(gè)字符t賦值一份拿出來了。
那么宋江大哥沒有一個(gè)一個(gè)“切”,而是一下將幾個(gè)兄弟叫出來。在python中也能做類似事情。
>>> lang
'study python' #在前面“切”了若干的字符之后,再看一下該字符串,還是完整的。
>>> lang[2:9]
'udy pyt'
通過lang[2:9]
要得到部分(不是一個(gè))字符,從返回的結(jié)果中可以看出,我們得到的是序號(hào)分別對(duì)應(yīng)著2,3,4,5,6,7,8
(跟上面的表格對(duì)應(yīng)一下)字符(包括那個(gè)空格)。也就是,這種獲得部分字符的方法中,能夠得到開始需要的以及最后一個(gè)序號(hào)之前的所對(duì)應(yīng)的字符。有點(diǎn)拗口,自己對(duì)照上面的表格數(shù)一數(shù)就知道了。簡(jiǎn)單說就是包括開頭,不包括結(jié)尾。
上述,不管是得到一個(gè)還是多個(gè),通過索引得到字符的過程,稱之為切片。
切片是一個(gè)很有意思的東西??梢浴扒小背霾簧倩幽??
>>> lang
'study python'
>>> b = lang[1:] #得到從1號(hào)到最末尾的字符,這時(shí)最后那個(gè)需要不用寫
>>> b
'tudy python'
>>> c = lang[:] #得到所有字符
>>> c
'study python'
>>> d = lang[:10] #得到從第一個(gè)到10號(hào)之前的字符
>>> d
'study pyth'
在獲取切片的時(shí)候,如果分號(hào)的前面或者后面的序號(hào)不寫,就表示是到最末(后面的不寫)或第一個(gè)(前面的不寫)
lang[:10]
的效果和lang[0:10]
是一樣的。
>>> e = lang[0:10]
>>> e
'study pyth'
那么,lang[1:]
和lang[1:11]
效果一樣嗎?請(qǐng)思考后作答。
>>> lang[1:11]
'tudy pytho'
>>> lang[1:]
'tudy python'
果然不一樣,你思考對(duì)了嗎?原因就是前述所說的,如果分號(hào)后面有數(shù)字,所得到的切片,不包含該數(shù)字所對(duì)應(yīng)的序號(hào)(前包括,后不包括)。那么,是不是可以這樣呢?lang[1:12]
,不包括12號(hào)(事實(shí)沒有12號(hào)),是不是可以得到1到11號(hào)對(duì)應(yīng)的字符呢?
>>> lang[1:12]
'tudy python'
>>> lang[1:13]
'tudy python'
果然是。并且不僅僅后面寫12,寫13,也能得到同樣的結(jié)果。但是,我這個(gè)特別要提醒,這種獲得切片的做法在編程實(shí)踐中是不提倡的。特別是如果后面要用到循環(huán)的時(shí)候,這樣做或許在什么時(shí)候遇到麻煩。
如果在切片的時(shí)候,冒號(hào)左右都不寫數(shù)字,就是前面所操作的c = lang[:]
,其結(jié)果是變量c的值與原字符串一樣,也就是“復(fù)制”了一份。注意,這里的“復(fù)制”我打上了引號(hào),意思是如同復(fù)制,是不是真的復(fù)制呢?可以用下面的方式檢驗(yàn)一下
>>> id(c)
3071934536L
>>> id(lang)
3071934536L
id()
的作用就是查看該對(duì)象在內(nèi)存地址(就是在內(nèi)存中的位置編號(hào))。從上面可以看出,兩個(gè)的內(nèi)存地址一樣,說明c和lang兩個(gè)變量指向的是同一個(gè)對(duì)象。用c=lang[:]
的方式,并沒有生成一個(gè)新的字符串,而是將變量c這個(gè)標(biāo)簽也貼在了原來那個(gè)字符串上了。
>>> lang = "study python"
>>> c = lang
如果這樣操作,變量c和lang是不是指向同一個(gè)對(duì)象呢?或者兩者所指向的對(duì)象內(nèi)存地址如何呢?看官可以自行查看。
字符串是一種序列,所有序列都有如下基本操作:
通過下面的例子,將這幾個(gè)基本操作在字符串上的使用演示一下:
>>> str1 + str2
'abcdabcde'
>>> str1 + "-->" + str2
'abcd-->abcde'
這其實(shí)就是拼接,不過在這里,看官應(yīng)該有一個(gè)更大的觀念,我們現(xiàn)在只是學(xué)了字符串這一種序列,后面還會(huì)遇到列表、元組兩種序列,都能夠如此實(shí)現(xiàn)拼接。
>>> "a" in str1
True
>>> "de" in str1
False
>>> "de" in str2
True
in
用來判斷某個(gè)字符串是不是在另外一個(gè)字符串內(nèi),或者說判斷某個(gè)字符串內(nèi)是否包含某個(gè)字符串,如果包含,就返回True
,否則返回False
。
>>> max(str1)
'd'
>>> max(str2)
'e'
>>> min(str1)
'a'
一個(gè)字符串中,每個(gè)字符在計(jì)算機(jī)內(nèi)都是有編碼的,也就是對(duì)應(yīng)著一個(gè)數(shù)字,min()
和max()
就是根據(jù)這個(gè)數(shù)字里獲得最小值和最大值,然后對(duì)應(yīng)出相應(yīng)的字符。關(guān)于這種編號(hào)是多少,看官可以google有關(guān)字符編碼,或者ASCII編碼什么的,很容易查到。
>>> cmp(str1, str2)
-1
將兩個(gè)字符串進(jìn)行比較,也是首先將字符串中的符號(hào)轉(zhuǎn)化為對(duì)一個(gè)的數(shù)字,然后比較。如果返回的數(shù)值小于零,說明第一個(gè)小于第二個(gè),等于0,則兩個(gè)相等,大于0,第一個(gè)大于第二個(gè)。為了能夠明白其所以然,進(jìn)入下面的分析。
>>> ord('a')
97
>>> ord('b')
98
>>> ord(' ')
32
ord()
是一個(gè)內(nèi)建函數(shù),能夠返回某個(gè)字符(注意,是一個(gè)字符,不是多個(gè)字符組成的串)所對(duì)一個(gè)的ASCII值(是十進(jìn)制的),字符a在ASCII中的值是97,空格在ASCII中也有值,是32。順便說明,反過來,根據(jù)整數(shù)值得到相應(yīng)字符,可以使用chr()
:
>>> chr(97)
'a'
>>> chr(98)
'b'
于是,就得到如下比較結(jié)果了:
>>> cmp("a","b") #a-->97, b-->98, 97小于98,所以a小于b
-1
>>> cmp("abc","aaa")
1
>>> cmp("a","a")
0
看看下面的比較,是怎么進(jìn)行的呢?
>>> cmp("ad","c")
-1
在字符串的比較中,是兩個(gè)字符串的第一個(gè)字符先比較,如果相等,就比較下一個(gè),如果不相等,就返回結(jié)果。直到最后,如果還相等,就返回0。位數(shù)不夠時(shí),按照沒有處理(注意,沒有不是0,0在ASCII中對(duì)應(yīng)的是NUL),位數(shù)多的那個(gè)天然大了。ad中的a先和后面的c進(jìn)行比較,顯然a小于c,于是就返回結(jié)果-1。如果進(jìn)行下面的比較,是最容易讓人迷茫的??垂倌懿荒芨鶕?jù)剛才闡述的比較遠(yuǎn)離理解呢?
>>> cmp("123","23")
-1
>>> cmp(123,23) #也可以比較整數(shù),這時(shí)候就是整數(shù)的直接比較了。
1
字符串中的“乘法”,這個(gè)乘法,就是重復(fù)那個(gè)字符串的含義。在某些時(shí)候很好用的。比如我要打印一個(gè)華麗的分割線:
>>> str1*3
'abcdabcdabcd'
>>> print "-"*20 #不用輸入很多個(gè)`-`
--------------------
要知道一個(gè)字符串有多少個(gè)字符,一種方法是從頭開始,盯著屏幕數(shù)一數(shù)。哦,這不是計(jì)算機(jī)在干活,是鍵客在干活。
鍵客,不是劍客。劍客是以劍為武器的俠客;而鍵客是以鍵盤為武器的俠客。當(dāng)然,還有賤客,那是賤人的最高境界,賤到大俠的程度,比如岳不群之流。
鍵客這樣來數(shù)字符串長(zhǎng)度:
>>> a="hello"
>>> len(a)
5
使用的是一個(gè)函數(shù)len(object)。得到的結(jié)果就是該字符串長(zhǎng)度。
>>> m = len(a) #把結(jié)果返回后賦值給一個(gè)變量
>>> m
5
>>> type(m) #這個(gè)返回值(變量)是一個(gè)整數(shù)型
<type 'int'>
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: