1. 程式人生 > 程式設計 >Python3中的f-Strings增強版字串格式化方法

Python3中的f-Strings增強版字串格式化方法

在Python3.6提供f-Strings新的字串格式化語法。不僅更加可讀、簡潔,相比其他方式也不易造成錯誤,而且還更快。
看完本文你將學習到如何以及為什麼使用f-strings。正式開始之前,我們先看看之前格式化字串語法。

1. 舊式字串格式化

在Python3.6之前,主要有兩種方式格式化字串:%-格式化 和 str.format()。下面我們先了解它們的用法以及侷限性。

1.1 %-格式化

這時Python的官方字串格式化方法,從語言開始時就存在。官方文件明確提出不建議使用,並其他使用其他方式代替避免不必要的錯誤。

String物件內建了%操作,用於格式化字串,請看示例:

>>> name = "Eric"
>>> "Hello,%s." % name
'Hello,Eric.'

如果需要插入多個變數,則需要使用元祖:

>>> name = "Eric"
>>> age = 74
>>> "Hello,%s. You are %s." % (name,age)
'Hello Eric. You are 74.'

上面兩個例項還比較好理解,但當使用多個引數,字串變得很長時,可讀性會下降;因為冗長易導致錯誤,故不建議使用。

1.2. 使用 str.format()方法

這種較新的方式是Python2.6版本提供的。是%格式化的升級方式。使用正常的方法呼叫實現字串轉換。其內部通過類的__format__() 方法實現。使用時被替換的地方使用花括號標記。

下面看個示例:

>>> "Hello,{}. You are {}.".format(name,age)
'Hello,Eric. You are 74.'

也可以通過索引方式引用變數:

>>> "Hello,{1}. You are {0}.".format(age,name)
'Hello,Eric. You are 74.'

但如果使用變數名作為引數,而對於值也是物件屬性,則需要在實際引數中傳入物件。

>>> person = {'name': 'Eric','age': 74}
>>> "Hello,{name}. You are {age}.".format(name=person['name'],age=person['age'])
'Hello,Eric. You are 74.'

我們也可以使用**進行簡化字典傳輸:

>>> person = {'name': 'Eric',{name}. You are {age}.".format(**person)
'Hello,Eric. You are 74.'

str.format方式對%格式化進行了有限的升級,但仍不是最好的。當傳入多個引數時,還是很冗餘且易錯。如果字典值傳遞給.format()變數,可以用.format(**some_dict)對其解包,並使用鍵索引對應值,但是有更好的辦法進行處理。

2. 增強版字串格式化方式 f-Strings

f-Strings可以解決上述問題,而且容易使用且十分有效。2015年8月在Python3.6版中提供。
也稱為格式化字串自變數,f開頭的字串中花括號括起來的變數會被替換。該表示式在執行時被評估並使用__format__方法進行格式化。下面看一些示例:

>>> name = "Eric"
>>> age = 74
>>> f"Hello,{name}. You are {age}."
'Hello,Eric. You are 74.'

與str.format()方法類似但更簡潔。使用大寫字元F也行:

>>> F"Hello,Eric. You are 74.'

2.1. 格式化任意表達式

因為f-string是在執行時評估,因此可以放入任何有效Python表示式,這可以實現漂亮的任務。

>>> f"{2 * 37}"
'74'

直接呼叫函式:

>>> def to_lowercase(input):
...  return input.lower()

>>> name = "Eric Idle"
>>> f"{to_lowercase(name)} is funny."
'eric idle is funny.'

乾脆直接呼叫方法:

>>> f"{name.lower()} is funny."
'eric idle is funny.'

當然也可以是自定義類。假設我們定義下面類:

class Comedian:
 def __init__(self,first_name,last_name,age):
  self.first_name = first_name
  self.last_name = last_name
  self.age = age

 def __str__(self):
  return f"{self.first_name} {self.last_name} is {self.age}."

 def __repr__(self):
  return f"{self.first_name} {self.last_name} is {self.age}. Surprise!"

呼叫方法程式碼:

>>> new_comedian = Comedian("Eric","Idle","74")
>>> f"{new_comedian}"
'Eric Idle is 74.'

str() 和 repr() 方法用於實現以字串形式表示物件。所以類定義時確保至少包括它們中的一個。如果需要挑選一個,則為 repr(),因為在使用__str__()的地方都可以使用__repr__()。

由__str__()返回的字串是物件的非正式字串表示,應該是可讀的。由__repr__()返回的字串是官方表示,應該是明確的(外層多了引號,長度是原來長度+2)。直接呼叫str()和repr()比直接使用_str__()和_repr__()要好。

預設情況下使用str函式,但可以使用!r標識明確呼叫repr:

>>> f"{new_comedian}"
'Eric Idle is 74.'
>>> f"{new_comedian!r}"
'Eric Idle is 74. Surprise!'

2.2. 多行f-strings

我們可以格式化多行字串:

>>> name = "Eric"
>>> profession = "comedian"
>>> affiliation = "Monty Python"
>>> message = (
...  f"Hi {name}. "
...  f"You are a {profession}. "
...  f"You were in {affiliation}."
... )
>>> message
'Hi Eric. You are a comedian. You were in Monty Python.'

但需要在每行前面增加f。下面程式碼不工作:

>>> message = (
...  f"Hi {name}. "
...  "You are a {profession}. "
...  "You were in {affiliation}."
... )
>>> message
'Hi Eric. You are a {profession}. You were in {affiliation}.'

我們看到沒有f的行沒有被解析。

對於多行我們也可以使用反斜槓進行換行:

>>> message = f"Hi {name}. " \
...   f"You are a {profession}. " \
...   f"You were in {affiliation}."
...
>>> message
'Hi Eric. You are a comedian. You were in Monty Python.'

但如何使用三個分號“““:

>>> message = f"""
...  Hi {name}. 
...  You are a {profession}. 
...  You were in {affiliation}.
... """
...
>>> message
'\n Hi Eric.\n You are a comedian.\n You were in Monty Python.\n'

3. 總結

本文介紹了Python3.6提供的增強字串格式化方法。通過與之前的兩種方法對比,f-string預設更加簡潔、易讀。

到此這篇關於Python3中的f-Strings增強版字串格式化方法的文章就介紹到這了,更多相關Python格式化字串f-string內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!