python3中format方法_[翻譯]python3中新的字符串格式化方法-----f-string

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

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

python中傳統的字符串格式化方法.

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

占位符+%的方式

str.format()方法

首先復習一下這兩種方式的使用方法以及其短板.

占位符+%的方式

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

但是!!!

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)

?

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

而且不符合python代碼簡潔優雅的人設...

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

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

In [1]: name='Eric'

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

Out[2]: 'Hello,Eric'

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

In [3]: name='Eric'

In [4]: age=18

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

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

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

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

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

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

使用str.format()的方式

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

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

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'

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

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

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

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

「為什么format()方法不是最好的方式」

相比使用占位符+%的方式,format()方法的可讀性已經很高了. 但是同樣的,如果處理含有很多變量的字符串的時候,代碼會變得很冗長.

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

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

f-字符串,一種新的增強型字符串格式化方式

這種新的方式在PEP498中定義.(原文寫到這里的時候,作者可能瘋了,balabla說了一長串,冷靜的我并沒有翻譯這些廢話...)

這種方式也被叫做formatted string literals.格式化的字符串常亮...ummm...應該是這么翻譯吧...

這種方式在字符串開頭的時候,以f標識,然后通過占位符{}+變量名的方式來自動解析對象的__format__方法. 如果想了解的更加詳細,可以參考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'

你以為這就完了嗎?

不!

事情遠不止想象的那么簡單...

在花括號里甚至可以執行算數表達式

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

Out[20]: '74'

如果數學表達式都可以的話,那么在里面執行一個函數應該不算太過分吧...

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'

你以為這就完了嗎?

不!

事情遠不止想象的那么簡單...

這玩意兒甚至可以用于重寫__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.'

?

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

?

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

>>>f"{new_comedian}"

'Eric Idle is 74.'

>>>f"{new_comedian!r}"

'Eric Idle is 74. Surprise!'

更多詳細內容可以參考這里

多個f-字符串占位符

同樣的,我們可以使用多個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.'

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

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

關于f-字符串的速度

f-字符串的f可能代表的含義是fast,因為f-字符串的速度比占位符+%的方式和format()函數的方式都要快.因為它是在運行時計算的表達式而不是常量值.(那為啥就快了呢...不太懂啊...)

?

“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-字符串是一個在運行時參與計算的表達式,而不是像常規字符串那樣是一個常量值)

在運行時,花括號內的表達式在其自己的作用域內求職,單號和字符串的部分拼接到一起,然后返回.

下面我們來看一個速度的對比.

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)

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

0.030868000000000007

0.03721939999999996

0.0173276

f-字符串的一些細節問題

「引號的問題」

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

f"{'Eric Idle'}"

f'{"Eric Idle"}'

f"""Eric Idle"""

f'''Eric Idle'''

以上這幾種引號方式都是支持的. 如果說我們在雙引號中需要再次使用雙引號的時候,就需要進行轉義了.

f"The \"comedian\" is {name}, aged {age}."

「字典的注意事項」

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

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

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

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

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

「花括號」

如果字符串中想使用花括號的話,就要寫兩個花括號來進行轉義. 同理,如果想輸出兩個花括號的話,就要寫四個...

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

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

「反斜杠」

反斜杠可以用于轉義. 但是!!!BUT!!!在f-字符串中,不允許使用反斜杠.

>>>f"{\"Eric Idle\"}"

File "", line 1

f"{\"Eric Idle\"}"

^SyntaxError: f-string expression part cannot include a backslash

像上面這個的解決辦法就是

>>>name = "Eric Idle"

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

「行內注釋」

f-字符串表達式中不允許使用#符號.

總結和參考資料

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

「there should be one– and preferably only one –obvious way to do it.」

(編程還編出哲理來了...實在不會翻,有一種醍醐灌頂的感覺,內心浮現一個聲音,臥槽!好有道理,仿佛自己升華了,但是仔細想想...這句話到底啥意思呢...)

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/394646.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/394646.shtml
英文地址,請注明出處:http://en.pswp.cn/news/394646.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

華為mate40會不會有鴻蒙系統,鴻蒙OS系統正式推送,拿華為Mate40更新后,發現了優缺點...

自從鴻蒙系統正式推送之后,筆者一直都帶著好奇心在體驗著HarmonyOS 2帶來的變化,生怕錯過驚喜,也擔心系統本身會出現不足。因為鴻蒙系統就像是年輕人一樣,才剛剛出爐,需要時間去磨練,然后才能發揮出真正強大…

jstack使用

jstack主要用來查看某個Java進程內的線程堆棧信息,根據堆棧信息我們可以定位到具體代碼,所以它在JVM性能調優中使用得非常多,語法格式如下: jstack [option] pid jstack [option] executable core jstack [option] [server-id]rem…

如何使用TensorFlow對象檢測API播放Quidditch

by Bharath Raj巴拉斯拉吉(Bharath Raj) 如何使用TensorFlow對象檢測API播放Quidditch (How to play Quidditch using the TensorFlow Object Detection API) Deep Learning never ceases to amaze me. It has had a profound impact on several domains, beating benchmarks …

刪除目錄軟鏈接注意事項

2019獨角獸企業重金招聘Python工程師標準>>> 實驗環境: 在root 目錄下創建一個目錄 1 ,并在該目錄下創建一個2.txt 的文件,寫入內容 1.txt: [rootserver ~]# mkdir 1 [rootserver ~]# echo 1.txt > 1/2.txt [rootserver ~]# tree 1 1 └─…

html如何模擬點擊,Javascript 模擬點擊事件(點擊鏈接與html點擊) 兼容IE/Firefox

一把情況下模擬點擊一般兩個方面,模擬點擊超級連接事件firefox的兼容的函數為對HTMLAnchorElement 加入onclick事件try {// create a element so that HTMLAnchorElement is accessibledocument.createElement(a);HTMLElement.prototype.click function () {if (ty…

mvn編寫主代碼與測試代碼

maven編寫主代碼與測試代碼 3.2 編寫主代碼 項目主代碼和測試代碼不同,項目的主代碼會被打包到最終的構件中(比如jar),而測試代碼只在運行測試時用到,不會被打包。默認情況下,Maven假設項目主代碼位于src/…

打印速度快點的打印機_SLM推出了功能強大的新型金屬3D打印機,速度快20倍

德國金屬3D打印機制造商SLM Solutions在Formnext Connect貿易展覽會上推出了功能強大的新系統NXG XII 600。SLM的大幅面機器配備了十二個可同時運行的1 KW激光器,使其速度比該公司自己的單激光SLM 280快20倍。NXG XII 600經過定制設計,可大量生產大型零件…

把轉變為json_如何使用7行JSON將您的網站轉變為移動應用程序

把轉變為jsonby Ethan通過伊桑 將Web引擎融合到本機應用程序的新方法 (A New Approach for Blending Web Engine into Native Apps) What if I told you the 7 lines of JSON above, colored in orange is all you need to turn a website into a mobile app? No need to rew…

1.7Oob 繼承關系中構造方法的使用

1:父類中最好要有一個空參數的構造方法,因為默認的構造方法在自定義了構造方法后就不存在了,需要顯示的寫出來。 若父類中沒有空參數的構造方法,則子類必須有自定義的構造方法,且用super()調用父…

JavaScript浮點運算0.2+0.1 !== 0.3

浮點運算JavaScript 本文主要討論JavaScript的浮點運算,主要包括 JavaScript number基本類型二進制表示十進制浮點數的精度number 數字類型 在JavaScript中,數字只有number這一種類型; var intS 2,floatA 0.1; typeof intS; // number typeof floatA…

html獲取data-*值,html5 獲取和設置data-*屬性值的四種方法講解

1、獲取id的對象2、需要獲取的就是data-id 和 dtat-vice-id的值一:getAttribute()方法const getId document.getElementById(getId);// //getAttribute()取值屬性console.log(getId.getAttribute("data-id"));//console.log(getId.getAttribute("da…

三菱模擬量輸入與輸出程序_初學PLC是學習西門子還是三菱?

PLC的種類繁多,品牌大多分為歐系、日系、美系。德系PLC以西門子為主,日系有三菱、歐姆龍、松下……,美系有羅克韋爾(A-B)通用電氣(GE)公司、莫迪(MODICON)公司等。美國和歐洲的PLC技術是在相互隔離情況下獨立研究開發的,因此美國和…

性能測試十四:Xshell鏈接linux虛擬機

一、先裝一個linux虛擬機 VBoxcentos1、先下載Linux鏡像文件的ovf或者OVA文件2、打開vbox,點擊菜單欄“管理”-“導入虛擬電腦3、選擇解壓路徑中的ovf或者OVA文件,點擊下一步 4、點擊“導入”,等待完成5、導入成功后,選擇新導入的…

代碼編寫工具_我希望在開始編寫代碼時就已經知道的工具:已復習

代碼編寫工具by Mario Hoyos通過馬里奧霍約斯(Mario Hoyos) 我希望在開始編寫代碼時就已經知道的工具:已復習 (Tools I wish I had known about when I started coding: Revisited) A few days ago, I wrote this article for freeCodeCamp which has since gone o…

Hydra掃描姿勢

參數詳解: -R 根據上一次進度繼續破解 -S 使用SSL協議連接 -s 指定端口 -l 指定用戶名 -L 指定用戶名字典(文件) -p 指定密碼破解 -P 指定密碼字典(文件) -e 空密碼探測和指定用戶密碼探測(ns) -C 用戶名可以用:分割(username:password)可以代替-l username -p pass…

html5進度條插件 傳遞參數,Html5進度條插件(自寫)

(function () {window.H5ProgressBar function (obj) {this.height obj.height;this.width obj.width;this.speed obj.speed;};//在界面上布局元素H5ProgressBar.prototype.drawLayout function () {document.write("開始下載")document.write(" ")do…

python合并txt文本_Python實現將目錄中TXT合并成一個大TXT文件的方法

本文實例講述了Python實現將目錄中TXT合并成一個大TXT文件的方法。分享給大家供大家參考。具體如下: 在網上下了一個dota的英雄攻略,TXT格式,每個英雄一個文件,看得疼,就寫了一個小東西,合并一下. #codinggbk import os import sys import glob def dirTxtToLargeTx…

讀取字符串中的數字和小數

package com.jm.label.tools;import java.util.Map;import java.util.TreeMap;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * 讀取字符串中的數字和小數 * author JM.H * */public class DigitUtil { public static String getNumber(String str){ …

html網頁設計要點,網站交互設計的8個要點

一、力求一致性例如網站首頁需要和每一個下級頁面保持一致的風格,導航都要放在屏幕的左上角,具有高度一致性的界面能給人清晰整潔的感覺。二、允許頻繁使用快捷鍵快捷鍵表示產品使用的靈活性和有效性,想想每次我們使用搜索引擎的時候是鼠標點…

行為擴展以及插件機制

在thinkPHP中的行為擴展和插件機制。 首先行為擴展這個概念是TP框架的核心組成之一,關于行為的解釋我就粗略的概括一下吧: TP在從接受到HTTP請求到最終將試圖輸出,期間經歷的很多步驟,這些步驟大家可以在http://document.thinkphp…