- 零基礎入門學習Python(第2版)
- 小甲魚
- 2927字
- 2019-12-20 12:19:38
5.3 字符串

視頻講解
或許現在又回過頭來談字符串,有些讀者可能會覺得沒必要。其實關于字符串,還有很多你可能不知道的秘密,由于字符串在日常使用中是如此常見,因此小甲魚抱著負責任的態度在本節把所知道的都與大家分享一下。
在一些編程語言中,字符和字符串是兩個不同的概念,如C語言使用單引號將字符括起來,使用雙引號包含字符串。但在Python中,只有字符串這一個概念:
>>> str1 = "I love FishC.com!" >>> str1 'I love FishC.com!'
注意:
可以使用單引號將字符串包裹起來,也可以使用雙引號,但務必要成對編寫,不能一邊是單引號而另一邊是雙引號。
在學習了列表和元組之后,我們掌握了一個新的操作——切片,事實上也可以應用到字符串上:
>>> str1[7:] 'FishC.com!'
字符串與元組一樣,都是屬于“一言既出,駟馬難追”的家伙。所以,一旦確定下來就不能再對它進行修改。如果非要這么做,仍然可以利用切片和拼接來實現:
>>> str2 = "一只穿云箭,千軍萬馬來相見!" >>> str2 = str2[:1] + '支' + str2[2:] >>> str2 '一支穿云箭,千軍萬馬來相見!'
注意:
這種通過拼接舊字符串的各個部分組合得到新字符串的方式,并不是真正意義上的修改字符串。原來的那個舊的字符串其實還在,只不過我們將變量名指向了拼接后的新字符串。舊的字符串一旦失去了變量的引用,就會被Python的垃圾回收機制釋放掉。
比較操作符、邏輯操作符、成員關系操作符的操作和列表、元組是一樣的,這里就不再贅述。
5.3.1 各種內置方法
列表和元組都有一些內置方法,大家可能覺得它們的方法已經非常多了,其實字符串的方法更多。表5-1總結了字符串的所有方法及對應的含義。
表5-1 Python字符串的方法及含義

續表

這里選幾個常用的字符串方法給大家演示一下用法,其他的可以根據上述文檔的注釋依葫蘆畫瓢。
casefold()方法用于將字符串中所有的英文字母修改為小寫:
>>> str1 = "FishC" >>> str1.casefold() 'fishc'
提示:
只要涉及字符串修改的方法,并不是修改原字符串,而是返回字符串修改后的一個拷貝。
count(sub[,start[,end]])方法用于查找sub參數在字符串中出現的次數,可選參數start和end表示查找的范圍:
>>> str2 = "上海自來水來自海上" >>> str2.count('上') 2 >>> str2.count('上', 0, 5) 1
find(sub[,start[,end]])或index(sub[,start[,end]])方法用于查找sub參數在字符串中第一次出現的位置,如果找到了,返回位置索引值;如果找不到,find()方法會返回-1,而index()方法會拋出異常(注:異常是可以被捕獲并處理的錯誤):

replace(old,new[,count])方法用于將字符串中的old參數指定的字符串替換成new參數指定的字符串:
>>> str4 = "I love you." >>> str4.replace("you", "fishc.com") 'I love fishc.com.'
split(sep=None, maxsplit=-1)方法用于拆分字符串:
>>> str5 = "肖申克的救贖/1994年/9.6分/美國" >>> str5.split(sep='/') ['肖申克的救贖', '1994年', '9.6分', '美國']
和split()方法相反,join(iterable)方法用于拼接字符串:
>>> countries = ['中國', '俄羅斯', '美國', '日本', '韓國'] >>> '-'.join(countries) '中國-俄羅斯-美國-日本-韓國' >>> ','.join(countries) '中國,俄羅斯,美國,日本,韓國' >>> ''.join(countries) '中國俄羅斯美國日本韓國'
這種語法看上去可能會比較奇怪,很多讀者可能會覺得被拼接的對象應該放在join()方法的左側更合適(如寫成這樣countries.join('-'))?
但是因為join()被指定為字符串的其中一個方法,所以只能這么寫。另外還有一個重要的原因是,join()的參數支持一切可迭代對象(如列表、元組、字典、文件、集合或生成器等),如果將它們寫在左側,那就必須為這些對象都創建一個join()方法,顯然這樣做是沒有必要的。
其實,Python程序員更喜歡使用join()方法代替加號(+)來拼接字符串,這是因為使用加號(+)去拼接大量的字符串,效率相對會比較低,這種操作會頻繁進行內存復制和觸發垃圾回收機制。
5.3.2 格式化

視頻講解
什么是字符串的格式化,又為什么需要對字符串進行格式化?講個小故事給大家聽:某天小甲魚心血來潮,試圖召開一個“魚C跨物種互聯交流大會”,到會的朋友有來自各個物種的精英人士,有小烏龜、喵星人、汪星人,當然還有米奇和唐老鴨,那氣勢簡直跟小甲魚開了個動物園一樣……但是問題來了,大家交流起來簡直是雞同鴨講,不知所云!不過最后聰明的小甲魚還是把問題給解決了,其實也很簡單,各界都找一個翻譯就行了,統一將發言都翻譯成普通話,那么問題就解決了……最后我們這個大會當然取得了成功并被載入了“吉尼斯世界動物大全”。
好吧,舉這個例子其實就是想跟大家說,格式化字符串,就是按照統一的規格去輸出一個字符串。如果規格不統一,就很可能造成誤會,例如,十六進制的10跟十進制的10或二進制的10完全是不同的概念(十六進制的10等于十進制的16,二進制的10卻等于十進制的2)。字符串格式化,正是幫助我們糾正并規范這類問題而存在的。
1. format()
format()方法接收位置參數和關鍵字參數(位置參數和關鍵字參數在第6章中有詳細講解),二者均傳遞到一個名為replacement的字段。而這個replacement字段在字符串內用大括號({})表示。先看一個例子:
>>> "{0} love {1}.{2}".format("I", "FishC", "com") 'I love FishC.com'
怎么回事呢?仔細看一下,字符串中的{0}、{1}和{2}應該與位置有關,依次被format()的三個參數替換,那么format()的三個參數就稱為位置參數。那什么是關鍵字參數呢?再來看一個例子:
>>> "{a} love .{c}".format(a="I", b="FishC", c="com") 'I love FishC.com'
{a}、和{c}就相當于三個目標標簽,format()將參數中等值的字符串替換進去,這就是關鍵字參數。另外,也可以綜合位置參數和關鍵字參數在一起使用:
>>> "{0} love .{c}".format("I", b="FishC", c="com") 'I love FishC.com'
但要注意的是,如果將位置參數和關鍵字參數綜合在一起使用,那么位置參數必須在關鍵字參數之前,否則就會出錯:
>>> "{a} love .{0}".format(a="I", b="FishC", "com") SyntaxError: non-keyword arg after keyword arg
如果要把大括號打印出來,有辦法嗎?沒錯,這與字符串轉義字符有點像,只需要用多一層大括號包起來即可:
>>> "{{0}}".format("不打印") '{0}'
位置參數“不打印”沒有被輸出,這是因為{0}的特殊功能被外層的大括號({})所剝奪,因此沒有字段可以輸出。注意,這并不會產生錯誤哦。最后來看另一個例子:
>>> "{0}:{1:.2f}".format("圓周率", 3.14159) '圓周率:3.14'
可以看到,位置參數{1}跟平常有些不同,后邊多了個冒號。在替換域中,冒號表示格式化符號的開始,“.2”的意思是四舍五入到保留兩位小數點,而f的意思是浮點數,所以按照格式化符號的要求打印出了3.14。
2. 格式化操作符:%
剛才講的是字符串的格式化方法,現在來談談字符串所獨享的一個操作符:%。有人說,這不是求余數的操作符嗎?是的,沒錯。當%的左右均為數字的時候,它表示求余數的操作;但當它出現在字符中的時候,它表示的是格式化操作符。表5-2列舉了Python的格式化符號及含義。
表5-2 Python格式化符號及含義令

下面給大家舉幾個例子供參考:
>>> '%c' % 97 'a' >>> '%c%c%c%c%c' % a 'FishC' >>> '%d轉換為八進制是:%o' % (123, 123) '123轉換為八進制是:173' >>> '%f用科學計數法表示為:%e' % (149500000, 149500000) '149500000.000000用科學計數法表示為:1.495000e+08'
所以,使用格式化的方法也可以對字符串進行拼接:
>>> str1 = "一支穿云箭,千軍萬馬來相見;" >>> str2 = "兩副忠義膽,刀山火海提命現。" >>> "%s%s" % (str1, str2) '一支穿云箭,千軍萬馬來相見;兩副忠義膽,刀山火海提命現。'
那么結合前面提到的兩種方法,現在共有三種方法可以對字符串進行拼接了。什么時候用哪種方法,根據不同情況,可以參考下面三條準則進行選擇:
? 簡單字符串連接時,直接使用加號(+),例如:full_name = prefix + name。
? 復雜的,尤其有格式化需求時,使用格式化操作符(%)進行格式化連接,例如:result = "result is %s:%d" % (name, score)。
? 當有大量字符串拼接,尤其發生在循環體內部時,使用字符串的join()方法無疑是最棒的,例如:result = "".join(iterator)。
另外,Python還提供了格式化操作符的輔助指令,如表5-3所示。
表5-3 格式化操作符的輔助命令

同樣給大家舉幾個例子供參考:
>>> '%5.1f' % 27.658 ' 27.7' >>> '%.2e' % 27.658 '2.77e+01' >>> '%10d' % 5 ' 5' >>> '%-10d' % 5 '5 ' >>> '%010d' % 5 '0000000005' >>> '%#X' % 100 '0X64'
3. Python的轉義字符及含義
Python的部分轉義字符已經使用了一段時間,是時候來總結一下了,如表5-4所示。
表5-4 轉義字符及含義

- 深入核心的敏捷開發:ThoughtWorks五大關鍵實踐
- Raspberry Pi Networking Cookbook(Second Edition)
- Reactive Programming with Swift
- Android Application Development Cookbook(Second Edition)
- HTML5游戲開發案例教程
- 軟件測試技術指南
- Lighttpd源碼分析
- Natural Language Processing with Java and LingPipe Cookbook
- Emgu CV Essentials
- Python 3.7從入門到精通(視頻教學版)
- ASP.NET開發寶典
- Visual Basic程序設計基礎
- Python面向對象編程(第4版)
- 系統分析師UML用例實戰
- 打造流暢的Android App