字符串的內(nèi)容的確不少,甚至都有點(diǎn)啰嗦了。但是,本節(jié)依然還要繼續(xù),就是因?yàn)樵诰幊虒?shí)踐中,經(jīng)常會(huì)遇到有關(guān)字符串的問(wèn)題,而且也是很多初學(xué)者容易迷茫的。
什么是格式化?在維基百科中有專門的詞條,這么說(shuō)的:
格式化是指對(duì)磁盤或磁盤中的分區(qū)(partition)進(jìn)行初始化的一種操作,這種操作通常會(huì)導(dǎo)致現(xiàn)有的磁盤或分區(qū)中所有的文件被清除。
不知道你是否知道這種“格式化”。顯然,此格式化非我們這里所說(shuō)的,我們說(shuō)的是字符串的格式化,或者說(shuō)成“格式化字符串”,都可以,表示的意思就是:
格式化字符串,是 C、C++ 等程序設(shè)計(jì)語(yǔ)言 printf 類函數(shù)中用于指定輸出參數(shù)的格式與相對(duì)位置的字符串參數(shù)。其中的轉(zhuǎn)換說(shuō)明(conversion specification)用于把隨后對(duì)應(yīng)的 0 個(gè)或多個(gè)函數(shù)參數(shù)轉(zhuǎn)換為相應(yīng)的格式輸出;格式化字符串中轉(zhuǎn)換說(shuō)明以外的其它字符原樣輸出。
這也是來(lái)自維基百科的定義。在這個(gè)定義中,是用 C 語(yǔ)言作為例子,并且用了其輸出函數(shù)來(lái)說(shuō)明。在 Python 中,也有同樣的操作和類似的函數(shù) print,此前我們已經(jīng)了解一二了。
如果將那個(gè)定義說(shuō)的通俗一些,字符串格式化化,就是要先制定一個(gè)模板,在這個(gè)模板中某個(gè)或者某幾個(gè)地方留出空位來(lái),然后在那些空位填上字符串。那么,那些空位,需要用一個(gè)符號(hào)來(lái)表示,這個(gè)符號(hào)通常被叫做占位符(僅僅是占據(jù)著那個(gè)位置,并不是輸出的內(nèi)容)。
>>> "I like %s"
'I like %s'
在這個(gè)字符串中,有一個(gè)符號(hào):%s,就是一個(gè)占位符,這個(gè)占位符可以被其它的字符串代替。比如:
>>> "I like %s" % "python"
'I like python'
>>> "I like %s" % "Pascal"
'I like Pascal'
這是較為常用的一種字符串輸出方式。
另外,不同的占位符,會(huì)表示那個(gè)位置應(yīng)該被不同類型的對(duì)象填充。下面列出許多,供參考。不過(guò),不用記憶,常用的只有 %s 和 %d,或者再加上 %f,其它的如果需要了,到這里來(lái)查即可。
| 占位符 | 說(shuō)明 |
|---|---|
| %s | 字符串(采用 str()的顯示) |
| %r | 字符串(采用 repr()的顯示) |
| %c | 單個(gè)字符 |
| %b | 二進(jìn)制整數(shù) |
| %d | 十進(jìn)制整數(shù) |
| %i | 十進(jìn)制整數(shù) |
| %o | 八進(jìn)制整數(shù) |
| %x | 十六進(jìn)制整數(shù) |
| %e | 指數(shù) (基底寫為 e) |
| %E | 指數(shù) (基底寫為 E) |
| %f | 浮點(diǎn)數(shù) |
| %F | 浮點(diǎn)數(shù),與上相同 |
| %g | 指數(shù)(e) 或浮點(diǎn)數(shù) (根據(jù)顯示長(zhǎng)度) |
| %G | 指數(shù)(E)或浮點(diǎn)數(shù) (根據(jù)顯示長(zhǎng)度) |
看例子:
>>> a = "%d years" % 15
>>> print a
15 years
當(dāng)然,還可以在一個(gè)字符串中設(shè)置多個(gè)占位符,就像下面一樣
>>> print "Suzhou is more than %d years. %s lives in here." % (2500, "qiwsir")
Suzhou is more than 2500 years. qiwsir lives in here.
對(duì)于浮點(diǎn)數(shù)字的打印輸出,還可以限定輸出的小數(shù)位數(shù)和其它樣式。
>>> print "Today's temperature is %.2f" % 12.235
Today's temperature is 12.23
>>> print "Today's temperature is %+.2f" % 12.235
Today's temperature is +12.23
注意,上面的例子中,沒(méi)有實(shí)現(xiàn)四舍五入的操作。只是截取。
關(guān)于類似的操作,還有很多變化,比如輸出格式要寬度是多少等等。如果看官在編程中遇到了,可以到網(wǎng)上查找。我這里給一個(gè)參考圖示,也是從網(wǎng)上抄來(lái)的。

其實(shí),上面這種格式化方法,常常被認(rèn)為是太“古老”了。因?yàn)樵?Python 中還有新的格式化方法。
>>> s1 = "I like {}".format("python")
>>> s1
'I like python'
>>> s2 = "Suzhou is more than {} years. {} lives in here.".format(2500, "qiwsir")
>>> s2
'Suzhou is more than 2500 years. qiwsir lives in here.'
這就是 Python 非常提倡的 string.format()的格式化方法,其中 {} 作為占位符。
這種方法真的是非常好,而且非常簡(jiǎn)單,只需要將對(duì)應(yīng)的東西,按照順序在 format 后面的括號(hào)中排列好,分別對(duì)應(yīng)占位符 {} 即可。我喜歡的方法。
如果你覺得還不明確,還可以這樣來(lái)做。
>>> print "Suzhou is more than {year} years. {name} lives in here.".format(year=2500, name="qiwsir")
Suzhou is more than 2500 years. qiwsir lives in here.
真的很簡(jiǎn)潔,看成優(yōu)雅。
其實(shí),還有一種格式化的方法,被稱為“字典格式化”,這里僅僅列一個(gè)例子,如果看官要了解字典的含義,本教程后續(xù)會(huì)有的。
>>> lang = "Python"
>>> print "I love %(program)s"%{"program":lang}
I love Python
列舉了三種基本格式化的方法,你喜歡那種?我推薦:string.format()
字符串的方法很多??梢酝ㄟ^(guò) dir 來(lái)查看:
>>> dir(str)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
這么多,不會(huì)一一介紹,要了解某個(gè)具體的含義和使用方法,最好是使用 help 查看。舉例:
>>> help(str.isalpha)
Help on method_descriptor:
isalpha(...)
S.isalpha() -> bool
Return True if all characters in S are alphabetic
and there is at least one character in S, False otherwise.
按照這里的說(shuō)明,就可以在交互模式下進(jìn)行實(shí)驗(yàn)。
>>> "python".isalpha() # 字符串全是字母,應(yīng)該返回 True
True
>>> "2python".isalpha() # 字符串含非字母,返回 False
False
這個(gè)函數(shù)的作用是將字符串根據(jù)某個(gè)分割符進(jìn)行分割。
>>> a = "I LOVE PYTHON"
>>> a.split(" ")
['I', 'LOVE', 'PYTHON']
這是用空格作為分割,得到了一個(gè)名字叫做列表(list)的返回值,關(guān)于列表的內(nèi)容,后續(xù)會(huì)介紹。還能用別的分隔嗎?
>>> b = "www.itdiffer.com"
>>> b.split(".")
['www', 'itdiffer', 'com']
這個(gè)功能,在讓用戶輸入一些信息的時(shí)候非常有用。有的朋友喜歡輸入結(jié)束的時(shí)候敲擊空格,比如讓他輸入自己的名字,輸完了,他來(lái)個(gè)空格。有的則喜歡先加一個(gè)空格,總做的輸入的第一個(gè)字前面應(yīng)該空兩個(gè)格。
這些空格是沒(méi)用的。Python 考慮到有不少人可能有這個(gè)習(xí)慣,因此就幫助程序員把這些空格去掉。
方法是:
例如:
>>> b=" hello " # 兩邊有空格
>>> b.strip()
'hello'
>>> b
' hello '
特別注意,原來(lái)的值沒(méi)有變化,而是新返回了一個(gè)結(jié)果。
>>> b.lstrip() # 去掉左邊的空格
'hello '
>>> b.rstrip() # 去掉右邊的空格
' hello'
對(duì)于英文,有時(shí)候要用到大小寫轉(zhuǎn)換。最有名駝峰命名,里面就有一些大寫和小寫的參合。如果有興趣,可以來(lái)這里看自動(dòng)將字符串轉(zhuǎn)化為駝峰命名形式的方法。
在 Python 中有下面一堆內(nèi)建函數(shù),用來(lái)實(shí)現(xiàn)各種類型的大小寫轉(zhuǎn)化
看例子:
>>> a = "qiwsir,Python"
>>> a.upper() # 將小寫字母完全變成大寫字母
'QIWSIR,PYTHON'
>>> a # 原數(shù)據(jù)對(duì)象并沒(méi)有改變
'qiwsir,Python'
>>> b = a.upper()
>>> b
'QIWSIR,PYTHON'
>>> c = b.lower() # 將所有的小寫字母變成大寫字母
>>> c
'qiwsir,Python'
>>> a
'qiwsir,Python'
>>> a.capitalize() # 把字符串的第一個(gè)字母變成大寫
'Qiwsir,Python'
>>> a # 原數(shù)據(jù)對(duì)象沒(méi)有改變
'qiwsir,Python'
>>> b = a.capitalize() # 新建立了一個(gè)
>>> b
'Qiwsir,Python'
>>> a = "qiwsir,github" # 這里的問(wèn)題就是網(wǎng)友白羽毛指出的,非常感謝他。
>>> a.istitle()
False
>>> a = "QIWSIR" # 當(dāng)全是大寫的時(shí)候,返回 False
>>> a.istitle()
False
>>> a = "qIWSIR"
>>> a.istitle()
False
>>> a = "Qiwsir,github" # 如果這樣,也返回 False
>>> a.istitle()
False
>>> a = "Qiwsir" # 這樣是 True
>>> a.istitle()
True
>>> a = 'Qiwsir,Github' # 這樣也是 True
>>> a.istitle()
True
>>> a = "Qiwsir"
>>> a.isupper()
False
>>> a.upper().isupper()
True
>>> a.islower()
False
>>> a.lower().islower()
True
順著白羽毛網(wǎng)友指出的,再探究一下,可以這么做:
>>> a = "This is a Book"
>>> a.istitle()
False
>>> b = a.title() # 這樣就把所有單詞的第一個(gè)字母轉(zhuǎn)化為大寫
>>> b
'This Is A Book'
>>> b.istitle() # 判斷每個(gè)單詞的第一個(gè)字母是否為大寫
True
用“+”能夠拼接字符串,但不是什么情況下都能夠如愿的。比如,將列表(關(guān)于列表,后續(xù)詳細(xì)說(shuō),它是另外一種類型)中的每個(gè)字符(串)元素拼接成一個(gè)字符串,并且用某個(gè)符號(hào)連接,如果用“+”,就比較麻煩了(是能夠?qū)崿F(xiàn)的,麻煩)。
用字符串的 join 就比較容易實(shí)現(xiàn)。
>>> b
'www.itdiffer.com'
>>> c = b.split(".")
>>> c
['www', 'itdiffer', 'com']
>>> ".".join(c)
'www.itdiffer.com'
>>> "*".join(c)
'www*itdiffer*com'
這種拼接,是不是簡(jiǎn)單呢?
總目錄 | 上節(jié):字符串(3) | 下節(jié):字符編碼
如果你認(rèn)為有必要打賞我,請(qǐng)通過(guò)支付寶:qiwsir@126.com,不勝感激。