廣告
| 字串格式運算 |
|
|
|
| 作者是 Victor | |||||||||||||||||||||||||||||||||||||||||||||||||
| 週三, 11 二月 2009 21:09 | |||||||||||||||||||||||||||||||||||||||||||||||||
字串格式運算
我們先來看看我們對於字串的格式,有什麼樣的功能,是的,如果你沒忘記的話,我們有字串相加等等的運算,例如我們想印出"Number : 數字"可以使用"Number :" + str(number)等方法,但是如果我們想要"特定格式"的字串輸出呢?例如我們想以16進制輸出? 又或著想用科學表示法來表示數字呢? 我們得字己轉換? 你可以這樣做,但是這麼常用的功能,Python並沒有忘記,如果你有學過C語言,你可能會懷念printf好用的格式化語法,事實上Python也承襲了這樣好用的語法,如果你已經學過C語言的printf,或其它語言的字串格式你會發現他們大多都大同小異,現在就讓我們來介紹Python的字串格式運算。 Python的字串格式運算很簡單,總共有分兩種方式,第一種,使用元組來按順序填入格式,只要字串後面接著一個百分比符號 "%" 然後再接一個元組: "欲格式化字串" % (物件1, 物件2, 物件3, ...) 像這樣,另一種是使用Dictionary來進行格式化,有個好處就是不按照順序,只看鍵值
"欲格式化字串" % {'鍵值1': 對應資料1, '鍵值2': 對應資料2, ....}
而格式的語法有些不同,讓我們一一介紹這兩種方法。 使用元組格式基本上元組和C語言的printf語法很類似,幾乎可以說沒什麼差別,所以如果你學過其它類似的語法,也會覺得很親切,以下讓我們介紹元組的格式語法。 %[旗標][寬度][.小數點位數]格式參數 一個%後面接著旗標,在這裡用[]括起來,不是屬於語法,而是指可以省略不寫,舉個例子 "My name is %s" % 'Victor' 像這一行的%s,就是字串格式運算的語法,s代表將資料轉換成字串格式,而這裡的特例是,當元素只有一個就可以不用使用Tuple接在後面,如果一個元素你要接Tuple也是可以的
"My name is %s" % ('Victor',)
只是結果還是一樣,這種語法的概念很簡單,簡單的來說,就是"一個蘿蔔一個坑",什麼意思呢? 請把左邊的%開頭的格式符號想成是坑,右邊的資料元組裡的元素是蘿蔔,按照順序,第一個蘿蔔塞進第一個坑,第二個塞進第二個坑,以此類推,換言之,就是左邊出現的第一個%格式符號,會由右邊的第一個元素來提供格式化用的資料,有一點值得注意的是,蘿蔔和坑的個數必須一樣,否則會出現錯誤,以下就讓我們用簡單的例子來說明使用方式。 # -*- coding: utf-8 -*- # 建立名稱 name = 'Victor Lin' # 建立天氣資料 weatherData = (u'台中地區', u'多雲時晴', u'15~18', u'度C', u'0%') # 第一個%s以name當資料來格式化 print 'Hello, %s' % name # 印出今日天氣概況 print u"%s 的今天氣是 %s,氣溫是 %s度%s,降雨機率是 %s" % weatherData 使用字典格式字典的格式方式比較特別,它依據鍵來決定該位置要用哪筆資料來做格式化,以下讓我們介紹語法。%[旗標][寬度][.小數點位數](鍵值名稱)格式參數 比起元組的格式,多出了一個用()括起來的鍵值名稱,舉個例子
"My name is %(name)s" % {'name': 'Victor'}
當它發現%(name)s時,就會在右邊的字典中找到name對應的資料,並且按照s,也就是字串的格式印出來,這樣有個好處,不用考慮順序,只要特定位置使用特定名稱就可以了,還有一點和元組不一樣的是,字典中元素的個數可以多出來,並沒有影響,但是出現在格式中的鍵值卻一個也不能少,否則一樣會出錯,舉個不會出錯,但元素多出來的例子
author = {'name': 'Victor', 'age': 19}
print "My name is %(name)s" % author
我們可以在這個例子中發現author中多出了age這個鍵和對應值,但是在格式的字串中,只出現name此鍵值,因此沒有影響,但是如果格式字串中出現鍵,就一定得同樣出現在右邊的字典中,以下是一個會引發錯誤的例子
print "My name is %(name)s" % {'age': 19}
因為找不到name鍵,上面的範例會產生錯誤。
介紹完了字典的語法,以下讓我們簡單地示範如何使用字典的字串格式化運算。
# -*- coding: utf-8 -*-
# 建立作者資訊的Dictionary
author = {'name': 'Victor Lin', 'age': 19, 'professional': 'student'}
# 設定格式化後的字串給變數
authorMessage = "Author of this article is %(name)s, his age is %(age)d." % author
# 印出authorMessage
print authorMessage
# 印出職業
print "He is a %(professional)s." % author
格式化參數與旗標介紹完了字串格式運算的語法,接下來我們來介有哪些控制字串格式的旗標與參數。 首先介紹的轉換的參數所代表的格式。
轉換類形的大小寫是表示,其中的英文部份是以大寫或小寫輸出,例如十六進制的0xFFF,大寫就是0xFFF,小寫就是0xfff,就是這樣的差別而已,而比較特別的是%,在格式字串裡,你想要打%,可是可能會被誤以為是字串格式運算用的符號,因此你只要打兩個%,例如"今天的降雨機率是%d%%" % rate,這裡最後出現的%%會被變成一個%輸出,而且不會讀取右邊的任何資料,只是用來解決%無法輸出的問題。 以下幾個例子讓我們來示範各種類形的格式。 # -*- coding: utf-8 -*- # 輸出數字類形 print u'說好不提%d的' % 261 # 輸出repr轉換後的字串 print u'repr : %r' % u'許功蓋先生' # 輸出浮點數格式,指數大於-4,會以指數形態輸出 print u'float: %G' % 0.00005 # 輸出浮點數格式,指數小於-4,會以浮點形態輸出 print u'float: %G' % 0.05 # 輸出十六進制 print u'Hex: %X' % 12345678 # 輸出 % print u'今天的降雨機率是%d%%' % 12 寬度與小數點位數
如我們前面所提的格式 %[旗標][寬度][.小數點位數]轉換類形 還有寬度和小數點位數兩個欄位,我們還沒說明,所謂的寬度就是指,格式化後佔多少個字元,不足的部份會以空白補足,舉個例子
print repr('%5s' % 'abc')
這句的結果會是 ' abc' 前面被兩個空白補足了,因為預設是靠右,所以補足前面的空白,總而言之它會補空白直到補滿"寬度"為止。 print '%.3f' % (10/3.0) 的結果會是 3.333 總共有三個位數,然而,因為小數點位數與寬度是不同欄位,所以你可以同時寫寬度和小數點位數
print repr('%7.3f' % (10/3.0))
的結果會是 ' 3.333' 前面被補足了兩個空白,因為寬度是7,而小數點位數是3,字串的長度是5,因此前面會補兩個空白。 # 輸出寬度為10的字串 print '<p>%10s</p>' % 'hello' # 建立floatNumber為3.33333.... floatNumber = 10/3.0 # 輸出寬度為7,小數點位數到4的浮點數格式 print '%7.4f' % floatNumber 旗標如果們前面格式所寫的,在最前面還可以加一個旗標 %[旗標][寬度][.小數點位數]轉換類形 因為和其它的寬度、小數點位數等是不同欄位,因此也可以和其它欄位同時存在,舉個例子,例如我們想讓輸出的數字不管正負號都把正負號給顯示出來,這時+這個旗標就可以加上去,可以這樣寫 '%+.3f' % (10/3.0) 以下讓我們介紹旗標的種類。
以下我們示範簡單的旗標使用方法。 # 輸出寬度為10的字串,並且讓它靠左對齊 print '<p>%-10s</p>' % 'hello' # 建立floatNumber為3.33333.... floatNumber = 10/3.0 # 輸出寬度為7,小數點位數到4的浮點數格式,並且顯示正負號 print '%+7.4f' % floatNumber # 輸出寬度為10的字串,多出來的部份補0 print '%010d' % 7788 # 輸出正整數,如果正數左邊補空白 print '% d' % 7788 # 輸出負整數,如果正數左邊補空白 print '% d' % -778
|
核心是 Joomla!. Designed by: Free Joomla Theme, whois protect. Valid XHTML and CSS.


