python格式化輸出:%s和format()用法比較

  • 2020 年 2 月 20 日
  • 筆記

作者:黃偉呢

來源:凹凸數據

1、python格式化輸出歷史起源

python2.5之前,我們使用的是老式格式化輸出:%s。從python3.0開始起(python2.6同期發布),同時支援兩個版本的格式化,多出來的一個新版本就是利用format()函數,進行格式化輸出。

2、為什麼要學習python3支援的新式格式化輸出呢?

雖然老式的語法,兼容性很好,但是它的功能很少,很難完成複雜的任務,而format()函數進行格式化輸出,功能更加強大,從下面的學習中你會慢慢體會到。

01

基本用法

a = "%s張飛%s關羽%s劉備%s趙雲" % (1,2,3,4)  display(a)    b  = "{}張飛{}關羽{}劉備{}趙雲".format(1,2,3,4)  display(b)

結果如下:

1)format()支援位置格式化填充,%s不支援;

  • 第一種方式: 大括弧{ }中寫的是format()傳入值所對應的下標。
  • 第二種方式: 大括弧{ }中的變數,和format()傳入值是一一對應的。
# --------------------方式一-----------------------  c = "{3}張飛{1}關羽{2}劉備{0}趙雲".format(1,2,3,4)  display(c)  # --------------------方式二-----------------------  def my_hobbies(fruit,ball,drink):      hobbies = "我喜歡水果{fruit},我也喜歡球類{ball},我還喜歡飲料{drink}".format(ball=ball,fruit=fruit,drink=drink)      return hobbies    fruit = "apple"  ball = "basketball"  drink = "milk"  my_hobbies(fruit,ball,drink)  # --------------------方式二-----------------------  fruit = "apple"  ball = "basketball"  drink = "milk"  hobbies = "我喜歡水果{fruit},我也喜歡球類{ball},我還喜歡飲料{drink}".format(ball=ball,fruit=fruit,drink=drink)  display(hobbies)

結果如下:

02

填充和對齊

1)填充(只能用一個字元進行填充)

① 什麼是填充?

  • 概念:當指定了字元串最終的長度,但是現有的字元串沒有那麼長,那麼我們就用某種字元(填充字元)來填滿至這個長度,這就是「填充」。

② %s:實現填充功能;

a = "%s" % ("張飛")  display(a)    b = "%10s" % ("張飛")  display(b)

結果如下:

③ format():實現填充功能;

c = "{}".format("張飛")  display(c)    d = "{:10}".format("張飛")  display(d)

結果如下:

總結如下:通過上述案例結果呈現,當使用的是%s,進行字元串填充的時候,默認是在原字元串左側進行填充;當使用的是format(),進行字元串填充的時候,默認是在原字元串右側進行填充。這就是我們下面要講述的"對齊"。

2)對齊

① 什麼是對齊?

  • 概念:"對齊"要與"填充"一起使用,才會顯得有意義。當我們進行填充的時候,我們可以選擇只在字元串左側填充,也可以選擇只在字元串右側填充,還可以選擇在字元串兩側填充(字元串居中顯示的填充方式)。

② %s:實現對齊功能,只有左對齊和右對齊;

# 左填充  a = '%10s' % ('張飛')  display(a)  # 右填充  b = '%-10s' % ('張飛')  display(b)

結果如下:

③ format():實現對齊功能,不僅有左對齊和右對齊,還有居中對齊;

# 左填充  a = ':>10'.format('張飛')  display(a)    # 右填充  b = ':<10'.format('張飛')  display(b)    # 居中填充  c = ':^10'.format('張飛')  display(c)

結果如下:

④ 使用"特定符號"進行填充;

  • 舊版語法中(%s),使用"特定符號"填充,很麻煩,不直接,你也不用去管。
  • 這裡主要看新版語法中(format()函數),進行"特定符號"填充。

03

截斷

概念:如果我們指定的"截斷長度",比實際給出的"字元串"的長度要短,會發生截斷。

1)長度和截斷長度的區別

① 什麼是長度?

「{:8}」.format(「xishi is beautiful」)中,這個8表示的是填充長度,又成為長度,當字元串長度小於這個長度8的時候,會發生填充;當字元串長度大於這個長度8的時候,長度無效,返回的仍然是原來的字元串。

操作如下:

a = "{:8}".format("xishi")  display(a)    b = "{:8}".format("xishi is beautiful")  display(b)

結果如下:

② 什麼是截斷長度?

「{:10.8}」.format(「xishi is beautiful」)中,這個".8"叫做截斷長度,這個10叫做填充長度。

注意:只有字元串的長度大於這個階段長度的時候,才會發生截斷。當既有截斷長度,又有填充長度的時候一般先進行截斷,截斷後再進行填充。

操作如下:

a = "{:.8}".format("xishi is beautiful")  display(a)    # 當字元串長度,小於截斷長度,返回原始字元串,截斷長度無效;  b = "{:.8}".format("abc")  display(b)

結果如下:

③ 填充長度和截斷長度的聯合使用

a = "{:*>15.8}".format("xishi is beautiful")  display(a)

結果如下:

注意:當既有截斷長度,又有填充長度的時候一般先進行截斷,截斷後,再進行填充。

④ 使用%s完成截斷

a = "%.8s" % ("xishi is beautiful")  display(a)    b = "%15.8s" % ("xishi is beautiful")  display(b)

結果如下:

04

格式化輸出中,與數字相關的語法

1)引入案例

a = '{}-{}'.format("1","2")  display(a)    b = '{}-{}'.format(1,2)  display(b)

結果如下:

存在的問題:

format()中明明需要傳入字元串,可是這裡傳入數值,卻沒有報錯,這是為什麼呢?

原因是:python自動幫我們做了一次隱式轉換,但是這種隱式轉換是需要代價的,它會消耗額外的性能,犧牲速度。

因此,我們需要用特定的語法去解決這個問題。

2)填充整數,使用d

① 使用%s完成整數的填充;

a = '%5d' % (3000)  display(a)    b = '%d' % ("3000")  display(b)

結果如下:

② 使用format()完成整數的填充;

a = '{:$>5d}'.format(3000)  display(a)    b = '{:¥>5d}'.format(3000)  display(b)

結果如下:

3)填充浮點數,使用f(這個才是最常用的,用於保留小數點的位數);

① 引入案例

a = '{:f}'.format(3.14159268)  display(a)    b = '{:f}'.format(3.1415921)  display(b)    c = '{:f}'.format(312)  display(c)    d = '{:d}'.format(12,34)  display(d)

結果如下:

存在的問題:

1)當使用的f的時候,不管你傳入的數字有幾個小數位,最終都將返回一個六位數的小數,這個問題源自c語言,你也不用管,自己知道就行。

2)當使用f的時候,可以傳入整數;當使用d的時候,就只能傳入整數,而不能傳入小數。

② 使用%s完成浮點數填充,保留2位有效數字;

a = '%.2f' % (3.1415)  display(a)

結果如下:

③ 使用format()完成浮點數的填充,保留2位有效數字;

b = '{:.2f}'.format(3.1415)  display(b)    c = '{:$>5.2f}'.format(3.1415)  display(c)

結果如下:

注意:在使用浮點數填充的時候,用的最多的就是保留幾位有效數字,由於返回值默認是保留6位小數,因此需要配合使用"截斷"。