摘要:項目地址相信很多人在格式化字符串的時候都用的語法,提出一種更先進的格式化方法并成為的標準用來替換舊的格式化語法,從開始已經實現了這一方法其它解釋器未考證。
項目地址:https://git.io/pytips
相信很多人在格式化字符串的時候都用"%s" % v的語法,PEP 3101 提出一種更先進的格式化方法 str.format() 并成為 Python 3 的標準用來替換舊的 %s 格式化語法,CPython 從 2.6 開始已經實現了這一方法(其它解釋器未考證)。
format()新的 format() 方法其實更像是一個簡略版的模板引起(Template Engine),功能非常豐富,官方文檔對其語法的描述如下:
""" replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}" field_name ::= arg_name ("." attribute_name | "[" element_index "]")* arg_name ::= [identifier | integer] attribute_name ::= identifier element_index ::= integer | index_string index_string ::=+ conversion ::= "r" | "s" | "a" format_spec ::= """ pass # Donot output
我將其準換成鐵路圖的形式,(可能)更直觀一些:
模板中替換變量用 {} 包圍,且由 : 分為兩部分,其中后半部分 format_spec 在后面會多帶帶討論。前半部分有三種用法:
空
代表位置的數字
代表keyword的標識符
這與函數調用的參數類別是一致的:
print("{} {}".format("Hello", "World")) # is equal to... print("{0} {1}".format("Hello", "World")) print("{hello} {world}".format(hello="Hello", world="World")) print("{0}{1}{0}".format("H", "e"))
Hello World Hello World Hello World HeH
除此之外,就像在0x05 函數參數與解包中提到的一樣,format() 中也可以直接使用解包操作:
print("{lang}.{suffix}".format(**{"lang": "Python", "suffix": "py"})) print("{} {}".format(*["Python", "Rocks"]))
Python.py Python Rocks
在模板中還可以通過 .identifier 和 [key] 的方式獲取變量內的屬性或值(需要注意的是 "{}{}" 相當于 "{0}{1}"):
data = {"name": "Python", "score": 100} print("Name: {0[name]}, Score: {0[score]}".format(data)) # 不需要引號 langs = ["Python", "Ruby"] print("{0[0]} vs {0[1]}".format(langs)) print(" ==== Help(format): {.__doc__}".format(str.format))
Name: Python, Score: 100 Python vs Ruby ==== Help(format): S.format(*args, **kwargs) -> str Return a formatted version of S, using substitutions from args and kwargs. The substitutions are identified by braces ("{" and "}").強制轉換
可以通過 ! + r|s|a 的方式對替換的變量進行強制轉換:
"{!r}" 對變量調用 repr()
"{!s}" 對變量調用 str()
"{!a}" 對變量調用 ascii()
格式最后 : 之后的部分定義輸出的樣式:
align 代表對齊方向,通常要配合 width 使用,而 fill 則是填充的字符(默認為空白):
for align, text in zip("<^>", ["left", "center", "right"]): print("{:{fill}{align}16}".format(text, fill=align, align=align)) print("{:0=10}".format(100)) # = 只允許數字
left<<<<<<<<<<<< ^^^^^center^^^^^ >>>>>>>>>>>right 0000000100
同時可以看出,樣式設置里面可以嵌套 {} ,但是必須通過 keyword 指定,且只能嵌套一層。
接下來是符號樣式:+|-|" " 分別指定數字是否需要強制符號(其中空格是指在正數的時候不顯示 + 但保留一位空格):
print("{0:+} {1:-} {0: }".format(3.14, -3.14))
+3.14 -3.14 3.14
# 用于表示特殊格式的數字(二進制、十六進制等)是否需要前綴符號;, 也是用于表示數字時是否需要在千位處進行分隔;0 相當于前面的 {:0=} 右對齊并用 0 補充空位:
print("Binary: {0:b} => {0:#b}".format(3)) print("Large Number: {0:} => {0:,}".format(1.25e6)) print("Padding: {0:16} => {0:016}".format(3))
Binary: 11 => 0b11 Large Number: 1250000.0 => 1,250,000.0 Padding: 3 => 0000000000000003
最后兩個就是我們熟悉的小數點精度 .n 和格式化類型了,這里僅給出一些示例,詳細內容可以查閱文檔:
from math import pi print("pi = {pi:.2}, also = {pi:.7}".format(pi=pi))
pi = 3.1, also = 3.141593
Integer
for t in "b c d #o #x #X n".split(): print("Type {0:>2} of {1} shows: {1:{t}}".format(t, 97, t=t))
Type b of 97 shows: 1100001 Type c of 97 shows: a Type d of 97 shows: 97 Type #o of 97 shows: 0o141 Type #x of 97 shows: 0x61 Type #X of 97 shows: 0X61 Type n of 97 shows: 97
Float
for t, n in zip("eEfFgGn%", [12345, 12345, 1.3, 1.3, 1, 2, 3.14, 0.985]): print("Type {} shows: {:.2{t}}".format(t, n, t=t))
Type e shows: 1.23e+04 Type E shows: 1.23E+04 Type f shows: 1.30 Type F shows: 1.30 Type g shows: 1 Type G shows: 2 Type n shows: 3.1 Type % shows: 98.50%
String (default)
try: print("{:s}".format(123)) except: print("{}".format(456))
456
歡迎關注 PyHub!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37830.html
摘要:項目地址所有用過的人應該都看過下面兩行錯誤信息這就是界的錕斤拷今天和接下來幾期的內容將主要關注中的字符串字節及兩者之間的相互轉換。 項目地址:https://git.io/pytips 所有用過 Python (2&3)的人應該都看過下面兩行錯誤信息: UnicodeEncodeError: ascii codec cant encode characters in position...
摘要:項目地址時間和日期可能涉及到不同的時區格式,同時又經常需要作為時間戳保存,有時候還需要進行一些加減操作,因此處理起來通常會因為方法太多而無從下手。中與時間和日期相關的標準庫有個和。 項目地址:https://git.io/pytips 時間和日期可能涉及到不同的時區、格式,同時又經常需要作為時間戳保存,有時候還需要進行一些加減操作,因此處理起來通常會因為方法太多而無從下手。Python...
摘要:回到對字節和字節數組的定義為了用計算機可以理解的數字描述人類使用的字符,我們需要一張數字與字符對應的表。由于和字符串一樣是序列類型,字節和字節數組可用的方法也類似,這里就不一一列舉了。 項目地址:https://git.io/pytips 0x07 中介紹了 Python 中的字符串類型,字符串類型是對人類友好的符號,但計算機只認識一種符號,那就是二進制(binary)數,或者說是數字...
摘要:借鑒了中的某些迭代器的構造方法,并在中實現該模塊是通過實現,源代碼。 項目地址:https://git.io/pytips 0x01 介紹了迭代器的概念,即定義了 __iter__() 和 __next__() 方法的對象,或者通過 yield 簡化定義的可迭代對象,而在一些函數式編程語言(見 0x02 Python 中的函數式編程)中,類似的迭代器常被用于產生特定格式的列表(或序列)...
摘要:項目地址迭代器與生成器迭代器與生成器是中比較常用又很容易混淆的兩個概念,今天就把它們梳理一遍,并舉一些常用的例子。生成器前面說到創建迭代器有種方法,其中第三種就是生成器。 項目地址:https://git.io/pytips 迭代器與生成器 迭代器(iterator)與生成器(generator)是 Python 中比較常用又很容易混淆的兩個概念,今天就把它們梳理一遍,并舉一些常用的例...
閱讀 1809·2019-08-30 13:54
閱讀 2725·2019-08-29 17:27
閱讀 1109·2019-08-29 17:23
閱讀 3350·2019-08-29 15:20
閱讀 1225·2019-08-29 11:28
閱讀 1566·2019-08-26 10:39
閱讀 1315·2019-08-26 10:29
閱讀 639·2019-08-26 10:13