詳解Python中的str.format方法
字串的內建方法大致有40來個,但是一些常用的其實就那麼20幾個,而且裡面還有類似的用法,區分度高比如:isalpha,isalnum,isdigit,還有一些無時不刻都會用到的split切分,join拼接,strip首尾去指定字元,作用無非就是圍繞字串的增刪改查來進行,本人認為要弄清楚和熟練使用這些常用的方法,一方面需要在理解的基礎上多多練習多多回顧,同時在工作使用中去鞏固,加深記憶。忘記沒關係,善於總結歸納,善於對自己大腦記憶的‘增刪改查’才是重點。
str.format的意義:
作為一個初學者,最近發現字串中最繁雜的一個方法莫過於:str.format()了,format見名思義,格式化,格式化完為了幹嘛,其實就是為了得到我們需要格式的資料,也就是格式化輸出,格式化輸出我們一開始學習的是用%s、%d來實現,但是這種方法有很多侷限性,比如%s是按照位置格式化輸出,侷限性顯而易見,如果一次性格式化輸出太多,還是根據位置來輸出的話就太容易出錯了。所以更精確的一種格式化輸出方法就是str.format()
str.format方法介紹:
1、透過字串中的花括號{}來識別替換欄位,從而完成字串的格式化。
2、替換的內容包括:欄位名、格式說明符三部分,形式一般為:{欄位名:格式說明符}
以上是簡介,下面是乾貨:
具體實現:
1、簡單實現方法:
(1)省略不寫{} ____寫法類似%s按位置格式化輸出
(2)數字{十進位制非負整數} ____寫法類似依據位置索引傳參
(3)變數名{關鍵字} ____寫法類似關鍵字引數傳參
(4)可以混合使用
1.1 省略不寫:花括號內省略不寫,代表傳遞位置引數
替換欄位形式{}
注意事項:花括號個數少於等於後面的位置引數的個數,多了肯定報錯。
# 用{}代表佔位符,直接位置傳參 print('我是{},喜歡{}!'.format('滅霸','打響指')) # 我是滅霸,喜歡打響指! # {}數量必須少於後面位置引數數量,不然報錯 print('我是{},喜歡{},不喜歡{}。'.format('宙斯','放大搶人頭','放空大','小短腿')) print('我是{},喜歡{},不喜歡{}。'.format('宙斯','放大搶人頭')) # 報錯誤:IndexError: tuple index out of range
1.2 數字形式傳參:透過位置索引值傳遞位置引數
索引從整數0開始
索引可以重複引用,輸出
索引數值就是後面位置引數放入一個元組來取值的過程,所以索引數值不能大於元組裡面位置引數的最大索引值,否則報錯
print('我身高{0},年齡正好{1},{2}長。'.format('180cm',18,'15cm')) # 我身高180cm,年齡正好18,15cm長。 print('我身高{0},{0}不多不少,年齡正好{1}。'.format('180cm',18)) # 我身高180cm,180cm不多不少,年齡正好18。 print('我身高{0},年齡正好{1},{2}長。'.format('180cm',18)) # IndexError: tuple index out of range
1.3 變數名{關鍵字} 傳遞輸出引數
想想關鍵字引數怎麼傳參,類比一下,bingo!
特別注意,關鍵字的變數名在引數那裡無需加引號,同時{}裡面引用直接填變數名。
print('我的名字叫{name},我其實是一名{career}!'.format(name='尹天仇',career='演員')) # 我的名字叫尹天仇,我其實是一名演員! print('我叫{name2},又名{name1},我弟弟叫{name3}!'.format(name1='至尊寶',name2='秦漢',name3='秦祥林')) # 我叫秦漢,又名至尊寶,我弟弟叫秦祥林!
1.4 {}、{0}、{name}混合使用
位置引數在前,關鍵字引數在後
{}不能與數字形式{0}同時使用。
print('吹個{0},吹個{2},吹大了{1},玩{ball}!'.format('球','氣球','大氣球',ball='球球')) # 吹個球,吹個大氣球,吹大了氣球,玩球球! print('吹個{},吹大了{},玩{ball}!'.format('球','氣球','大氣球',ball='球球')) # 吹個球,吹大了氣球,玩球球! print('吹個{0},吹大了{1},玩{ball}!'.format('球','氣球','大氣球',ball='球球')) # 吹個球,吹大了氣球,玩球球! print('吹個{0},吹大了{},玩{ball}!'.format('球','氣球','大氣球',ball='球球')) #報錯 ValueError: cannot switch from manual field specification to automatic field numbering
2、使用元組和字典傳參:
str.format()方法可以使用*元組和**字典的形式傳參,可以混用。
方法相當於*args和**kwargs打散傳參,元組按位置或索引傳參,字典按關鍵字傳參。
位置引數、關鍵字引數、*元組、**字典也可以同時使用,但要注意位置引數在關鍵字引數前,*元組要在**字典前。
# 元組 print('我喜歡{},喜歡{},同時也喜歡{}!'.format(*('籃球','足球','觀球'))) # 我喜歡籃球,喜歡足球,同時也喜歡觀球! print('我喜歡{0},喜歡{1},同時也喜歡{2}!'.format(*('籃球','足球','觀球'))) # 我喜歡籃球,喜歡足球,同時也喜歡觀球! # 字典 print('{name}的女朋友是{gf},我也喜歡{gf}!'.format(**{'name':'鋼鐵俠','gf':'小辣椒'})) # 鋼鐵俠的女朋友是小辣椒,我也喜歡小辣椒! # 元組+字典 print('我是{beauty}的{1},我們都喜歡{0},請大家{2}!' .format(*('球類','球迷','文明觀球'),**{'beauty':'斯嘉麗約翰遜',})) # 我是斯嘉麗約翰遜的球迷,我們都喜歡球類,請大家文明觀球! # 位置引數、關鍵字引數、元組、字典混合使用: print('我是{name},好像{age}了 ^_^,在{0},等你哦!n喜歡{1}、{2}和{3}。n我的唯一 >>>:{only_one}n我的小可愛 >>>: {love}!' .format('武漢',name='蘇光體',age=18,*('讀書','健身','折騰數碼'),**{'only_one':'楊林','love':'蘇弘睿'})) # 我是蘇光體,好像18了 ^_^,在武漢,等你哦! # 喜歡讀書、健身和折騰數碼。 # 我的唯一 >>>:楊林 # 我的小可愛 >>>: 蘇弘睿!
使用元組或者字典格式化輸出的形式就是相當於將元組和字典打散,變成位置引數們和關鍵字引數們然後按照前面的方法傳參就行。
相關推薦:《》
3、物件引數格式化輸出傳值:
formate還可以使用物件屬性傳參,這個物件可以是例項化的物件,也可以是列表、字典。
# 物件屬性傳參 # 例項化物件: class Dog: def __init__(self,name,speak): self.name=name self.speak=speak dog1=Dog('小黃','汪汪汪') print('我的{0.name}會{0.speak}。'.format(dog1)) # 我的小黃會汪汪汪。 # 檔案物件 with open('text.txt','wb') as f: print('開啟的檔名為:{0.name}'.format(f)) # 開啟的檔名為:text.txt # 列表、字典物件 print('I have a {0[0]} , I have a {0[1]} .'.format(['Apple','Pen'])) print('我叫{0[name]},{0[id]}就是我!'.format({'name':'阿星','id':'9527'})) print('{1[name]}變成了{0[0]},藏進了{1[role]}的褲襠裡,為什麼不變{0[1]}而是{0[0]}呢?'.format(['葡萄','蘋果'],{'name':'菩提老祖','role':'至尊寶'})) # I have a Apple , I have a Pen . # 我叫阿星,9527就是我! # 菩提老祖變成了葡萄,藏進了至尊寶的褲襠裡,為什麼不變蘋果而是葡萄呢?
4、格式說明符:規定傳入引數字元的格式
比如:
print('{0:.4f}'.format(3.1415926)) #在傳入引數後面用冒號:寫入規定的格式:.4f(取4位小數) 結果為:3.1416
說明符格式標準:[填充]對齊方式][正負號][#][0][寬度][分組選項][.精度][型別碼] 同時存在是有順序之分的,具體使用下面有具體示例:
填充:
(1)填充字元只能有一個
(2)不指定預設用空格填充
(3)如果指定填充字元,則必須要同時指定對齊方式
對齊方式:
(1)< 左對齊
(2)> 右對齊
(3)^ 居中對齊
(4)= 在正負號和數字之間填充(僅對數字型別有效)可以輸出類似:+00000012的字串。
正負號:
(1)僅對數字型別生效
(2)+ - 正負號
(3)空格:正數前面需要新增一個空格,以便與負數對齊
寬度width
(1)不指定寬度,寬度由內容決定
(2)寬度前有0,意味著用0填充,等價於 0=的填充和對齊方式
精度
(1)指小數點後面展示的小數位數。
(2)對於非數字型別,指最大欄位寬度。
(3)整數型別不能指定精度,會報錯的。
下面看示例吧:
#在傳入引數後面用冒號:寫入規定的格式:.4f(取4位小數) 結果為:3.1416 # 填充、對齊、寬度 print('{0:人>2}'.format('<我是誰>')) # 寬度不夠,按實際字元顯示 print('{0:人<11}'.format('<我>')) print('{0:人^11}'.format('<我>')) # <我是誰> # <我>人人人人人人人人 # 人人人人<我>人人人人 # 正負號、精度 print('{0:*=+10.4f}'.format(3.1415926)) # '*'>填充符,'='>指定在正負號和數字之間填充,'10'>寬度,'.4f'>精度 print('{0:*>+10.4f}'.format(3.1415926)) # 同上,'>'>右對齊 # +***3.1416 # ***+3.1416 print('{0:&>10.4f}'.format(3.1415926)) print('{0:&<10.4f}'.format(3.1415926)) print('{0:&>10.4}'.format('我是中國人')) # 精度為4,去字串中的前4個字元 # &&&&3.1416 # 3.1416&&&& # &&&&&&我是中國
型別碼(規定輸出的資料型別)
(1)字串型別
(2)整數型別
(3)浮點數型別
# 字串型別(預設型別,忽視) print('{0:s}'.format('abc')) # abc print('{0:}'.format('abc')) # abc # 整數型別 # b 二進位制|c Unicode字元|d 十進位制整數|還有很多比如o八進位制|x十六進位制...等等 print('{0:b}'.format(101)) # 1100101 print('{0:c}'.format(101)) # e print('{0:d}'.format(666)) # 666 # 浮點數字型別 # e 科學計數(預設精度6位) print('{0:e}'.format(31415926)) # 3.141593e+07 # f 定點記法(預設精度6位) print('{0:f}'.format(3.1415926)) # 3.141593
以上例子可以說不太全面,只是大概舉了幾個常見的,除了e,f型別還有g通用型別,n number型別,對於日常使用的話並不常用。所以不一一列出。
5、其他補充:
花括號本事如需格式化輸出,可以用外套2層花括號轉義解決
print('{{0}}'.format('abc')) # {0} print('{{{0}}}'.format('abc')) # {abc}
一些另類格式化輸出:
from datetime import datetime print('今天是:{0:%Y-%m %H:%M}'.format(datetime.now())) # 結果: 今天是:2019-05 15:10
總結:
str.format()格式化輸出方法可以說是%s的加強型,特別是在處理更復雜的格式化輸出過程時候,可以更精確的進行達到輸出目的,它整合的方法可以說比較繁雜,很多方法個人認為用處不大,僅僅是錦上添花的作用,個人認為只要掌握前面幾個簡單的位置引數、關鍵字引數、元組、字典的傳參形式的格式化輸出就可以了。後面的方法可以有,但是不建議進行強行記憶,因為精力有限,用時再開啟翻翻也就明瞭。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2001/viewspace-2837158/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- python str.format高階用法PythonORM
- Python3中使用PyMongo的方法詳解PythonGo
- Python 中__new__方法詳解及使用Python
- Python中求絕對值的三種方法詳解!Python
- Python中的列表詳解Python
- 詳解Python中的程式Python
- Python中的Super詳解Python
- Java中的方法引用詳解Java
- Python中如何求1-100的奇數和?方法詳解!Python
- python中dict詳解Python
- 在Python中使用代理IP的方法詳解Python
- Pandas中resample方法詳解
- Python中字典使用詳解Python
- python中list切片詳解Python
- Python中對字串格式化的方法:%、format()、以及f+字串詳解Python字串格式化ORM
- python中變數的命名及詳解Python變數
- list中add、set方法詳解
- python基礎(8)python中is和==的區別詳解Python
- Python3中urlopen()詳解Python
- Python中協程(coroutine)詳解Python
- Python中Numpy函式詳解Python函式
- pandas | 詳解DataFrame中的apply與applymap方法APP
- Python中none和null的區別詳解!PythonNoneNull
- Python的hasattr() getattr() setattr() 函式使用方法詳解Python函式
- Python 6種列印99乘法表的方法詳解!Python
- JQuery中$.ajax()方法引數詳解jQuery
- Linux中產生zombie的原因詳解及解決方法!Linux
- 詳解nginx伺服器中的安全配置的方法Nginx伺服器
- 詳解MySQL中的SQRT函式的使用方法MySql函式
- Python 中的設計模式詳解之:策略模式Python設計模式
- Python3中*和**運算子的用法詳解!Python
- Python中的__init__()方法整理中(兩種解釋)Python
- Python產生20個隨機整數的方法詳解!Python隨機
- python中yield的用法詳解——最簡單,最清晰的解釋Python
- C#中抽象方法與虛方法的區別詳解及示例C#抽象
- Unix系統中的dot命令的使用方法詳解
- Python魔法方法__getattr__和__getattribute__詳解Python
- Python中dumps, loads dump, load用法詳解Python