標註紅色的文字就是最重要的內容python
Python不支持單字符類型,單字符在Python中也是做爲一個字符串來使用;git
字符串切片截取;shell
空值是Python裏一個特殊的值,用None
表示。None
不能理解爲0
,由於0
是有意義的,而None
是一個特殊的空值。api
最後,理解變量在計算機內存中的表示也很是重要。當咱們寫:app
a = 'ABC'
時,Python解釋器幹了兩件事情:ide
在內存中建立了一個'ABC'
的字符串;函數
在內存中建立了一個名爲a
的變量,並把它指向'ABC'
。ui
也能夠把一個變量a
賦值給另外一個變量b
,這個操做其實是把變量b
指向變量a
所指向的數據,例以下面的代碼:this
a = 'ABC' b = a a = 'XYZ' print(b)
最後一行打印出變量b
的內容究竟是'ABC'
呢仍是'XYZ'
?若是從數學意義上理解,就會錯誤地得出b
和a
相同,也應該是'XYZ'
,但實際上b
的值是'ABC'
,讓咱們一行一行地執行代碼,就能夠看到到底發生了什麼事:編碼
執行a = 'ABC'
,解釋器建立了字符串'ABC'
和變量a
,並把a
指向'ABC'
:
執行b = a
,解釋器建立了變量b
,並把b
指向a
指向的字符串'ABC'
:
執行a = 'XYZ'
,解釋器建立了字符串'XYZ',並把a
的指向改成'XYZ'
,但b
並無更改:
因此,最後打印變量b
的結果天然是'ABC'
了。
咱們已經講過了,字符串也是一種數據類型,可是,字符串比較特殊的是還有一個編碼問題。
由於計算機只能處理數字,若是要處理文本,就必須先把文本轉換爲數字才能處理。最先的計算機在設計時採用8個比特(bit)做爲一個字節(byte),因此,一個字節能表示的最大的整數就是255(二進制11111111=十進制255),若是要表示更大的整數,就必須用更多的字節。好比兩個字節能夠表示的最大整數是65535,4個字節能夠表示的最大整數是4294967295。
因爲計算機是美國人發明的,所以,最先只有127個字母被編碼到計算機裏,也就是大小寫英文字母、數字和一些符號,這個編碼表被稱爲ASCII編碼,好比大寫字母A的編碼是65,小寫字母z的編碼是122。
可是要處理中文顯然一個字節是不夠的,至少須要兩個字節,並且還不能和ASCII編碼衝突,因此,中國製定了GB2312編碼,用來把中文編進去。
你能夠想獲得的是,全世界有上百種語言,日本把日文編到Shift_JIS裏,韓國把韓文編到Euc-kr裏,各國有各國的標準,就會不可避免地出現衝突,結果就是,在多語言混合的文本中,顯示出來會有亂碼。
>>> fruit='banana' >>> letter=fruit[1] #從fruit中選擇索引爲1的字符並將他賦給 letter >>> letter'a' >>>
除了數字,Python還能夠操縱字符串,能夠一幾種不一樣的方式表達。他們能夠包含在單引號(‘...’)或者("...")雙引號中,其結果相同
>>> 'apple''apple' >>> 'doesn\'t' #能夠用\’轉義字符 "doesn't" >>> "doesn't" #或者用兩個不同的引號 "doesn't" >>> '"Yes,"he said' '"Yes,"he said' >>> "\"Yes,\"he said" '"Yes,"he said' >>> '"Isn\'t," seh said.' '"Isn\'t," seh said.'
在交互式解釋器,輸出字符串包含在引號和特殊字與反斜槓轉義。雖然這時有所不一樣,從輸入(包含引號能夠改變),這兩個字符串是同樣的。若是字符串包含雙引號和單引號,該字符串給括在雙引號中,不然被括在單引號中。print() 函數生成一個更可讀的輸出。\可用於轉義引號。
>>> '"Isn\'t"she said.''"Isn\'t"she said.' >>> print('"Isn\'t"she said.') "Isn't"she said. >>> >>> s='First line.\nSecond line.' #\n表示換行= >>> s'First line.\nSecond line.' >>> print(s) First line. Second line. >>>
若是你不想被\前綴解釋爲特殊字符,你可使用原始字符串以前的字符串前加一個 r ;
>>> print('C:\some\name') C:\some ame >>> print(r'C:\some\name') C:\some\name >>>
1:字符串能夠經過+或者*操做符鏈接;
>>> #重複3次‘un’以後,後面加上‘ium’ >>> 3*'um'+'ium' 'umumumium'
2:兩個或多個字符串(封閉的引號隔開)相鄰之間自動鏈接;
>>> 'py''thon' #中間留不留空格效果同樣 'python'
注:這隻適用於兩個字符串,而不是用於變量或者表達式;
>>> prefix='py' >>> preix 'thon' SyntaxError: invalid syntax >>> ('un'*3)'ium' SyntaxError: invalid syntax
3:若是你想鏈接兩個變量,使用+操做符能夠實現
>>> prefix='py' >>> prefix+'thon' 'python'
4:一下字符串有其有用,當你想要打破輸入一個長字符串;
>>> text=('My name is Anne,This is My page,' 'Welcome to my house!') >>> text'My name is Anne,This is My page,Welcome to my house!'
1:字符串能夠被索引(下標)訪問;沒有單獨的字符類型,一個字符就是一個字符串的大小;
>>> word='python' >>> word[0] #在位置0,word的第一個字符 'p' >>> word[5]'n'
2:索引也有多是負數,從右邊開始計數;
>>> word[-1]'n' >>> word[-6]'p'
注意:-0和0是同樣的,負數索引從零開始;
>>> word[0:2] #從零位置到2的字符 'py' >>> word[2:5]'tho'
注意:一開始老是被包括,最後老是被排除在外,這確保s[:i]+s[i:]老是等價於s
>>> word='python' >>> word[:2]+word[2:]'python' >>> word[:4]+word[4:]'python' >>> word[:8]+word[:8]'pythonpython' >>> word[:1]+word[1:]'python'
切片索引可使用默認值,s[:i]省略第一個索引默認爲零;s[i:]省略第二個索引默認被切片的字符串的大小。
試圖使用太大的索引將致使一個錯誤。
>>> word[89] #word只有6個字母 Traceback (most recent call last): File "<pyshell#5>", line 1, in <module> word[89]IndexError: string index out of range
可是,此種狀況下是可使用切片的:
>>> word[2:89]'thon'
上次已經說過Python字符串不能改變——他們是不可變的。所以,指定字符串中的索引位置致使一個錯誤。
>>> word[0]='J' Traceback (most recent call last): File "<pyshell#7>", line 1, in <module> word[0]='J'TypeError: 'str' object does not support item assignment >>> word[2:]='py' Traceback (most recent call last): File "<pyshell#8>", line 1, in <module> word[2:]='py'TypeError: 'str' object does not support item assignment >>> 'j'+word[1:]'jython'
字符串大小寫轉換
返回的字符串的首字母大寫,其他小寫。 把字符串改成小寫的形式 將字符串轉換成小寫,Unicode編碼中凡有對應的小寫形式的,都會轉換; 對字符串字母的大小寫進行反轉。 將字符串中每一個「單詞」首字母。其判斷「單詞」的依據則是基於空格和標點。 把字符串改成大寫的形式str.capitalize() #str.lower() #str.casefold() #str.swapcase() #str.title() #str.upper() #
字符串格式輸出
將字符串按照給定的寬度居中顯示返回指定長度的字符串,超長可(默認空格)指定填充用 '0' 填充字符串,並返回指定寬度的字符串。用指定的空格替代橫向製表符相似 str.format(*args, **kwargs) ,不一樣的是 mapping 是一個字典對象。str.center(width[, fillchar]) # str.ljust(width[, fillchar]); str.rjust(width[, fillchar]) #str.zfill(width) #str.expandtabs(tabsize=8) #str.format(^args, ^^kwargs) # 格式化 {0} {word} 數字引導格式化,名字引導格式化 str.format_map(mapping) #
字符串搜索定位與替換
返回指定字符在[指定位置的]str出現的次數 返回指定字符在[指定位置的]str出現的索引 與 find() rfind() 相似,不一樣的是若是找不到,就會引起 ValueError。 把字符串中的舊字符替換成新字符。若是指定第三個參數max,替換不超過max。 截掉字符串左邊的空格或指定字符。返回截掉字符串左邊的空格或指定字符後生成的新字符串。 str.count(sub[, start[, end]]) #str.find(sub[, start[, end]]); str.rfind(sub[, start[, end]]) #str.index(sub[, start[, end]]); str.rindex(sub[, start[, end]]) #str.replace(old, new[, count]) #str.lstrip([chars]); #str.rstrip([chars]); # 刪除字符串末尾的指定字符(默認空格).返回刪除字符串末尾的指定字符後生成的新字符串。 str.strip([chars])# 方法用於移除字符串頭尾指定的字符(默認空格)。返回移除字符串頭尾指定字符生成的新字符串 static str.maketrans(x[, y[, z]]); str.translate(table)
字符串的聯合與分割
用指定的字符串,鏈接元素爲字符串的可迭代對象。partition() 方法用來根據指定的分隔符將字符串進行分割。分隔字符串字符串以行界符爲分隔符拆分爲列表;按照行分隔,返回一個包含各行做爲元素的列表,若是 num 指定則僅切片 num 個行.str.join(iterable) #str.partition(sep); str.rpartition(sep) #str.split(sep=None, maxsplit=-1); #str.rsplit(sep=None, maxsplit=-1) #str.splitlines([keepends]) #
字符串條件判斷
檢查字符串是不是以 obj檢查字符串是不是以 obj 開頭,是則返回 True,不然返回 False。若是beg 和 end 指定值,則在指定範圍內檢查.若是 string 至少有一個字符而且全部字符都是字母則返回 True,不然返回 False若是 string 只包含十進制數字則返回 True 不然返回 False.若是 string 只包含數字則返回 True 不然返回 False.若是 string 中只包含數字字符,則返回 True,不然返回 False若是 string 中包含至少一個區分大小寫的字符,而且全部字符都小寫,則返回 True,不然返回 False 若是 string 中只包含空格,則返回 True,不然返回 False. 若是 string 是標題化的(見 title())則返回 True,不然返回 False以 str 爲分隔符切片 string,若是 num有指定值,則僅分隔 num 個子字符串str.endswith(suffix[, start[, end]]); #結尾 str.startswith(prefix[, start[, end]]) #str.isalnum() # 若是 string 至少有一個字符而且全部字符都是字母或數字則返回 True,不然返回 False str.isalpha() #str.isdecimal(); #str.isdigit(); #str.isnumeric() #str.isidentifier() str.islower() #str.isprintable() str.isspace() #str.istitle() #str.isupper() #
字符串編碼
str.encode(encoding="utf-8", errors="strict")
1)str.capitalize()
——返回的字符串的首字母大寫,其他小寫。
>>> word.capitalize()
'Python'
2)str.lower()
——把字符串改成小寫的形式
>>> name="ANNE" >>> name.lower() 'anne'
3)str.upper()
——把字符串改成大寫的形式
>>> name="anne" >>> name.upper() 'ANNE'
須要注意的是 s.upper().isupper() 不必定爲 True。
4)str.casefold()
——將字符串轉換成小寫,Unicode編碼中凡有對應的小寫形式的,都會轉換;
>>> 'FAFD'.casefold() 'fafd' >>> '徐XU'.casefold() '徐xu'
5)str.swapcase()
——對字符串字母的大小寫進行反轉。
>>> 'dao'.swapcase() 'DAO' >>> 'Daio'.swapcase() 'dAIO'
可是須要注意的是:str.swapcase().swapcase()==str
不必定爲真
6)str.title()
——將字符串中每一個「單詞」首字母。其判斷「單詞」的依據則是基於空格和標點,因此應對英文撇好全部格或一些英文大寫的簡寫時,會出錯。
注意title和capitalize的區別;
>>> 'hello world'.capitalize() 'Hello world' >>> 'hello world'.title() 'Hello World'
1)str.center(width[, fillchar])
——將字符串按照給定的寬度居中顯示,能夠給定特定的字符填充多餘的長度,若是指定的長度小於字符串長度,則返回原字符串。
>>> 'Anne'.center(10) ' Anne ' >>> 'Anne'.center(10,'*') '***Anne***' >>> 'Anne'.center(5) ' Anne'
2)str.ljust(width[, fillchar]);
str.rjust(width[, fillchar])
——返回指定長度的字符串,字符串內容居左(右)若是長度小於字符串長度,則返回原始字符串,默認填充爲 ASCII 空格,可指定填充的字符串。
>>> 'Anne'.ljust(3) 'Anne' >>> 'Anne'.ljust(5) 'Anne ' >>> 'Anne'.ljust(3,'~') 'Anne' >>> 'Anne'.ljust(10,'~') 'Anne~~~~~~'
3)str.zfill(width)
——用 '0' 填充字符串,並返回指定寬度的字符串。
>>> '77'.zfill(5) '00077' >>> '-77'.zfill(5) '-0077' >>> 'qi'.zfill(5) '000qi' >>> '--'.zfill(5) '-000-' >>> ' '.zfill(5) '0000 ' >>> ' '.zfill(5) '000 ' >>> ''.zfill() # 括號裏面必定要添加數字 Traceback (most recent call last): File "<pyshell#8>", line 1, in <module> ''.zfill() TypeError: zfill() takes exactly 1 argument (0 given) >>> ''.zfill(5) '00000' >>> 'qiqiq'.zfill(5) 'qiqiq'
4)str.expandtabs(tabsize=8)
——用指定的空格替代橫向製表符,使得相鄰字符串之間的間距保持在指定的空格數之內。tab 符號默認的空格數是 8。
>>> tab = '1\t23\t456\t7890\t1112131415\t161718192021'
>>> tab.expandtabs()
'1 23 456 7890 1112131415 161718192021'
>>> tab.expandtabs(4)
'1 23 456 7890 1112131415 161718192021'
>>>
5)str.format(^args, ^^kwargs)
——格式化字符串的語法比較繁多,官方文檔已經有比較詳細的 examples,我上一節也已經介紹了,這裏就不冗餘解釋了;
6)str.format_map(mapping)
——相似 str.format(*args, **kwargs) ,不一樣的是 mapping 是一個字典對象。
>>> People = {'name':'john', 'age':56} >>> 'My name is {name},i am {age} old'.format_map(People) 'My name is john,i am 56 old'
1)str.count(sub[, start[, end]])
——返回指定字符在[指定位置的]str出現的次數
>>> text = 'outer protective covering' >>> text.count('e') 4 >>> text.count('e', 5, 11) 1 >>> text.count('e', 5, 10) 0
2)str.find(sub[, start[, end]]); str.rfind(sub[, start[, end]])
——返回指定字符在[指定位置的]str出現的索引
>>> text = 'outer protective covering' >>> text.find('er') 3 >>> text.find('er', 3) 3 >>> text.find('er', 4) 20 >>> text.find('er', 4, 21) #找不到就會返回-1; -1 >>> text.rfind('er') 20 >>> text.lfind('er') #沒有這個方法 Traceback (most recent call last): File "<pyshell#16>", line 1, in <module> text.lfind('er') AttributeError: 'str' object has no attribute 'lfind' >>> text.rfind('er', 20) 20 >>> text.rfind('er', 20, 21) #找不到返回-1 -1
3)str.index(sub[, start[, end]]);
str.rindex(sub[, start[, end]])
——與 find() rfind() 相似,不一樣的是若是找不到,就會引起 ValueError。
>>> text 'outer protective covering' >>> text.index('e') 3 >>> text.index('e',4) 10 >>> text.index('e',4,9) #找不到就會引起ValueError錯誤 Traceback (most recent call last): File "<pyshell#22>", line 1, in <module> text.index('e',4,9) ValueError: substring not found
4)str.replace(old, new[, count])
——1)Python replace()方法把字符串中的old(舊字符替)換成new(新字符)。若是指定第三個參數max,則替換不超過max。
2)用法:str.replace(old,new[,max])
3)參數解釋
●old---將被替換的子字符串
●new---新字符串,用於替換old子字符串
●max---可選字符串,替換不超過max次
此方法已經在字符串解說(上)中介紹過了。只給出以下實例,不作過多冗餘; >>> 'Anne is very very good guy'.replace('very','so') 'Anne is so so good guy' >>> 'Anne is very very good guy'.replace('very','so',0) 'Anne is very very good guy' >>> 'Anne is very very good guy'.replace('very','so',1) 'Anne is so very good guy' >>> 'Anne is very very good guy'.replace('very','so',2) 'Anne is so so good guy' >>> 'Anne is very very good guy'.replace('very','so',3) 'Anne is so so good guy'
5)str.lstrip([chars]); #chars --指定截取的字符。
str.rstrip([chars]);
str.strip([chars]);
——Python lstrip() 方法用於截掉字符串左邊的空格或指定字符。返回截掉字符串左邊的空格或指定字符後生成的新字符串。
>>> ' Hello World '.lstrip() 'Hello World ' >>> '777Hello World77'.lstrip('7') 'Hello World77' >>> ——Python rstrip() 刪除 string 字符串末尾的指定字符(默認爲空格).返回刪除 string 字符串末尾的指定字符後生成的新字符串。 >>> ' Hello World '.rstrip() ' Hello World' >>> '777Hello World77'.rstrip('7') '777Hell ——Python strip() 方法用於移除字符串頭尾指定的字符(默認爲空格)。返回移除字符串頭尾指定的字符生成的新字符串 >>> ' Hello World '.strip() 'Hello World' >>> '77Hello World77'.strip('77') 'Hello World'
6)static str.maketrans(x[, y[, z]]);
str.translate(table)
——maketrans 是一個靜態方法,用於生成一個對照表,以供 translate 使用。
若是 maketrans 僅一個參數,則該參數必須是一個字典,字典的 key 要麼是一個 Unicode 編碼(一個整數),要麼是一個長度爲 1 的字符串,字典的 value 則能夠是任意字符串、None或者 Unicode 編碼。
>>> a = 'dobi' >>> ord('o') 111 >>> ord('a') 97 >>> hex(ord('狗')) '0x72d7' >>> b = {'d':'dobi', 111:' is ', 'b':97, 'i':'\u72d7\u72d7'} >>> table = str.maketrans(b) >>> a.translate(table) 'dobi is a狗狗'
也能夠簡單一點生成對照表:
>>> a='dobi' >>> b = {'d':'dobi', 'o':' is ', 'b':'a', 'i':'dog'}
>>> table=str.maketrans(b)
>>> a.translate(table)
'dobi is adog
——若是 maketrans 有兩個參數,則兩個參數造成映射,且兩個字符串必須是長度相等;若是有第三個參數,則第三個參數也必須是字符串,該字符串將自動映射到 None:
1)str.join(iterable)
——用指定的字符串,鏈接元素爲字符串的可迭代對象。
str.join(seq)——以 str 做爲分隔符,將 seq 中全部的元素(的字符串表示)合併爲一個新的字符串
>>> '-'.join(['2016','06','23']) '2016-06-23' >>> '-'.join([]) '' >>> '-'.join([None]) Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> '-'.join([None])TypeError: sequence item 0: expected str instance, NoneType found >>> '-'.join(['']) '' >>> '-'.join(['2016','06',b'23']) #byte爲非字符串 Traceback (most recent call last): File "<pyshell#4>", line 1, in <module> '-'.join(['2016','06',b'23'])TypeError: sequence item 2: expected str instance, bytes found >>> ','.join({'dobi':'dog', 'polly':'bird'}) 'dobi,polly' >>> ','.join({'dobi':'dog', 'polly':'bird'}.values()) 'dog,bird'
2)str.partition(sep);
str.rpartition(sep)
——partition() 方法用來根據指定的分隔符將字符串進行分割。
若是字符串包含指定的分隔符,則返回一個3元的元組,第一個爲分隔符左邊的子串,第二個爲分隔符自己,第三個爲分隔符右邊的子串。
== partition() 方法是在2.5版中新增的==
string.rpartition(str) ——相似於 partition()函數,不過是從右邊開始查找. >>> str='http://blog.csdn.net/anneqiqi/article/details/51725658' >>> str.partition('://') ('http', '://', 'blog.csdn.net/anneqiqi/article/details/51725658') >>> 'Anne,My best love'.partition('love')('Anne,My best ', 'love', '') >>> 'Anne,My best love'.partition('ll')('Anne,My best love', '', '') >>> 'Anne,My best love'.rpartition('love')('Anne,My best ', 'love', '') >>> 'Anne,My best love'.rpartition(',')('Anne', ',', 'My best love')
3)str.split(sep=None, maxsplit=-1);
str.rsplit(sep=None, maxsplit=-1)
——分隔字符串
>>> '1,2,3'.split(',')['1', '2', '3'] >>> '1,2,3'.rsplit(',')['1', '2', '3'] >>> '1,2,3'.split(',', maxsplit=1)['1', '2,3'] >>> '1,2,3'.rsplit(',', maxsplit=1)['1,2', '3'] >>> '1 2 3'.split()['1', '2', '3'] >>> '1 2 3'.rsplit()['1', '2', '3'] >>> '1 2 3'.split(maxsplit=1)['1', '2 3'] >>> '1 2 3'.rsplit(maxsplit=1)['1 2', '3'] >>> ' 1 2 3 '.split()['1', '2', '3'] >>> '1,2,,3,'.split(',')['1', '2', '', '3', ''] >>> '1,2,,3,'.rsplit(',')['1', '2', '', '3', ''] >>> ''.split()[] >>> ''.split('a')[''] >>> 'bcd'.split('a')['bcd'] >>> 'bcd'.split(None)['bcd'] >>>
str.split(str="", num=string.count(str)).
str = "Line1-abcdef \nLine2-abc \nLine4-abcd";
str.split()
['Line1-abcdef', 'Line2-abc', 'Line4-abcd']
str.split(' ',1)
['Line1-abcdef', '\nLine2-abc \nLine4-abcd']
str -- 分隔符,默認爲空格。
num -- 分割次數。
4)str.splitlines([keepends])
——字符串以行界符爲分隔符拆分爲列表;當 keepends 爲True,拆分後保留行界符,能被識別的行界符見官方文檔。
5)string.splitlines(num=string.count('\n'))
——按照行分隔,返回一個包含各行做爲元素的列表,若是 num 指定則僅切片 num 個行.
1)str.endswith(suffix[, start[, end]]);
str.startswith(prefix[, start[, end]])
- suffix -- 該參數能夠是一個字符串或者是一個元素。
- start -- 字符串中的開始位置。
- end -- 字符中結束位置。
>>> str='this is string example ... wow!!!' >>> suffix='wow!!' >>> str.endswith(suffix) False >>> suffix='wow!!!' >>> str.endswith(suffix) True >>> str.endswith(suffix,20) True >>> suffix='is' >>> str.endswith(suffix,2,4) True >>> str.endswith(suffix,2,6) False >>>
2)string.isalnum()
——若是 string 至少有一個字符而且全部字符都是字母或數字則返回 True,不然返回 False
3)string.isalpha()
——若是 string 至少有一個字符而且全部字符都是字母則返回 True,不然返回 False
4)string.isdecimal()
——若是 string 只包含十進制數字則返回 True 不然返回 False.
isdecimal()方法檢查字符串是否只包含十進制字符。這種方法只存在於unicode對象。
5)string.isdigit()
——若是 string 只包含數字則返回 True 不然返回 False.
6)string.islower()
——若是 string 中包含至少一個區分大小寫的字符,而且全部這些(區分大小寫的)字符都是小寫,則返回 True,不然返回 False
7)string.isnumeric()
——若是 string 中只包含數字字符,則返回 True,不然返回 False
8)string.isspace()
——若是 string 中只包含空格,則返回 True,不然返回 False.
9)string.istitle()
——若是 string 是標題化的(見 title())則返回 True,不然返回 False
10)string.isupper()
——以 str 爲分隔符切片 string,若是 num有指定值,則僅分隔 num 個子字符串
11)string.startswith(obj, beg=0,end=len(string))
——檢查字符串是不是以 obj 開頭,是則返回 True,不然返回 False。若是beg 和 end 指定值,則在指定範圍內檢查.
● Python3訪問字符串
Python不支持單字符類型,單字符在Python中也是做爲一個字符串來使用;
字符串切片截取;
空值是Python裏一個特殊的值,用None
表示。None
不能理解爲0
,由於0
是有意義的,而None
是一個特殊的空值。
最後,理解變量在計算機內存中的表示也很是重要。當咱們寫:
a = 'ABC'
時,Python解釋器幹了兩件事情:
在內存中建立了一個'ABC'
的字符串;
在內存中建立了一個名爲a
的變量,並把它指向'ABC'
。
也能夠把一個變量a
賦值給另外一個變量b
,這個操做其實是把變量b
指向變量a
所指向的數據,例以下面的代碼:
a = 'ABC' b = a a = 'XYZ' print(b)
最後一行打印出變量b
的內容究竟是'ABC'
呢仍是'XYZ'
?若是從數學意義上理解,就會錯誤地得出b
和a
相同,也應該是'XYZ'
,但實際上b
的值是'ABC'
,讓咱們一行一行地執行代碼,就能夠看到到底發生了什麼事:
執行a = 'ABC'
,解釋器建立了字符串'ABC'
和變量a
,並把a
指向'ABC'
:
執行b = a
,解釋器建立了變量b
,並把b
指向a
指向的字符串'ABC'
:
執行a = 'XYZ'
,解釋器建立了字符串'XYZ',並把a
的指向改成'XYZ'
,但b
並無更改:
因此,最後打印變量b
的結果天然是'ABC'
了。
字符編碼
咱們已經講過了,字符串也是一種數據類型,可是,字符串比較特殊的是還有一個編碼問題。
由於計算機只能處理數字,若是要處理文本,就必須先把文本轉換爲數字才能處理。最先的計算機在設計時採用8個比特(bit)做爲一個字節(byte),因此,一個字節能表示的最大的整數就是255(二進制11111111=十進制255),若是要表示更大的整數,就必須用更多的字節。好比兩個字節能夠表示的最大整數是65535,4個字節能夠表示的最大整數是4294967295。
因爲計算機是美國人發明的,所以,最先只有127個字母被編碼到計算機裏,也就是大小寫英文字母、數字和一些符號,這個編碼表被稱爲ASCII編碼,好比大寫字母A的編碼是65,小寫字母z的編碼是122。
可是要處理中文顯然一個字節是不夠的,至少須要兩個字節,並且還不能和ASCII編碼衝突,因此,中國製定了GB2312編碼,用來把中文編進去。
你能夠想獲得的是,全世界有上百種語言,日本把日文編到Shift_JIS裏,韓國把韓文編到Euc-kr裏,各國有各國的標準,就會不可避免地出現衝突,結果就是,在多語言混合的文本中,顯示出來會有亂碼。
>>> fruit='banana' >>> letter=fruit[1] #從fruit中選擇索引爲1的字符並將他賦給 letter >>> letter'a'>>>
除了數字,Python還能夠操縱字符串,能夠一幾種不一樣的方式表達。他們能夠包含在單引號(‘...’)或者("...")雙引號中,其結果相同
>>> 'apple''apple' >>> 'doesn\'t' #能夠用\’轉義字符 "doesn't" >>> "doesn't" #或者用兩個不同的引號 "doesn't" >>> '"Yes,"he said' '"Yes,"he said' >>> "\"Yes,\"he said" '"Yes,"he said' >>> '"Isn\'t," seh said.' '"Isn\'t," seh said.'
在交互式解釋器,輸出字符串包含在引號和特殊字與反斜槓轉義。雖然這時有所不一樣,從輸入(包含引號能夠改變),這兩個字符串是同樣的。若是字符串包含雙引號和單引號,該字符串給括在雙引號中,不然被括在單引號中。print() 函數生成一個更可讀的輸出。\可用於轉義引號。
>>> '"Isn\'t"she said.''"Isn\'t"she said.' >>> print('"Isn\'t"she said.') "Isn't"she said. >>> >>> s='First line.\nSecond line.' #\n表示換行= >>> s'First line.\nSecond line.' >>> print(s)First line.Second line. >>>
若是你不想被\前綴解釋爲特殊字符,你可使用原始字符串以前的字符串前加一個 r ;
>>> print('C:\some\name') C:\some ame >>> print(r'C:\some\name') C:\some\name >>>
1:字符串能夠經過+或者*操做符鏈接;
>>> #重複3次‘un’以後,後面加上‘ium’ >>> 3*'um'+'ium' 'umumumium' >>>
2:兩個或多個字符串(封閉的引號隔開)相鄰之間自動鏈接;
>>> 'py''thon' #中間留不留空格效果同樣 'python' >>>
注:這隻適用於兩個字符串,而不是用於變量或者表達式;
>>> prefix='py' >>> preix 'thon' SyntaxError: invalid syntax >>> ('un'*3)'ium' SyntaxError: invalid syntax >>>
3:若是你想鏈接兩個變量,使用+操做符能夠實現
>>> prefix='py' >>> prefix+'thon' 'python' >>>
4:一下字符串有其有用,當你想要打破輸入一個長字符串;
>>> text=('My name is Anne,This is My page,' 'Welcome to my house!') >>> text'My name is Anne,This is My page,Welcome to my house!' >>>
1:字符串能夠被索引(下標)訪問;沒有單獨的字符類型,一個字符就是一個
字符串的大小;
>>> word='python' >>> word[0] #在位置0,word的第一個字符 'p' >>> word[5] 'n' >>>
2:索引也有多是負數,從右邊開始計數;
>>> word[-1] 'n' >>> word[-6] 'p' >>>
注意:-0和0是同樣的,負數索引從零開始;
>>> word[0:2] #從零位置到2的字符 'py' >>> word[2:5] 'tho' >>>
注意:一開始老是被包括,最後老是被排除在外,這確保s[:i]+s[i:]老是等價於s
>>> word='python' >>> word[:2]+word[2:] 'python' >>> word[:4]+word[4:] 'python' >>> word[:8]+word[:8] 'pythonpython' >>> word[:1]+word[1:] 'python'>>>
切片索引可使用默認值,s[:i]省略第一個索引默認爲零;s[i:]省略第二個索引默認被切片的字符串的大小。
試圖使用太大的索引將致使一個錯誤。
>>> word[89] #word只有6個字母Traceback (most recent call last): File "<pyshell#5>", line 1, in <module> word[89]IndexError: string index out of range >>>
可是,此種狀況下是可使用切片的:
>>> word[2:89] 'thon' >>>
上次已經說過Python字符串不能改變——他們是不可變的。所以,指定字符串中的索引位置致使一個錯誤。
>>> word[0]='J'Traceback (most recent call last): File "<pyshell#7>", line 1, in <module> word[0]='J'TypeError: 'str' object does not support item assignment>>> word[2:]='py'Traceback (most recent call last): File "<pyshell#8>", line 1, in <module> word[2:]='py'TypeError: 'str' object does not support item assignment>>> 'j'+word[1:] 'jython' >>>
字符串大小寫轉換
str.capitalize() str.lower() str.casefold() str.swapcase() str.title() str.upper()
字符串格式輸出
str.center(width[, fillchar]) str.ljust(width[, fillchar]); str.rjust(width[, fillchar]) str.zfill(width) str.expandtabs(tabsize=8) str.format(^args, ^^kwargs) str.format_map(mapping)
字符串搜索定位與替換
str.count(sub[, start[, end]]) str.find(sub[, start[, end]]); str.rfind(sub[, start[, end]]) str.index(sub[, start[, end]]); str.rindex(sub[, start[, end]]) str.replace(old, new[, count]) str.lstrip([chars]); str.rstrip([chars]); str.strip([chars]) static str.maketrans(x[, y[, z]]); str.translate(table)
字符串的聯合與分割
str.join(iterable) str.partition(sep); str.rpartition(sep) str.split(sep=None, maxsplit=-1); str.rsplit(sep=None, maxsplit=-1) str.splitlines([keepends])
字符串條件判斷
str.endswith(suffix[, start[, end]]); str.startswith(prefix[, start[, end]]) str.isalnum() str.isalpha() str.isdecimal(); str.isdigit(); str.isnumeric() str.isidentifier() str.islower() str.isprintable() str.isspace() str.istitle() str.isupper()
字符串編碼
str.encode(encoding="utf-8", errors="strict")
1)str.capitalize()
——返回的字符串的首字母大寫,其他小寫。
>>> word.capitalize()'Python'>>>
2)str.lower()
——把字符串改成小寫的形式
>>> name="ANNE" >>> name.lower() 'anne' >>>
3)str.upper()
——把字符串改成大寫的形式
>>> name="anne" >>> name.upper() 'ANNE' >>>
須要注意的是 s.upper().isupper() 不必定爲 True。
4)str.casefold()
——將字符串轉換成小寫,Unicode編碼中凡有對應的小寫形式的,都會轉換;
>>> 'FAFD'.casefold() 'fafd' >>> '徐XU'.casefold() '徐xu' >>>
5)str.swapcase()
——對字符串字母的大小寫進行反轉。
>>> 'dao'.swapcase() 'DAO' >>> 'Daio'.swapcase() 'dAIO' >>>
可是須要注意的是:str.swapcase().swapcase()==str
不必定爲真
6)str.title()
——將字符串中每一個「單詞」首字母。其判斷「單詞」的依據則是基於空格和標點,因此應對英文撇好全部格或一些英文大寫的簡寫時,會出錯。
注意title和capitalize的區別;
>>> 'hello world'.capitalize() 'Hello world' >>> 'hello world'.title() 'Hello World' >>>
1)str.center(width[, fillchar])
——將字符串按照給定的寬度居中顯示,能夠給定特定的字符填充多餘的長度,若是指定的長度小於字符串長度,則返回原字符串。
>>> 'Anne'.center(10) ' Anne ' >>> 'Anne'.center(10,'*') '***Anne***' >>> 'Anne'.center(5) ' Anne'
2)str.ljust(width[, fillchar]);
str.rjust(width[, fillchar])
——返回指定長度的字符串,字符串內容居左(右)若是長度小於字符串長度,則返回原始字符串,默認填充爲 ASCII 空格,可指定填充的字符串。
>>> 'Anne'.ljust(3) 'Anne' >>> 'Anne'.ljust(5) 'Anne ' >>> 'Anne'.ljust(3,'~') 'Anne' >>> 'Anne'.ljust(10,'~') 'Anne~~~~~~' >>>
3)str.zfill(width)
——用 '0' 填充字符串,並返回指定寬度的字符串。
>>> '77'.zfill(5) '00077' >>> '-77'.zfill(5) '-0077' >>> 'qi'.zfill(5) '000qi' >>> '--'.zfill(5) '-000-' >>> ' '.zfill(5) '0000 ' >>> ' '.zfill(5) '000 ' >>> ''.zfill() #括號裏面必定要添加數字 Traceback (most recent call last): File "<pyshell#8>", line 1, in <module> ''.zfill()TypeError: zfill() takes exactly 1 argument (0 given) >>> ''.zfill(5) '00000' >>> 'qiqiq'.zfill(5) 'qiqiq' >>>
4)str.expandtabs(tabsize=8)
——用指定的空格替代橫向製表符,使得相鄰字符串之間的間距保持在指定的空格數之內。tab 符號默認的空格數是 8。
>>> tab = '1\t23\t456\t7890\t1112131415\t161718192021'
>>> tab.expandtabs()
'1 23 456 7890 1112131415 161718192021'
>>> tab.expandtabs(4)
'1 23 456 7890 1112131415 161718192021'
>>>
5)str.format(^args, ^^kwargs)
——格式化字符串的語法比較繁多,官方文檔已經有比較詳細的 examples,我上一節也已經介紹了,這裏就不冗餘解釋了;
6)str.format_map(mapping)
——相似 str.format(*args, **kwargs) ,不一樣的是 mapping 是一個字典對象。
>>> People = {'name':'john', 'age':56} >>> 'My name is {name},i am {age} old'.format_map(People) 'My name is john,i am 56 old' >>>
1)str.count(sub[, start[, end]])
——返回指定字符在[指定位置的]str出現的次數
>>> text = 'outer protective covering' >>> text.count('e') 4 >>> text.count('e', 5, 11) 1 >>> text.count('e', 5, 10) 0
2)str.find(sub[, start[, end]]); str.rfind(sub[, start[, end]])
——返回指定字符在[指定位置的]str出現的索引
>>> text = 'outer protective covering' >>> text.find('er') 3 >>> text.find('er', 3) 3 >>> text.find('er', 4) 20 >>> text.find('er', 4, 21) #找不到就會返回-1; -1 >>> text.rfind('er') 20 >>> text.lfind('er') #沒有這個方法 Traceback (most recent call last): File "<pyshell#16>", line 1, in <module> text.lfind('er')AttributeError: 'str' object has no attribute 'lfind'>>> text.rfind('er', 20) 20 >>> text.rfind('er', 20, 21) #找不到返回-1 -1 >>>
3)str.index(sub[, start[, end]]);
str.rindex(sub[, start[, end]])
——與 find() rfind() 相似,不一樣的是若是找不到,就會引起 ValueError。
>>> text 'outer protective covering' >>> text.index('e') 3 >>> text.index('e',4) 10 >>> text.index('e',4,9) #找不到就會引起ValueError錯誤 Traceback (most recent call last): File "<pyshell#22>", line 1, in <module> text.index('e',4,9)ValueError: substring not found
4)str.replace(old, new[, count])
——1)Python replace()方法把字符串中的old(舊字符替)換成new(新字符)。若是指定第三個參數max,則替換不超過max。
2)用法:str.replace(old,new[,max])
3)參數解釋
●old---將被替換的子字符串
●new---新字符串,用於替換old子字符串
●max---可選字符串,替換不超過max次
此方法已經在字符串解說(上)中介紹過了。只給出以下實例,不作過多冗餘; >>> 'Anne is very very good guy'.replace('very','so')'Anne is so so good guy'>>> 'Anne is very very good guy'.replace('very','so',0)'Anne is very very good guy'>>> 'Anne is very very good guy'.replace('very','so',1)'Anne is so very good guy'>>> 'Anne is very very good guy'.replace('very','so',2)'Anne is so so good guy'>>> 'Anne is very very good guy'.replace('very','so',3)'Anne is so so good guy'>>>
5)str.lstrip([chars]); #chars --指定截取的字符。
str.rstrip([chars]);
str.strip([chars]);
——Python lstrip() 方法用於截掉字符串左邊的空格或指定字符。返回截掉字符串左邊的空格或指定字符後生成的新字符串。
>>> ' Hello World '.lstrip() 'Hello World ' >>> '777Hello World77'.lstrip('7') 'Hello World77' >>> ——Python rstrip() 刪除 string 字符串末尾的指定字符(默認爲空格).返回刪除 string 字符串末尾的指定字符後生成的新字符串。 >>> ' Hello World '.rstrip() ' Hello World' >>> '777Hello World77'.rstrip('7') '777Hell ——Python strip() 方法用於移除字符串頭尾指定的字符(默認爲空格)。返回移除字符串頭尾指定的字符生成的新字符串 >>> ' Hello World '.strip() 'Hello World' >>> '77Hello World77'.strip('77') 'Hello World' >>>
6)static str.maketrans(x[, y[, z]]);
str.translate(table)
——maketrans 是一個靜態方法,用於生成一個對照表,以供 translate 使用。
若是 maketrans 僅一個參數,則該參數必須是一個字典,字典的 key 要麼是一個 Unicode 編碼(一個整數),要麼是一個長度爲 1 的字符串,字典的 value 則能夠是任意字符串、None或者 Unicode 編碼。
>>> a = 'dobi' >>> ord('o') 111 >>> ord('a') 97 >>> hex(ord('狗')) '0x72d7' >>> b = {'d':'dobi', 111:' is ', 'b':97, 'i':'\u72d7\u72d7'} >>> table = str.maketrans(b) >>> a.translate(table) 'dobi is a狗狗' >>>
也能夠簡單一點生成對照表:
>>> a='dobi' >>> b = {'d':'dobi', 'o':' is ', 'b':'a', 'i':'dog'}
>>> table=str.maketrans(b)
>>> a.translate(table)
'dobi is adog
——若是 maketrans 有兩個參數,則兩個參數造成映射,且兩個字符串必須是長度相等;若是有第三個參數,則第三個參數也必須是字符串,該字符串將自動映射到 None:
1)str.join(iterable)
——用指定的字符串,鏈接元素爲字符串的可迭代對象。
str.join(seq)——以 str 做爲分隔符,將 seq 中全部的元素(的字符串表示)合併爲一個新的字符串
>>> '-'.join(['2016','06','23']) '2016-06-23' >>> '-'.join([]) '' >>> '-'.join([None]) Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> '-'.join([None])TypeError: sequence item 0: expected str instance, NoneType found >>> '-'.join(['']) '' >>> '-'.join(['2016','06',b'23']) #byte爲非字符串 Traceback (most recent call last): File "<pyshell#4>", line 1, in <module> '-'.join(['2016','06',b'23'])TypeError: sequence item 2: expected str instance, bytes found >>> ','.join({'dobi':'dog', 'polly':'bird'}) 'dobi,polly' >>> ','.join({'dobi':'dog', 'polly':'bird'}.values()) 'dog,bird'
2)str.partition(sep);
str.rpartition(sep)
——partition() 方法用來根據指定的分隔符將字符串進行分割。
若是字符串包含指定的分隔符,則返回一個3元的元組,第一個爲分隔符左邊的子串,第二個爲分隔符自己,第三個爲分隔符右邊的子串。
== partition() 方法是在2.5版中新增的==
string.rpartition(str) ——相似於 partition()函數,不過是從右邊開始查找. >>> str='http://blog.csdn.net/anneqiqi/article/details/51725658' >>> str.partition('://') ('http', '://', 'blog.csdn.net/anneqiqi/article/details/51725658') >>> 'Anne,My best love'.partition('love')('Anne,My best ', 'love', '') >>> 'Anne,My best love'.partition('ll')('Anne,My best love', '', '') >>> 'Anne,My best love'.rpartition('love')('Anne,My best ', 'love', '') >>> 'Anne,My best love'.rpartition(',')('Anne', ',', 'My best love')
3)str.split(sep=None, maxsplit=-1);
str.rsplit(sep=None, maxsplit=-1)
——分隔字符串
>>> '1,2,3'.split(',')['1', '2', '3'] >>> '1,2,3'.rsplit(',')['1', '2', '3'] >>> '1,2,3'.split(',', maxsplit=1)['1', '2,3'] >>> '1,2,3'.rsplit(',', maxsplit=1)['1,2', '3'] >>> '1 2 3'.split()['1', '2', '3'] >>> '1 2 3'.rsplit()['1', '2', '3'] >>> '1 2 3'.split(maxsplit=1)['1', '2 3'] >>> '1 2 3'.rsplit(maxsplit=1)['1 2', '3'] >>> ' 1 2 3 '.split()['1', '2', '3'] >>> '1,2,,3,'.split(',')['1', '2', '', '3', ''] >>> '1,2,,3,'.rsplit(',')['1', '2', '', '3', ''] >>> ''.split()[] >>> ''.split('a')[''] >>> 'bcd'.split('a')['bcd'] >>> 'bcd'.split(None)['bcd'] >>>
str.split(str="", num=string.count(str)).
str = "Line1-abcdef \nLine2-abc \nLine4-abcd";
str.split()
['Line1-abcdef', 'Line2-abc', 'Line4-abcd']
str.split(' ',1)
['Line1-abcdef', '\nLine2-abc \nLine4-abcd']
str -- 分隔符,默認爲空格。
num -- 分割次數。
4)str.splitlines([keepends])
——字符串以行界符爲分隔符拆分爲列表;當 keepends 爲True,拆分後保留行界符,能被識別的行界符見官方文檔。
5)string.splitlines(num=string.count('\n'))
——按照行分隔,返回一個包含各行做爲元素的列表,若是 num 指定則僅切片 num 個行.
1)str.endswith(suffix[, start[, end]]);
str.startswith(prefix[, start[, end]])
- suffix -- 該參數能夠是一個字符串或者是一個元素。
- start -- 字符串中的開始位置。
- end -- 字符中結束位置。
>>> str='this is string example ... wow!!!' >>> suffix='wow!!' >>> str.endswith(suffix) False >>> suffix='wow!!!' >>> str.endswith(suffix) True >>> str.endswith(suffix,20) True >>> suffix='is' >>> str.endswith(suffix,2,4) True >>> str.endswith(suffix,2,6) False >>>
2)string.isalnum()
——若是 string 至少有一個字符而且全部字符都是字母或數字則返回 True,不然返回 False
3)string.isalpha()
——若是 string 至少有一個字符而且全部字符都是字母則返回 True,不然返回 False
4)string.isdecimal()
——若是 string 只包含十進制數字則返回 True 不然返回 False.
isdecimal()方法檢查字符串是否只包含十進制字符。這種方法只存在於unicode對象。
5)string.isdigit()
——若是 string 只包含數字則返回 True 不然返回 False.
6)string.islower()
——若是 string 中包含至少一個區分大小寫的字符,而且全部這些(區分大小寫的)字符都是小寫,則返回 True,不然返回 False
7)string.isnumeric()
——若是 string 中只包含數字字符,則返回 True,不然返回 False
8)string.isspace()
——若是 string 中只包含空格,則返回 True,不然返回 False.
9)string.istitle()
——若是 string 是標題化的(見 title())則返回 True,不然返回 False
10)string.isupper()
——以 str 爲分隔符切片 string,若是 num有指定值,則僅分隔 num 個子字符串
11)string.startswith(obj, beg=0,end=len(string)) ——檢查字符串是不是以 obj 開頭,是則返回 True,不然返回 False。若是beg 和 end 指定值,則在指定範圍內檢查.