Python 字串格式化

2021-07-27 09:07:38 字數 2837 閱讀 2629

python2.6+ 增加了str.format函式,用來代替原有的'%'操作符。它使用比'%'更加直觀、靈活。下面詳細介紹一下它的使用方法。

下面是使用'%'的例子:

""

"pi is %f..." % 3.14159 # => 'pi is 3.141590...'

"%d + %d = %d" % (5, 6, 5+6) # => '5 + 6 = 11'

"the usage of %(language)s" % # => 'the usage of python'

格式很像c語言的printf是不是?由於'%'是乙個操作符,只能在左右兩邊各放乙個引數,因此右邊多個值需要用元組或者字典來包括,不能元組字典一起用,缺乏靈活度。

同樣的例子用format方法改寫:

"pi is ...".format(3.14159) # => 'pi is 3.14159...'

" + = ".format(5, 6, 5+6) # => '5 + 6 = 11'

"the usage of ".format(language = "python") # => 'the usage of python'

是不是很直觀?(當然,使用c語言的我也很喜歡前一種格式表達方式 :-) )

" consist of intermingled character  and ".format("data", "markup", \

named = "formats trings")

format(10.0, "7.3g") # => ' 10'

"my name is :-}".format('fred') # => 'my name is fred :-{}'

注意第一行的'\',如果乙個語句要換行,必須在結尾加上反斜線轉義。

用'%'無法像這樣將元組和字典混用。其實這裡是命名引數,python的乙個特性。可以在定義陣列的時候用*args, **kwargs語法展開集合和字典。需要注意,命名引數放在後面。

第二個語句表示format內建函式用來格式化單個值。

第三個語句表示了{}的轉義,因為{}在被格式化字串裡是特殊字元,不能直接顯示。轉義方式是多巢狀一層。

"my name is ".format(open('out.txt', 'w')) # => 'my name is out.txt'
'' 相當於呼叫物件的屬性 open('out.txt', 'w').name

"my name is ".format(dict(name='fred')) # => 'my name is fred'
使用索引也是可以的。

obj[key] 相當於 obj.____getitem____('key')

寫過c語言的程式設計師應該清楚printf的複雜。format也定義了很多標準的說明符,用來解釋乙個值的格式,然後插入字串內。例如:

"my name is ".format('fred') # => 'my name is fred    '
':'之後便是說明符了,上面例子中說明符只有乙個'8'(minimumwidth),它表示插入的值寬度至少為8。'fred'只有4,所以又加了4個空格。

說明符的詳細格式為:

[[fill]align][sign][#][0][minimumwidth][.precision][type]

(不比c的printf更簡潔啊!)

注意:''表示該元素可選。所以,所有的格式說明符都是可選的!就像之前的例子,幾乎都沒有用這個(只是為了例子更清晰)。實際上,這些是很有用的。

我們乙個個來看:

sign 數字符號,只對數字有效。

# 顯示數字的字首表示幾進製(0b, 0o, 0x)

0 用'0'填充留白。

minimumwidth 指定最小寬度,已經用過很多次了。

.precision 'precision'是乙個十進位制數字,表示顯示小數點後幾位。

type 值的型別:

浮點數

每個物件可以重寫自己的格式化說明符,例如datatime類重寫了後可以這樣表示:

"today is: ".format(datetime.now())
':'之後是格式說明符,之前還可以加預先轉換的標識

我們在格式化乙個字串時,首先格式化每個值,然後再插入字串內。格式化值呼叫的就是format內建方法。format則是簡單地呼叫該值的_format_方法。

def format(value, format_spec):

return value.__format__(format_spec)

在object類內實現了_format方法,只是將本身用str()轉換成字串,然後將字串傳入內建的format方法,實際上就是呼叫轉換為字串後的format_方法。

class object:

def __format__(self, format_spec):

return format(str(self), format_spec)

int/float/str自身實現了_format_方法,前面已經介紹了它們各自的說明符。

還有一點兒是自定義formatter,不過平常也用不到。留作下篇string模組原始碼解讀的內容吧。建議有興趣的朋友多看看python標準庫的原始碼,很有學習價值。

*參考:

Python 字串格式化

字串格式化 s 格式化為字串 format hello,s.s enough for ya?values world hot print format values hello,world.hot enough for ya?f 格式化為實數 浮點數 format pi with three dec...

python字串格式化

字串的格式化 在python中也有類似於c中的printf 的格式輸出標記。在python中格式化輸出字串使用的是 運算子,通用的形式為 其中,左邊部分的 格式標記字串 可以完全和c中的一致。右邊的 值組 如果有兩個及以上的值則需要用小括號括起來,中間用短號隔開。重點來看左邊的部分。左邊部分的最簡單...

Python字串格式化

字串的格式化 在python中也有類似於c中的printf 的格式輸出標記。在python中格式化輸出字串使用的是 運算子,通用的形式為 其中,左邊部分的 格式標記字串 可以完全和c中的一致。右邊的 值組 如果有兩個及以上的值則需要用小括號括起來,中間用短號隔開。重點來看左邊的部分。左邊部分的最簡單...