国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python實現字符串格式化的方法小結

2019-11-25 16:20:57
字體:
來源:轉載
供稿:網友

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其實就是說明正負號的顯示方式,這里使用默認的'-',之后會講到。
  • ^ 居中對齊

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

  • + 顯示加號和減號
  • - 不顯示加號,顯示減號。在不指定最小寬度的情況下負數總是比正數多占一個符號位置。默認
  • ' ' (一個空格) 用一個留白代替加號

3、# 顯示數字的前綴表示幾進制(0b, 0o, 0x)

4、0 用'0'填充留白。

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

6、.precision 'precision'是一個十進制數字,表示顯示小數點后幾位。

7、type 值的類型:

①整型:

  •  b 二進制
  • c 字符型,把數字轉成表示unicode的字符
  • d 十進制
  • o 八進制
  • x 十六進制,顯示小寫字母
  • X 十六進制,顯示大寫字母
  • n 與d行為相同,使用本地的數字表示方式
  • ''(空,沒有空格) 與d相同

②浮點數

  • 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標準庫的源碼,很有學習價值。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 兰州市| 泰兴市| 汉源县| 恭城| 盖州市| 安达市| 五指山市| 萍乡市| 鄂托克旗| 特克斯县| 宁德市| 平度市| 葵青区| 娱乐| 富蕴县| 湄潭县| 高州市| 宁明县| 周宁县| 广元市| 龙川县| 六盘水市| 柘城县| 新余市| 米脂县| 祁门县| 澄江县| 金平| 滨州市| 洛阳市| 右玉县| 南宫市| 济宁市| 新宁县| 桑植县| 建水县| 苗栗市| 荃湾区| 连城县| 毕节市| 黑龙江省|