亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

一文了解python 3 字符串格式化 F-string 用法

 更新時(shí)間:2020年03月04日 07:40:59   作者:吾碼  
本文介紹在python 3 編程中,如何進(jìn)行字符串格式化。介紹了F-string的用法,通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的工作或?qū)W習(xí)具有一定的參考借鑒價(jià)值,需要的朋友參考下吧

從python3.6開始,引入了新的字符串格式化方式,f-字符串. 這使得格式化字符串變得可讀性更高,更簡潔,更不容易出現(xiàn)錯(cuò)誤而且速度也更快.

在Python 3.6之前,有兩種將Python表達(dá)式嵌入到字符串文本中進(jìn)行格式化的主要方法:%-formatting和str.format()。

在本文后面,會詳細(xì)介紹f-字符串的用法. 在此之前,讓我們先來復(fù)習(xí)一下python中字符串格式化的方法.

python中傳統(tǒng)的字符串格式化方法.

在python3.6之前,我們有兩種方式可以用來格式化字符串.

  • 占位符+%的方式
  • str.format()方法

首先復(fù)習(xí)一下這兩種方式的使用方法以及其短板.

占位符+%的方式

這種方式算是第0代字符串格式化的方法,很多語言都支持類似的字符串格式化方法. 在python的文檔中,我們也經(jīng)常看到這種方式.

但是!!! BUT!!!

占位符+%的方式并不是python推薦的方式.

Note The formatting operations described here exhibit a variety of quirks that lead to a number of common errors (such as failing to display tuples and dictionaries correctly). Using the newer formatted string literals, the str.format() interface, or template strings may help avoid these errors. Each of these alternatives provides their own trade-offs and benefits of simplicity, flexibility, and/or extensibility.(Python3 doc)

文檔中也說了,這種方式對于元組等的顯示支持的不夠好. 而且很容易產(chǎn)生錯(cuò)誤.

而且不符合python代碼簡潔優(yōu)雅的人設(shè)...

「如何使用占位符+%的方式」

如果你接觸過其他的語言,這種方式使用起來會有一種詭異的親切感,這種親切感會讓你抓狂,內(nèi)心會暗暗的罵上一句,艸,又是這德行...(這句不是翻譯,是我的個(gè)人感覺,從來都記不住那么多數(shù)據(jù)類型的關(guān)鍵字...)

In [1]: name='Eric'

In [2]: 'Hello,%s'%name

Out[2]: 'Hello,Eric'

如果要插入多個(gè)變量的話,就必須使用元組.像這樣

In [3]: name='Eric'

In [4]: age=18

In [5]: 'Hello %s,you are %d.'%(name,age)

Out[5]: 'Hello Eric,you are 18.'


「為什么說占位符+%的方式不是最好的辦法(個(gè)人認(rèn)為是這種方式是一種最操蛋的操作)」

上面有少量的變量需要插入到字符串的時(shí)候,這種辦法還行. 但是一旦有很多變量需要插入到一個(gè)長字符串中...比如...

In [6]: first_name = "Eric"
 ...: last_name = "Idle"
 ...: age = 74
 ...: profession = "comedian"
 ...: affiliation = "Monty Python"


In [7]: "Hello, %s %s. You are %s. You are a %s. You were a member of %s." % (first_name, last_name, age, profession, affiliation)

Out[7]: 'Hello, Eric Idle. You are 74. You are a comedian. You were a member of Monty Python.'


像上面這個(gè)例子,代碼可讀性就很差了.(對讀和寫的人都是一種折磨...)

使用str.format()的方式

在python2.6之后,引入了str.format()函數(shù),可以用來進(jìn)行字符串的格式化. 它通過調(diào)用對象的__format__()方法(PEP3101中定義)來將對象轉(zhuǎn)化成字符串.

在str.format()方法中,通過花括號占位的方式來實(shí)現(xiàn)變量插入.

In [8]: 'hello,{}. You are {}.'.format(name,age)

Out[8]: 'hello,Eric. You are 74.'

甚至可以給占位符加索引.

In [9]: 'hello,{1}. You are {0}.'.format(age,name)

Out[9]: 'hello,Eric. You are 74.'

如果要在占位符中使用變量名的話,可以像下面這樣

In [10]: person={'name':'Eric','age':74}

In [11]: 'hello,{name}. you are {age}'.format(name=person['name'],age=person['age'])

Out[11]: 'hello,Eric. you are 74'

當(dāng)然對于字典來說的話,我們可以使用**的小技巧.

In [15]: 'hello,{name}. you are {age}'.format(**person)

Out[15]: 'hello,Eric. you are 74'

str.format()方法對于%的方式來說已經(jīng)是一種很大的提升了. 但是這并不是最好的方式.

「為什么format()方法不是最好的方式」 相比使用占位符+%的方式,format()方法的可讀性已經(jīng)很高了. 但是同樣的,如果處理含有很多變量的字符串的時(shí)候,代碼會變得很冗長.

>>> first_name = "Eric"

>>> last_name = "Idle"

>>> age = 74

>>> profession = "comedian"

>>> affiliation = "Monty Python"

>>> print(("Hello, {first_name} {last_name}. You are {age}. " +

>>>  "You are a {profession}. You were a member of {affiliation}.") \

>>>  .format(first_name=first_name, last_name=last_name, age=age, \

>>>    profession=profession, affiliation=affiliation))
'Hello, Eric Idle. You are 74. You are a comedian. You were a member of Monty Python.'


當(dāng)然,我們也可以通過字典的方式直接傳入一個(gè)字典來解決代碼過長的問題. 但是,python3.6給我們提供了更便利的方式.

f-字符串,一種新的增強(qiáng)型字符串格式化方式

這種新的方式在PEP498中定義.(原文寫到這里的時(shí)候,作者可能瘋了,balabla說了一長串,冷靜的我并沒有翻譯這些廢話...) 這種方式也被叫做formatted string literals.格式化的字符串常亮...ummm...應(yīng)該是這么翻譯吧...

這種方式在字符串開頭的時(shí)候,以f標(biāo)識,然后通過占位符{}+變量名的方式來自動解析對象的__format__方法. 如果想了解的更加詳細(xì),可以參考python文檔

一些簡單的例子

「使用變量名作為占位符」

In [16]: name = 'Eric'

In [17]: age=74

In [18]: f'hello {name}, you are {age}'

Out[18]: 'hello Eric, you are 74'

「這里甚至可以使用大寫的F」

In [19]: F'hello {name}, you are {age}'

Out[19]: 'hello Eric, you are 74'

你以為這就完了嗎?

不!

事情遠(yuǎn)不止想象的那么簡單...

在花括號里甚至可以執(zhí)行算數(shù)表達(dá)式

In [20]: f'{2*37}'

Out[20]: '74'

如果數(shù)學(xué)表達(dá)式都可以的話,那么在里面執(zhí)行一個(gè)函數(shù)應(yīng)該不算太過分吧...

In [22]: def to_lowercase(input):
 ...:  return input.lower()
 ...:

In [23]: name = 'ERIC IDLE'

In [24]: f'{to_lowercase(name)} is funny'

Out[24]: 'eric idle is funny'

你以為這就完了嗎?

不!

事情遠(yuǎn)不止想象的那么簡單...

這玩意兒甚至可以用于重寫__str__()和__repr__()方法.

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.'

關(guān)于__str__()方法和__repr__()方法. 這是對象的兩個(gè)內(nèi)置方法.__str()__方法用于返回一個(gè)便于人類閱讀的字符串. 而__repr__()方法返回的是一個(gè)對象的準(zhǔn)確釋義. 這里暫時(shí)不做過多介紹. 如有必要,請關(guān)注公眾號吾碼2016(公眾號:wmcoding)并發(fā)送str_And_repr

默認(rèn)情況下,f-關(guān)鍵字會調(diào)用對象的__str__()方法. 如果我們想調(diào)用對象的__repr__()方法的話,可以使用!r

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

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

更多詳細(xì)內(nèi)容可以參考這里

多個(gè)f-字符串占位符

同樣的,我們可以使用多個(gè)f-字符串占位符.

>>> 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.'

但是別忘了,在每一個(gè)字符串前面都要寫上f

同樣的,在字符串換行的時(shí)候,每一行也要寫上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.'

但是如果我們使用"""的時(shí)候,不需要每一行都寫.

>>> 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'

關(guān)于f-字符串的速度

f-字符串的f可能代表的含義是fast,因?yàn)閒-字符串的速度比占位符+%的方式和format()函數(shù)的方式都要快.因?yàn)樗窃谶\(yùn)行時(shí)計(jì)算的表達(dá)式而不是常量值.(那為啥就快了呢...不太懂啊...)

❝ “F-strings provide a way to embed expressions inside string literals, using a minimal syntax. It should be noted that an f-string is really an expression evaluated at run time, not a constant value. In Python source code, an f-string is a literal string, prefixed with f, which contains expressions inside braces. The expressions are replaced with their values.”(PEP498)

(官方文檔,咱不敢翻,大意就是f-字符串是一個(gè)在運(yùn)行時(shí)參與計(jì)算的表達(dá)式,而不是像常規(guī)字符串那樣是一個(gè)常量值)

在運(yùn)行時(shí),花括號內(nèi)的表達(dá)式在其自己的作用域內(nèi)求職,單號和字符串的部分拼接到一起,然后返回.

下面我們來看一個(gè)速度的對比.

import timeit

time1 = timeit.timeit("""name = 'Eric'\nage =74\n'%s is %s'%(name,age)""",number=100000)
time2 = timeit.timeit("""name = 'Eric'\nage =74\n'{} is {}'.format(name,age)""",number=100000)
time3 = timeit.timeit("""name = 'Eric'\nage =74\nf'{name} is {age}'""",number=100000)

從結(jié)果上看的話,f-字符串的方式速度要比其他兩種快.

0.030868000000000007
0.03721939999999996
0.0173276

f-字符串的一些細(xì)節(jié)問題

「引號的問題」 在f-字符串中,注意成對的引號使用.

f"{'Eric Idle'}"
f'{"Eric Idle"}'
f"""Eric Idle"""
f'''Eric Idle'''

以上這幾種引號方式都是支持的. 如果說我們在雙引號中需要再次使用雙引號的時(shí)候,就需要進(jìn)行轉(zhuǎn)義了. f"The \"comedian\" is {name}, aged {age}."

「字典的注意事項(xiàng)」

在字典使用的時(shí)候,還是要注意逗號的問題.

>>> comedian = {'name': 'Eric Idle', 'age': 74}

>>> f"The comedian is {comedian['name']}, aged {comedian['age']}."

>>> f'The comedian is {comedian['name']}, aged {comedian['age']}.'

比如上面兩條語句,第三句就是有問題的,主要還是引號引起的歧義.

「花括號」 如果字符串中想使用花括號的話,就要寫兩個(gè)花括號來進(jìn)行轉(zhuǎn)義. 同理,如果想輸出兩個(gè)花括號的話,就要寫四個(gè)...

>>> f"{{74}}"'{74}'

>>> f"{{{{74}}}}"

「反斜杠」 反斜杠可以用于轉(zhuǎn)義. 但是!!!BUT!!!在f-字符串中,不允許使用反斜杠.

>>> f"{\"Eric Idle\"}"
 File "<stdin>", line 1
 f"{\"Eric Idle\"}"
      ^SyntaxError: f-string expression part cannot include a backslash

像上面這個(gè)的解決辦法就是

>>> name = "Eric Idle"

>>> f"{name}"'Eric Idle'

「行內(nèi)注釋」 f-字符串表達(dá)式中不允許使用#符號.

總結(jié)和參考資料

我們依舊可以使用老的方式進(jìn)行字符串格式化輸出. 但是通過f-字符串,我們現(xiàn)在有了一種更便捷,更快,可讀性更高的方式. 根據(jù)python教義,Zen of Python:

「there should be one– and preferably only one –obvious way to do it.」 (編程還編出哲理來了...實(shí)在不會翻,有一種醍醐灌頂?shù)母杏X,內(nèi)心浮現(xiàn)一個(gè)聲音,臥槽!好有道理,仿佛自己升華了,但是仔細(xì)想想...這句話到底啥意思呢...)

更多的參考資料(我也只是寫在這里,反正我是沒有閑心看它的...):

PEP502:String Interpolation - Extended Discussion

PEP 536:Final Grammar for Literal String Interpolation

到此這篇關(guān)于一文了解python 3 字符串格式化 F-string 用法的文章就介紹到這了,更多相關(guān)python字符串格式化f-string內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python數(shù)據(jù)分析之?Matplotlib?散點(diǎn)圖繪制

    Python數(shù)據(jù)分析之?Matplotlib?散點(diǎn)圖繪制

    這篇文章主要介紹了Python數(shù)據(jù)分析之?Matplotlib?散點(diǎn)圖繪制,散點(diǎn)圖又稱散點(diǎn)圖,是使用多個(gè)坐標(biāo)點(diǎn)的分布反映數(shù)據(jù)點(diǎn)分布規(guī)律、數(shù)據(jù)關(guān)聯(lián)關(guān)系的圖表,下文對散點(diǎn)圖的詳細(xì)介紹及繪制,需要的小伙伴可以參考以一下
    2022-05-05
  • python subprocess pipe 實(shí)時(shí)輸出日志的操作

    python subprocess pipe 實(shí)時(shí)輸出日志的操作

    這篇文章主要介紹了python subprocess pipe 實(shí)時(shí)輸出日志的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Python為人臉照片添加口罩實(shí)戰(zhàn)

    Python為人臉照片添加口罩實(shí)戰(zhàn)

    本文主要介紹了Python為人臉照片添加口罩實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 使用70行Python代碼實(shí)現(xiàn)一個(gè)遞歸下降解析器的教程

    使用70行Python代碼實(shí)現(xiàn)一個(gè)遞歸下降解析器的教程

    這篇文章主要介紹了使用70行Python代碼實(shí)現(xiàn)一個(gè)遞歸下降解析器的教程,文章分步講解最后整合出代碼,需要的朋友可以參考下
    2015-04-04
  • Python爬蟲之Selenium中frame/iframe表單嵌套頁面

    Python爬蟲之Selenium中frame/iframe表單嵌套頁面

    這篇文章主要介紹了Python爬蟲之Selenium中frame/iframe表單嵌套頁面,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Python3+cgroupspy安裝使用簡介

    Python3+cgroupspy安裝使用簡介

    cgroups是Control groups的簡稱,是Linux內(nèi)核提供的一種限制進(jìn)程使用和種系統(tǒng)資源的特性,這篇文章主要介紹了Python3+cgroupspy安裝使用教程,需要的朋友可以參考下
    2023-04-04
  • 老生常談python的私有公有屬性(必看篇)

    老生常談python的私有公有屬性(必看篇)

    下面小編就為大家?guī)硪黄仙U刾ython的私有公有屬性(必看篇)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • python 字典item與iteritems的區(qū)別詳解

    python 字典item與iteritems的區(qū)別詳解

    這篇文章主要介紹了python 字典item與iteritems的區(qū)別詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • yolov5調(diào)用usb攝像頭及本地?cái)z像頭的方法實(shí)例

    yolov5調(diào)用usb攝像頭及本地?cái)z像頭的方法實(shí)例

    YOLOV5模型從發(fā)布到現(xiàn)在都是炙手可熱的目標(biāo)檢測模型,被廣泛運(yùn)用于各大場景之中,下面這篇文章主要給大家介紹了關(guān)于yolov5調(diào)用usb攝像頭及本地?cái)z像頭的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • numpy.where() 用法詳解

    numpy.where() 用法詳解

    這篇文章主要介紹了numpy.where() 用法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05

最新評論