前言在Python中,字符串的列印大家都知道是用print函數,如果在字符串中嵌有其它變量的話,一般我們有兩種方式來處理,一是最原始的將字符串、變量分別作為print的參數,一一列寫;一種是將{}佔位符在字符串應該嵌入變量的位置提前插入,並用.format()格式函數將對應的變量一一附於其後,比如:
name = "小旺"print("你好!", name, "!")print("你好! {} !".format(name))從形式上來說,format顯得更有規律一些,但對於程序中經常列印一些調試信息而言,它又過於正式而顯得有些臃腫,從Python3.6開始,Python中提供一種輕量級的格式化字符方式,由於它是以f字符開始,所以我們稱之為f-字符串。這一篇我們就來對進行介紹。
變量、表達式在字符串中的插補讓我們從一些最簡單的例子入手來看看f-字符串的簡單用法,通常要定義一個f-字符串,需要以f開頭,並將變量用一對{}框起來,比如:name = "花花"f"你好!{name}!"
>>> 輸出:'你好!花花!'
student_id = 23f"我的學號是:{student_id}"
>>> 輸出:'我的學號是:23'如果用.format來表示上述兩個例子,則是這樣的:"你好!{}!".format(name)"我的學號是:{}".format(student_id)相較之下,f-字符串比.format格式還是顯得輕盈許多,下面繼續給出例子:fruit = ["蘋果", "香蕉", "梨子", "桃子"]f"水果:{fruit}"
>>> 輸出:"水果:['蘋果', '香蕉', '梨子', '桃子']"
grades = {"小明":100, "花花":80}f"成績:{grades}"
>>> 輸出:"成績:{'小明': 100, '花花': 80}"從以上代碼可以看出,在f-字符串{}中的變量會將其原本的數據類型完全展現,這樣我們可以很方便地訪問其中的一個或一些數據,比如:f"我喜歡的水果:{fruit[-1]}"
>>> 輸出:'我喜歡的水果:桃子'number = 7f"{number}的平方是{number*number}"
>>> 輸出:'7的平方是49'在使用python的時候,我們經常需要自定義一些類,下面我們來看看由自定義類創建的對象在f-字符串的表現:class Student: def __init__(self, name, age): self.name = name self.age = age student = Student("小明", 10)print(f"Student: {student}")
>>> 輸出:Student: <__main__.Student object at 0x0000018B299EB160>從上述列印結果來看,只列印了變量student是Student對象,並沒有顯示出該學生變量的名字和年齡,這不是我們想要的結果,那麼能不能不改變print語句,只修改Student類來達到我們的目的呢?答案是肯定的,下面來升級一下Student類:class Student: def __init__(self, name, age): self.name = name self.age = age def __str__(self): print("__str__被調用:") return f"姓名:{self.name},年齡:{self.age}" student = Student("小明", 10)print(f"Student: {student}")
>>> 輸出:__str__被調用:Student: 姓名:小明,年齡:10這樣就達到了我們的目的,仔細觀察上述類,會發現我們為其增加了一個__str__方法,該方法主要是當要顯示由該類創建的對象時,自動觸發的,比如print函數是列印函數,在列印由Student類創建的對象時,__str__就被自動調用了。事實上,在內置的整數、字典等類型中,都有該方法的身影。數據轉換與__str__()功能相似的是__repr__()函數,用後者調用變量的方式叫數據轉換,__repr__或repr()是Python的內置函數,它主要是將變量轉換成可列印的字符串,通常它是用在交互式的解釋器中,比如:ages = {"小花":10, "小明":11}ages
>>> 輸出:{'小花': 10, '小明': 11}在這段代碼中,解釋器就調用的是__repr__來列印變量ages的,我們可以顯式調用:repr(ages)ages.__repr__()
>>> 輸出:"{'小花': 10, '小明': 11}""{'小花': 10, '小明': 11}"當然,在我們自定義的類中,同樣可以重載__repr__函數:class Student: def __init__(self, name, age): self.name = name self.age = age def __str__(self): print("__str__被調用:") return f"姓名:{self.name},年齡:{self.age}" def __repr__(self): print("__repr__被調用:") return f"姓名:{self.name},年齡:{self.age}"
student = Student("小明", 10)student
>>> 輸出:__repr__被調用:姓名:小明,年齡:10很明顯,在我們為Student類定義了__repr__時,直接在交互式解釋器中輸入student,就可以觸發__repr__函數,否則只會列印出該對象屬於Student類。下面我們用f-字符串來調用一下這兩個重載的函數:print(f"Student str: {student!s} Student repr: {student!r}")
>>> 輸出:__str__被調用:__repr__被調用:Student str: 姓名:小明,年齡:10 Student repr: 姓名:小明,年齡:10同學們可能注意到,在訪問變量的__repr__時,我們用了!r,在訪問__str__時,我們用了!s,採用 這兩個特別的符號,可以訪問變量對應的函數。多行字符串我們在列印字符串時,經常會用到換行操作,通常情況下都是用\n來進行分割,f-字符串也支持這樣的操作,但也有屬於自已的獨特的三點式操作,下面展示兩種風格:name = "花花"print(f"**********\n{name}\n**********")
>>> 輸出:**********花花**********
print(f'''**********... {name}... **********''')
>>> 輸出:**********花花**********關於「三點」操作符是要在三引號中進行的,並且要有手動換行操作,才能實現,請同學們測試時注意。數字和字符串格式在對數字進行輸出時,經常會有一些常用的格式化操作,下面演示一下這類情況:big_number = 987654321987612345f"{big_number:_d}"
>>> 輸出:'987_654_321_987_612_345'
more_digits = 3.1415926print(f"2位小數:{more_digits:.2f}\n4位小數:{more_digits:.4f}")
>>> 輸出:2位小數:3.144位小數:3.1416sci_number = 0.00000043234f"number: {sci_number:e}"
>>> 輸出:'number: 4.323400e-07'在實際列印字符串的過程中,經常會用到一些對齊操作,f-字符串同樣對這些進行了有力的支持,對於對齊操作,<、>、^分別對應了左對齊、右對齊和居中操作,下面給出一些例子:s0, s1 = 'a', 'ab'
print(f"{s0:*<7}\n{s1:*<7}")>>> 輸出:a******ab*****
print(f"{s0:%>10}\n{s1:%>10}")>>> 輸出:%%%%%%%%%a%%%%%%%%ab
print(f"{s0:@^10}\n{s1:@^10}")>>> 輸出:@@@@a@@@@@@@@@ab@@@@print(f"{'Hello'\n'World'}")小結在這篇文章中,我們介紹了f-字符串操作,它是一種功能相當強大且靈活的字符串處理方式,學會使用這個方法,將使得我們在調用print時顯得相當方便。