Python實作字串格式化的方法小結
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" % {"language": "python"} # => 'The usage of python'
格式很像C語言的printf是不是?由於'%'是一個操作符,只能在左右兩邊各放一個參數,因此右邊多個值需要用元組或字典來包括,不能元組字典一起用,缺乏彈性度。
同樣的範例用format方法改寫:
"PI is {0}...".format(3.14159) # => 'PI is 3.14159...' "{0} + {1} = {2}".format(5, 6, 5+6) # => '5 + 6 = 11' "The usage of {language}".format(language = "Python") # => 'The usage of Python'
是不是很直覺? (當然,使用C語言的我也喜歡前一種格式表達方式:-) )
#格式化字串
"{named} consist of intermingled character {0} and {1}".format("data", "markup", \ named = "Formats trings") format(10.0, "7.3g") # => ' 10' "My name is {0} :-{{}}".format('Fred') # => 'My name is Fred :-{}'
注意第一行的'\',如果一個語句要換行,必須在結尾加上反斜線轉義。
用'%'無法像這樣將元組和字典混用。其實這裡是命名參數,Python的一個特性。可以在定義數組的時候用*args, **kwargs語法展開集合和字典。需要注意,命名參數放在後面。
第二個語句表示format內建函數用來格式化單一值。
第三個語句表示了{}的轉義,因為{}在被格式化字串裡是特殊字符,不能直接顯示。轉義方式是多嵌套一層。
使用屬性和索引
"My name is {0.name}".format(open('out.txt', 'w')) # => 'My name is out.txt'
'{0.name}' 相當於呼叫物件的屬性open('out.txt', 'w').name
"My name is {0[name]}".format(dict(name='Fred')) # => 'My name is Fred'
使用索引也是可以的。
obj[key] 相當於obj.____getitem____('key')
標準說明符(Specifiers)
#已寫過C語言的程式設計師應該要清楚printf的複雜。 format也定義了許多標準的說明符,用來解釋一個值的格式,然後插入字串內。例如:
"My name is {0:8}".format('Fred') # => 'My name is Fred '
':'之後便是說明符了,上面範例中說明符只有一個'8'(minimumwidth),它表示插入的值寬度至少為8。 'Fred'只有4,所以又加了4個空格。
說明符的詳細格式為:
[[fill]align][sign][#][0][minimumwidth][.precision][type]
(不比C的printf更簡潔啊!)
注意:'[]'表示該元素可選。所以,所有的格式說明符都是可選的!就像之前的例子,幾乎都沒有用這個(只是為了例子比較清楚)。實際上,這些是很有用的。
我們一個個來看:
1、[fill]align 表示排列方式。當minimumwidth設定的比插入的值大時,就有了留白,就像上一個例子中的'My name is Fred '。預設把留白放在了右邊,也就是說插入值預設是左對齊的。如果我們試試{0:>8},會發現結果變成了'My name is Fred'。
fill 表示用來填入留白的字元。只有在align指定了的情況下fill才有用! align可以是下面的識別:
< 左對齊,預設
> 右對齊
- ##= 將留白放在align標識後面,只對數字有效。什麼意思呢? align下面會講到,顯示數字的正負號,同樣只對數字有效。如果指定了'=',那麼就會把數字的正負號顯示在留白的前面。例如:format(-12, "0=8") # => '-0000012'注意這裡用的是格式化單一值的內建函數format。 '0'是fill元素,用它來填充留白;'='就是該標識了;'8'是指最小寬度為8,因此才有5個留白。那麼align呢? align其實就是說明正負號的顯示方式,這裡使用預設的'-',之後會講到。
- ^ 居中對齊
+ 顯示加號和減號
#- 不顯示加號,顯示減號。在不指定最小寬度的情況下負數總是比正數多佔一個符號位置。預設
4、0 用'0'填滿留白。
- 5、minimumwidth 指定最小寬度,已經用過很多次了。 6、.precision 'precision'是一個十進制數字,表示顯示小數點後幾位。
- 7、type 值的型別:
- ①整數:
- b 二進位
- c 字元型,把數字轉換成表示unicode的字元
- d 十進位
- o 八進位
e 科学计数法表示,小写e
E 科学计数法表示,大写E
f 显示为定点数,默认小数点后六位
F 同f
g 自动选择是否用科学记数法表示
G 同g
n 同g,使用本地表示方式
% 使用百分比表示
''(空) 同g
每个对象可以重写自己的格式化说明符,例如datatime类重写了后可以这样表示:
"Today is: {0:%a %b %d %H:%M:%S %Y}".format(datetime.now())
预先转换
':'之后是格式说明符,之前还可以加预先转换的标识
!r 调用对象的_repr_方法来转换成标准字符串
!s 调用对象的_str_方法来转换成字符串
重写_format_方法
我们在格式化一个字符串时,首先格式化每个值,然后再插入字符串内。格式化值调用的就是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标准库的源码,很有学习价值。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持PHP中文网。
更多Python实现字符串格式化的方法小结相关文章请关注PHP中文网!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Linux終端中查看Python版本時遇到權限問題的解決方法當你在Linux終端中嘗試查看Python的版本時,輸入python...

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...

在使用Python的pandas庫時,如何在兩個結構不同的DataFrame之間進行整列複製是一個常見的問題。假設我們有兩個Dat...

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

Uvicorn是如何持續監聽HTTP請求的? Uvicorn是一個基於ASGI的輕量級Web服務器,其核心功能之一便是監聽HTTP請求並進�...

攻克Investing.com的反爬蟲策略許多人嘗試爬取Investing.com(https://cn.investing.com/news/latest-news)的新聞數據時,常常�...
