學習目標:
- 學習如何創建字符串
- 使用len、min和max函數獲取一個字符串的長度、串中的最大和最小的字符
- 使用下標運算符([])訪問字符串中的元素
- 使用截取運算符str[ start:end]從較長的字符串中得到一個子串
- 使用+運算符連接兩個字符串,通過*運算符復制一個字符串
- 使用in和not in運算符判斷一個字符串是否包含在另一個字符串內
- 使用比較運算符(==、! =、<、<=、>、>=)對字符串進行比較
- 使用for循環迭代字符串中的字符
- 使用方法isalnum、isalpha、isdigit、isidentifier、islower、isupper 和isspace來測試字符串
- 使用方法endswith、startswith、find、rfind 和count搜索子串
- 使用方法capitalize、lower、upper、title、swapcase和replace 轉換字符串
- 使用方法lstrip、rstrip 和strip從一個字符串的左側或右側刪除空格
- 使用方法center、ljust、rjust 和format格式化字符串
- 在應用程序( CheckPalindrome、Hex ToDecimalConversion)的開發過程中應用字符串
- 為運算符定義特殊的方法
- 設計Rational類表示有理數
一、引言
????????關鍵點:本章將重點放在類的設計上,它使用Python中的str類為例并探索Python中特殊方法的作用。
????????前一篇介紹了關于類和對象的一些重要概念。我們已經學習了如何定義一個類,以及如何創建和使用對象。str 類不僅在表示字符串方面很有用,而且它也是一個很好的類設計的例子。本文我們將更深人地討論str類。在Python語言中特殊方法起著非常重要的作用。這里也會介紹一些特殊方法和運算符重載,以及使用特殊方法設計類。
二、str 類
關鍵點:一個str對象是不可變的;這也就是說,一旦創建了這個字符串,那么它的內容是不可變的。
2.1、創建字符串
你可以使用構造函數構建字符串,如下所示:
s1 = str() # Create an empty string object
s2 = str("Welcome") # Create a string object for We lcome
Python提供了一個簡單語法,它通過使用字符串值創建一一個字符串。例如:
s1 = " "# Same as s1= str()
s2 = "Welcome" # Same as s2 = str("Welcome")
????????一個字符串對象是不可變的: 一旦創建一個字符串對象出來,那么它的內容就不會再改變。為了優化性能,Python 使用一個對象來表示具有相同內容的字符串。如圖所示,s1和s2都指向同一個字符串對象,它們都有著相同的id數。
????????這個動作對Python庫中的所有不可變對象都是真的。例如: int 是一種不可變類。兩個具有相同值的int對象實際上是共享了相同的對象,如圖所示:
2.2、處理字符串的函數
????????Python的一些內置函數可以和字符串一起使用。你可以使用len函數來返回一個字符串中的字符個數,而max和min函數返回字符串中的最大和最小字符。下面是一些例子:
>>> S = "We1come"
>>> len(s)
7
>>> max(s)
'o'
>>> min(s)
'W'
>>>
????????因為字符串s有7個字符,len(s)返回7 。注意:小寫字母的ASCII碼值要高于小寫字母的ASCII碼值,所以,max(s) 返回o ,而min(s)返回W 。
2.3、下標運算符 [ ]
一個字符串是一個字符序列。可以使用下面的語法通過下標運算符訪問字符串中的一個字符:
s[index]
下標是基于0的;也就是說,它們的范圍從0到len(s)-1,如圖所示。
2.4、截取運算符 [start : end]
????????截取運算符通過使用語法s[start:end]返回字符串其中的一段。這一段就是從下標start到下標end-1的一個子串。例如:
>>> s = "Welcome"
>>> s[1 : 4]
elc
s[1:4]返回從下標1到下標3的子串。
????????起始下標或結束下標都可以被忽略。在這種情況下,默認的起始下標是0,而結束下標是最后一個下標。例如:
>>> S = "Welcome"
>>>s[ :6]
'Welcom'
>>> s[4: ]
'ome'
>>>s[1:-1]
elcom
>>>
????????在第2行中,s[ :6] 和s[0:6]是一樣的,都返回的是從下標0到下標5的子串。在第4行中,s[4: ]和s[4:7]是一樣的,都返回的是從下標4到下標6的子串。你也可以在截取字符串的過程中使用負下標。例如,在第6行中,s[1:-1] 和s[1:-1+len(s)]是一樣的。
????????注意:如果截取操作s[i:j] 中的下標(i或j)是負數,那么就用len(s)+index來替換下標。如果j>len(s),那么j就會被設置成len(s)。如果i>=j,那么截取的子串就會成為空串。
2.5、連接運算符+和復制運算符*
????????你可以使用連接運算符+組合或連接兩個字符串。你也可以使用復制運算符*來連接相同的字符串多次。下面是一 些例子:
>>> s1 = "Welcome"
>>> s2 = "Python"
>>> s3 = s1 + "to" + s2
>>> s3
'Welcome to Python'
>>> s4 = 3 * s1
>>> s4
'WelcomeWelcomeWelcome'
>>> s5 = s1 * 3
>>>s5
'WelcomeWelcomeWelcome'
>>>
注意: 3*s1和s1*3具有相同的效果。
2.6、in和notin運算符
你可以使用in和not in操作來測試一個字符串 是否在另一個字符串中。下面是一些例子:
>>> s1 = "Welcome"?
>>> "come" in s1
True
>>> "come" not in s1
False
>>>
下面是另一個例子:
s = input("Enter a string: ")
if "Python" in s:print("Python","is in", s)
else:print("Python","is not in", s)
????????如果你在運行這個程序的時候將字符串“WelcometoPython”作為輸入,這個程序就應該顯示:
????????python is in Welcome to Python.
2.7、比較字符串
????????你可以使用比較運算符來對字符串進行比較(已經介紹過==、!=、 >、<. >=和<=)。Python是通過比較字符串中對應的字符進行比較的,比較是通過計算字符的數值代碼實現的。例如,a比A大,因為a的數值代碼比A的數值代碼大。
????????假設你需要比較字符串s1("Jane")和s2("Jake")。首先,比較s1和s2中的首字符(J和J)。因為它們是一樣的,所以比較它們的第二個字符(a和a)。因為它們也是一樣的,所以比較它們的第三個字符(n 和k)。因為n的ASCII碼值要大于k的,所以s1是大于s2的。
????????下面是一些例子:
>>>'green' == 'glow'
False
>>> "green" != "g1ow"
True
>>> "green" > "glow"
True
>>> "green" >= "glow"
True
>>> "green" < "g1ow"
False
>>> "green" <= "g1ow"
False
>>> "ab" <= "abc"
True
>>>
2.8、迭代字符串
????????一個字符串是可迭代的。這意味著你可以使用一個for循環來順序遍歷字符串中的所有字符。例如,下面的代碼顯示了字符串s中的所有字符:
for ch in s:print(ch)
你可以將這段代碼讀作“對于s中的每個字符ch,都打印ch”。
????????這個for循環沒有使用下標來訪問字符。但是,如果你想以不同順序遍歷字符,那么你仍然必須使用下標。例如,下面的代碼顯示了字符串奇數位置的字符:
for i in range(0, len(s), 2):print(s[i])
????????這段代碼使用變量i作為字符串s的下標。i的初始值是0,然后,在它達到或超過len(s)之前每次增加2。對于每個i值,都打印s[i]。
2.9、測試字符串
2.10、搜索字串
2.11、轉換字符串
?注意:如同之前所述,字符串是不可變的。str 類中沒有方法能改變字符串的內容,這些方法都是創建了新的字符串。
2.12、刪除字符串中的空格
????????你可以使用下圖中的方法從字符串的前端、末端或者兩端來刪除字符串中的空格。回
顧一下,字符' '、\t、\f、\r和\n都被稱作空白字符。
????????注意:刪除空白字符的方法只能去掉字符串前后兩端的空白字符,并不能刪除被非空白字符包圍的空白字符。
????????提示:在輸入字符串上應用strip()方法來確保刪除輸入的末尾任何不需要的字符,這是很好的經驗。
2.13、格式化字符串
?下面是使用center、ljust和rjust方法的一些例子:
>>> s = "Welcome"
>>> s1 = s.center(11)
>>>s1
' Welcome '
>>> s2 = s.ljust(11)
>>>>s2
'Welcome '
>>> s3 = s.rjust(11)
>>;>>s3
' Welcome '
>>>
????????在第2行,s.center(11)將字符串s放在占位11個字符的字符串中央。在第5行,s.ljust(11)將字符串s放在占位11個字符的字符串左端。在第8行,s.rjust(11) 將字符串s放在占位11個字符的字符串右端。
三、運算符重載和特殊方法
關鍵點: Python允許為運算符和函數定義特殊的方法來實現常用的操作。Python使用一種獨特方式來命名這些方法以辨別它們的關聯性。
????????在之前,我們已經學會了如何使用完成字符串操作的運算符。可以使用運算符+來結合兩個字符串,而運算符*可以結合同一字符串多次,關系運算符(==、!=.<.<=、>、>=)用來比較兩個字符串,而下標運算符[]用來訪問一個字符。例如:
s1 ="Washi ngton"
s2 = "Cali fornia"
print("The first character in s1 is",s1[0] )
print("s1+s2is",s1+s2)
print("s1 < s2?",s1 < s2 )
????????這些運算符實際。上都是在str類中定義的方法。為運算符定義方法被稱作運算符重載。運算符重載允許程序員使用內嵌的運算符為用戶定義方法。下表羅列出運算符和方法之間的映射關系。當你命名這些方法時,名字前后要加兩個下劃線以便于Python辨識它們的關聯性。例如:為了將運算符+作為方法來使用,你應當定義一個名為__ add__ 的方法。 注意:這些方法并不是私有的,因為它們除了兩個起始下劃線還有兩個結尾下劃線。回顧一下,類中的初始化程序被命名為__ init__ ,這是一個初始化對象的特殊方法。
例如,你可以使用如下方法改寫之前的代碼:
s1 = "Washington"
s2 = "California"
print("The first character in sl is", s1.__ getitem__(0) )
print("s1 + s2 is", s1.__add__ (s2))
print("s1 < s2?", s1.__lt_ __ (s2))
????????s1.__ getitem__ (0) 與s1[0]相同,sl.__ add__ (s2) 與s1+s2相同,而s1.__ lt__ (s2) 與s1<s2相同。現在,你可以看出重載運算符的優勢。重載運算符可以極大地簡化程序,讓程序更易讀、易維護。
????????Python支持in運算符,它可以用來判斷一個字符是否在另一個字符串中或者一個元素是否是一個容器中的成員。對應的方法被命名為__ contains__(self,e)。 你可以使用方法__contain__或使用 in運算符來判斷一個字符是否在一個字符串內,代碼如下所示。
1 s1 = "Washi ngton"
2 print("Is W in s1?", 'W' in s1 )
3 print("Is W in s1?", s1.__contains__('W') )
W in s1和s1.__ contains__('w')一樣。
如果一個類定義了__ len__ (self) 方法,那么Python允許你使用方便的語法將調用方法作為函數調用。例如:__ len__ 方法被定義在 str類中,該方法返回字符串的字符個數。你既可以使用__ len__ 方 法也可以使用len函數來獲取字符串中的字符個數,代碼如下所述:
1 s1 = "Washington"
2 print("The 1ength of s1 is", 1en(s1))
3 print("The 1ength of s1 is", s1.__1en__())
len(s1)和s1.__ len__ () 是相同的。
????????許多特殊的運算符都被定義為Python的內置類型,例如: int 和float。假設i是3而j是4。i.__add__ (j) 和i+j是相同的,而i.__sub__(j) 和i-j是相同的。
注意:你可以傳遞一個對象 去調用print(x)。 這等價于調用print(x.__ str__()) 或 print(str(x))。
????????注意:比較運算符(==、!=、<、<=、>和>=)也可以通過使用方法__ cmp__ (self,other)來實現。如果self<other,那么該方法返回負整數。如果self==other,那么該方法返回0。如果self>other, 那么該方法返回正整數。對于兩個對象a和b,如果__ It___ 可用的話,那么a<b就調用a.__ It__(b)。 如果不行的話就調用__cmp__ 方法 來決定順序。
四、總結
- 字符串對象是不可變的,不可以改變它的內容。
- 可以使用Python函數len、min和max來返回字符串的長度、最大元素和最小元素。
- 可以使用下標運算符[]來指向字符串中的一個單獨的字符。
- 可以使用連接運算符+來連接兩個字符串,使用復制運算符*來復制一個字符串多次,使用截取運算符[: ]來獲取子串,而使用運算符in和not in來判斷-一個字符是否在一個字符串中。
- 使用比較運算符(==、!=、 <、<=、>和>=)比較兩個字符串。
- 使用for循環迭代字符串中的所有字符。
- 可以在字符串對象上使用像endswith、startswitch、 isalpha、 islower、 isupper、lower、 upper、 find 、count、replace和strip這樣的函數。
- 可以為重載操作定義特殊方法。