當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python String format()用法及代碼示例


字符串 format() 方法將給定的字符串格式化為 Python 中更好的輸出。

用法:

template.format(p0, p1, ..., k0=v0, k1=v1, ...)

這裏,p0, p1,... 是位置參數,k0, k1,... 是關鍵字參數,其值分別為 v0, v1,...

而且,template 是格式代碼與參數占位符的混合。

參數:

format() 方法采用任意數量的參數。但是,分為兩類參數:

  • 位置參數- 可以通過花括號內的參數索引訪問的參數列表{index}
  • 關鍵字參數- key=value 類型的參數列表,可以使用花括號內的參數鍵訪問{key}

返回:

format() 方法返回格式化的字符串。

字符串 format() 如何工作?

format() 讀取傳遞給它的參數類型,並根據字符串中定義的格式代碼對其進行格式化。

對於位置參數

For positional arguments
位置參數

這裏,參數 0 是字符串 "Adam",參數 1 是浮點數 230.2346。

注意:Python 中的參數列表從 0 開始。

字符串"Hello {0}, your balance is {1:9.3f}" 是模板字符串。這包含用於格式化的格式代碼。

花括號隻是要放置的參數的占位符。在上麵的示例中,{0}"Adam" 的占位符,而 {1:9.3f}230.2346 的占位符。

由於模板字符串將 format() 參數表示為 {0}{1} ,因此參數是位置參數。它們都可以在沒有數字的情況下引用,因為 {} 並且 Python 在內部將它們轉換為數字。

在內部,

  • 自從"Adam"是 0th論點,它被放置在{0}.自從,{0}不包含任何其他格式代碼,它不執行任何其他操作。
  • 但是,情況並非如此 1st參數230.2346.這裏,{1:9.3f}地方230.2346在其位置並執行操作 9.3f。
  • f 指定處理浮點數的格式。如果沒有正確指定,它將給出一個錯誤。
  • "." (9) 之前的部分指定數字 (230.2346) 可以采用的最小寬度/填充。在這種情況下,230.2346 至少分配了 9 個位置,包括 "."。
    如果未指定對齊選項,則將其對齊到剩餘空格的右側。 (對於字符串,它左對齊。)
  • "." (3) 之後的部分將小數部分 (2346) 截斷為給定的數字。在這種情況下,2346 在 3 個位置後被截斷。
    剩餘數字 (46) 四舍五入輸出 235。

對於關鍵字參數

Keyword argument
關鍵字參數

我們使用上麵的相同示例來顯示關鍵字和位置參數之間的區別。

在這裏,我們不僅使用了參數,還使用了參數的鍵值對。即 name="Adam"blc=230.2346

由於這些參數被它們的鍵引用為 {name}{blc:9.3f} ,因此它們被稱為關鍵字或命名參數。

在內部,

  • 占位符 {name} 被名稱的值替換 - "Adam"。由於它不包含任何其他格式代碼,因此放置了"Adam"。
  • 對於參數 blc=230.2346,占位符{blc:9.3f}替換為值 230.2346。但是在替換它之前,像前麵的例子一樣,它對其執行 9.3f 操作。
    這輸出 230.235。小數部分在 3 位後被截斷,其餘數字四舍五入。同樣,總寬度被分配為 9,在左側留下兩個空格。

format() 的基本格式設置

format() 方法允許使用簡單的占位符進行格式化。

示例 1:默認、位置和關鍵字參數的基本格式

# default arguments
print("Hello {}, your balance is {}.".format("Adam", 230.2346))

# positional arguments
print("Hello {0}, your balance is {1}.".format("Adam", 230.2346))

# keyword arguments
print("Hello {name}, your balance is {blc}.".format(name="Adam", blc=230.2346))

# mixed arguments
print("Hello {0}, your balance is {blc}.".format("Adam", blc=230.2346))

輸出

Hello Adam, your balance is 230.2346.
Hello Adam, your balance is 230.2346.
Hello Adam, your balance is 230.2346.
Hello Adam, your balance is 230.2346.

注意:在混合參數的情況下,關鍵字參數必須始終跟隨位置參數。

使用format() 格式化數字

您可以使用下麵給出的格式說明符來格式化數字:

數字格式類型
類型 意義
d 十進製整數
c 對應的 Unicode 字符
b 二進製格式
o 八進製格式
x 十六進製格式(小寫)
X 十六進製格式(大寫)
n 與'd' 相同。除了它使用當前區域設置作為數字分隔符
e index 符號。 (小寫字母 e)
E index 符號(大寫 E)
f 顯示定點編號(默認值:6)
F 與'f' 相同。除了將 'inf' 顯示為 'INF' 和 'nan' 顯示為 'NAN'
g 一般格式。將數字四舍五入為 p 個有效數字。 (默認精度:6)
G 與'g' 相同。如果數量很大,則切換到 'E' 除外。
% 百分比。乘以 100 並將 % 放在末尾。

示例 2:簡單的數字格式

# integer arguments
print("The number is:{:d}".format(123))

# float arguments
print("The float number is:{:f}".format(123.4567898))

# octal, binary and hexadecimal format
print("bin: {0:b}, oct: {0:o}, hex: {0:x}".format(12))

輸出

The number is: 123
The number is:123.456790
bin: 1100, oct: 14, hex: c

示例 3:使用 int 和 float 填充的數字格式

# integer numbers with minimum width
print("{:5d}".format(12))

# width doesn't work for numbers longer than padding
print("{:2d}".format(1234))

# padding for float numbers
print("{:8.3f}".format(12.2346))

# integer numbers with minimum width filled with zeros
print("{:05d}".format(12))

# padding for float numbers filled with zeros
print("{:08.3f}".format(12.2346))

輸出

   12
1234
  12.235
00012
0012.235

這裏,

  • 在第一條語句中,{:5d} 采用整數參數並指定最小寬度為 5。由於未指定對齊方式,因此它向右對齊。
  • 在第二個語句中,您可以看到寬度 (2) 小於數字 (1234),因此它不會向左占用任何空間,但也不會截斷數字。
  • 與整數不同,浮點數同時具有整數和小數部分。並且,定義為數字的最小寬度適用於整個兩個部分,包括".".
  • 在第三個語句中,{:8.3f} 將小數部分截斷為 3 位,將最後 2 位四舍五入。而且,這個數字現在是 12.235,整體寬度為 8,向左留出 2 個位置。
  • 如果您想用零填充剩餘的位置,請在格式說明符之前放置一個零。它適用於整數和浮點數:{:05d}{:08.3f}

示例 4:有符號數字的數字格式

# show the + sign
print("{:+f} {:+f}".format(12.23, -12.23))

# show the - sign only
print("{:-f} {:-f}".format(12.23, -12.23))

# show space for + sign
print("{: f} {: f}".format(12.23, -12.23))

輸出

+12.230000 -12.230000
12.230000 -12.230000
 12.230000 -12.230000

帶對齊的數字格式

運算符<, ^, > and = 在為數字分配一定寬度時用於對齊。

帶對齊的數字格式
類型 意義
< 與剩餘空間左對齊
^ 中心對齊到剩餘空間
> 與剩餘空間右對齊
= 強製帶符號 (+) (-) 到最左邊的位置

示例 5:具有左對齊、右對齊和居中對齊的數字格式

# integer numbers with right alignment
print("{:5d}".format(12))

# float numbers with center alignment
print("{:^10.3f}".format(12.2346))

# integer left alignment filled with zeros
print("{:<05d}".format(12))

# float numbers with center alignment
print("{:=8.3f}".format(-12.2346))

輸出

   12
  12.235  
12000
- 12.235

注意:用零填充整數的左對齊可能會導致問題,如第三個示例,它返回 12000,而不是 12。

使用format() 格式化字符串

作為數字,可以使用與 format() 類似的方式格式化字符串。

示例 6:使用填充和對齊的字符串格式化

# string padding with left alignment
print("{:5}".format("cat"))

# string padding with right alignment
print("{:>5}".format("cat"))

# string padding with center alignment
print("{:^5}".format("cat"))

# string padding with center alignment
# and '*' padding character
print("{:*^5}".format("cat"))

輸出

cat  
  cat
 cat 
*cat*

示例 7:使用 format() 截斷字符串

# truncating strings to 3 letters
print("{:.3}".format("caterpillar"))

# truncating strings to 3 letters
# and padding
print("{:5.3}".format("caterpillar"))

# truncating strings to 3 letters,
# padding and center alignment
print("{:^5.3}".format("caterpillar"))

輸出

cat
cat  
 cat 

使用 format() 格式化類和字典成員

Python 在內部使用 getattr() 作為類成員,格式為 ".age"。並且,它使用__getitem__() 查找字典成員,格式為"[index]"。

示例 8:使用 format() 格式化類成員

# define Person class
class Person:
    age = 23
    name = "Adam"

# format age
print("{p.name}'s age is: {p.age}".format(p=Person()))

輸出

Adam's age is: 23

在這裏,Person 對象作為關鍵字參數 p 傳遞。

在模板字符串中,Person 的 nameage 分別使用 .name.age 訪問。

示例 9:使用 format() 格式化字典成員

# define Person dictionary
person = {'age': 23, 'name': 'Adam'}

# format age
print("{p[name]}'s age is: {p[age]}".format(p=person))

輸出

Adam's age is: 23

與類類似,person 字典作為關鍵字參數 p 傳遞。

在模板字符串中,人員的nameage 分別使用[name][age] 訪問。

使用 str.format(**mapping) 在 Python 中格式化字典有一種更簡單的方法。

# define Person dictionary
person = {'age': 23, 'name': 'Adam'}

# format age
print("{name}'s age is: {age}".format(**person))

** 是格式參數(最小字段寬度)。

使用 format() 將參數作為格式代碼

您還可以動態傳遞格式代碼,如精度、對齊、填充字符作為位置或關鍵字參數。

示例 10:使用 format() 進行動態格式化

# dynamic string format template
string = "{:{fill}{align}{width}}"

# passing format codes as arguments
print(string.format('cat', fill='*', align='^', width=5))

# dynamic float format template
num = "{:{align}{width}.{precision}f}"

# passing format codes as arguments
print(num.format(123.236, align='<', width=8, precision=2))

輸出

*cat*
123.24  

這裏,

  • 在第一個示例中,'cat' 是要格式化的位置參數。同樣,fill='*' , align='^'width=5 是關鍵字參數。
  • 在模板字符串中,這些關鍵字參數不是作為要打印的普通字符串檢索的,而是作為實際的格式代碼檢索的fill, align and width.
    參數替換了相應的命名占位符,並且字符串'cat' 被相應地格式化。
  • 同樣,在第二個示例中,123.236 是位置參數,對齊、寬度和精度作為格式代碼傳遞給模板字符串。

format() 的額外格式化選項

format() 還支持 type-specific 格式選項,例如日期時間和複數格式。

format() 內部調用 __format__() 獲取日期時間,而 format() 訪問複數的屬性。

您可以輕鬆地覆蓋任何對象的__format__() 方法以進行自定義格式設置。

示例 11:使用 format() 格式化 Type-specific 並覆蓋 __format__() 方法

import datetime
# datetime formatting
date = datetime.datetime.now()
print("It's now: {:%Y/%m/%d %H:%M:%S}".format(date))

# complex number formatting
complexNumber = 1+2j
print("Real part: {0.real} and Imaginary part: {0.imag}".format(complexNumber))

# custom __format__() method
class Person:
    def __format__(self, format):
        if(format == 'age'):
            return '23'
        return 'None'

print("Adam's age is: {:age}".format(Person()))

輸出

It's now: 2016/12/02 04:16:28
Real part: 1.0 and Imaginary part: 2.0
Adam's age is: 23

這裏,

  • 對於日期時間:
    當前日期時間作為位置參數傳遞給format()方法。
    並且,內部使用__format__()方法,format()訪問年、月、日、小時、分鍾和秒。
  • 對於複數:
    1+2j 在內部轉換為 ComplexNumber 對象。
    然後訪問它的屬性realimag,數字被格式化。
  • 覆蓋__format__():
    像日期時間一樣,您可以覆蓋自己的__format__()自定義格式的方法,在訪問時返回年齡{:age}

您還可以使用帶有速記符號的對象的 __str__()__repr__() 函數使用 format()

__format__() 一樣,您可以輕鬆地覆蓋對象的 __str__()__repr_() 方法。

示例 12:__str()__ 和 __repr()__ 簡寫 !r 和 !s 使用 format()

# __str__() and __repr__() shorthand !r and !s
print("Quotes: {0!r}, Without Quotes: {0!s}".format("cat"))

# __str__() and __repr__() implementation for class
class Person:
    def __str__(self):
        return "STR"
    def __repr__(self):
        return "REPR"

print("repr: {p!r}, str: {p!s}".format(p=Person()))

輸出

Quotes: 'cat', Without Quotes: cat
repr: REPR, str: STR

相關用法


注:本文由純淨天空篩選整理自 Python String format()。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。