ホームページ >バックエンド開発 >Python チュートリアル >10,000 ワードの長い記事、Python の文字列フォーマットの説明

10,000 ワードの長い記事、Python の文字列フォーマットの説明

王林
王林転載
2023-04-19 11:04:021461ブラウズ

10,000 ワードの長い記事、Python の文字列フォーマットの説明

#みなさんこんにちは、私は新人です。

人生は短い、私は Python を学びます!

今日の記事は非常に詳細であり、文字列形式の出力に関する史上最も完全な説明と言えます。

先週末「pandas データの書式設定」を見たときに、これらの知識ポイント (小数点以下の桁の設定、パーセンタイルの設定、千の位の区切り記号の設定) を要約することを考えました。しかし、どんどん調べていくうちに、それらはすべて文字列の書式設定と切り離せないものになったので、方向転換して文字列の書式設定の知識を復習しました。

しかし、予想外でした。知識が少ないと思っていましたが、丁寧に整理してみたところ、特に g と G の使い方について理解するのに 1 週​​間以上かかりました。 , BaiduとGoogleは一般的すぎたので、公式サイトに行って読んでみましたが、私の公式サイトは公式すぎて、意味がよく分からない部分もあったので、少しずつ磨いて試してみました。間違っていました。 10 中 9 は私がそれを理解できるので、以下に示す投稿が形成されます...

ディレクトリ:

    1. % 書式設定
  • 2. str.format()
  • による書式設定 3. f-string の書式設定
  • 4. format()
  • 5. まとめ
  • 参照
1.%フォーマット

1.Syntax

"%[(name)][flags][width][.precison]type" % 待格式化数据

2.Parameters

(1) %: 占位符;
(2) (name):命名占位字符;
(3) flags可选:
1) +: 右对齐,正数加正号,负数加负号;
2) -: 左对齐,正数无符号,负数加负号;
3) 空格: 右对齐(默认的对齐方式),正数前加空格,负数前加负号;
4) 0: 右对齐,以0填充,正数无符号,负数加负号,并将符号放置在0最左侧;
(4) width: 占位宽度, 若指定宽度小于原数据长度则按原长度数据输出;
(5) .precison: 小数点后保留位数;在字符串中则表示截取/字符串切片;
(6) type: 详见如下...

3.type

(1) s: string, 字符串;
(2) d: decimal integer, 十进制数;
(3) i: integer, 用法同%d;
(4) u: unsigned integer, 无符号十进制数;
(5) f: float, 浮点数(默认保留小数点后6位);
(6) F: Float, 浮点数(默认保留小数点后6位);
(7) e: exponent, 将数字表示为科学计数法(小写e, 默认保留小数点后6位);
(8) E: Exponent, 将数字表示为科学计数法(大写E, 默认保留小数点后6位);
(9) o: octal, 八进制数(即0-7);
(10) x: hexdecimal, 十六进制数(即0-9a-f);
(11) X: Hexdecimal, 十六进进制数(0-9A-F);
(12) g: general format, 通用格式,详见如下...;
(13) G: General format, 通用格式,详见如下...;
(14) %c: character, 将十进制数转换为所对应的unicode值;
(15) %r: representation, 调用__repr__魔法方法输出;
(16) %%: 转义%,输出百分号。

4. 補足

四捨五入と5組への四捨五入

  • 四捨五入
「小数点以下を維持する」必要がある場合「小数点以下 n 桁に」または「有効数字 n 桁を維持」する場合は、数値を適切に四捨五入する必要があります。たとえば、1.125 を小数点以下 2 桁に四捨五入する必要がある場合、結果は 1.13 になります。ただし、% または format 書式設定を使用すると、次のように、期待した結果と非常によく似た結果が得られます:

print("{:.2f}".format(1.125))
>>> 1.12
print("%.2f" % 1.125)
>>> 1.12

上記の結果からわかるように、1.125 は小数点以下 2 桁まで残されています。結果は 1.13 ではなく 1.12 です。これはなぜですか?読み続けてください (5 ペアに四捨五入)...

  • 5 ペアに四捨五入
正確に n 桁にするか、小数点以下 n 桁を保持するかを採用します。次のルール (例として小数点以下 n 桁を保持する):

a. 丸め: 小数点以下 n 桁を保持し、n 番目の 1 桁目 ≤ 4 の場合は破棄;

b. 6-桁: 小数点以下 n 桁を保持、n 番目の桁が ≥ 6 の場合、n 番目の桁は 1 で繰り上げられます;

c. 5 倍精度: n 番目の桁が 6 より大きい場合、小数点以下 n 桁を保持します。桁が =5 の場合、n 番目の桁の後に数字がない場合、n 番目の桁が偶数の場合は n 番目の桁が切り捨てられ、n 番目の桁が奇数の場合は 1 が加算されます。

n桁目以降の場合 0以外の数値がある場合、奇数、偶数に関わらずn桁目を1で切り上げます。

print("{:.2f}".format(1.125)) は、小数点以下 2 桁 (n=2) を保持する必要があり、小数点以下 2 桁目の最後の桁 (n 1) を観察する必要があります。桁)。 n 番目の 1 は 5 で、5 の後には他の数字はありません。n 番目の桁 2 は偶数であるため、直接切り捨てられるため、最終結果は 1.12 になります。

  • 10 進数を 2 進数に変換します
a. 10 進整数を 2 進数に変換します: 2 で割って余りを取り、逆の順序に並べます。

b. 10 進浮動小数点数を 2 進数に変換: 基底乗算と丸め;

  • 不正確な仮数部
10 進浮動小数点数は 2 進数に変換されます。 無限小数の乗算ができない状況が発生する場合があります。ただし、コンピューターは無限小数を処理できません。10 進浮動小数点数に対応する 2 進数の最大 53 ビットが保持され、53 ビット以降のデータは直接切り捨てられるため、2 進浮動小数点数を逆変換するときに不正確になります。 10進数に変換します。

  • Decimal
前述したように、一部の浮動小数点数には不正確な仮数が含まれる可能性があり、その結果、正確な計算が必要なデータが生成されることがあります。不正確な小数が積み重なると深刻なデータ不正が発生する可能性があるため、Python 標準モジュール decimal モジュールの Decimal クラスを使用して処理できます。

Decimal は、10 進浮動小数点数の精度算術サポートを提供します。Decimal で表される浮動小数点数は正確な 10 進数であり、不正確な仮数はありません。さらに、Decimal には、ROUND_UP (0 から遠ざかる方向の丸め)、ROUDN_DOWN (0 に向かう方向の丸め)、ROUND_HALF_UP (四捨五入、半分は 5 を意味し、上は 0 から遠ざかる方向を意味します) など、「四捨五入」のための多くのモードも用意されています。

Decimal(value) の値は、整数、文字列、タプル、浮動小数点数、または別の Decimal オブジェクトを渡すことができます。パラメータを value に渡すには文字列を使用することをお勧めします。 value に浮動小数点数を指定しても、エラーは発生します。正確な仮数部。

したがって、「丸め」関数を実現したい場合は、以下に示すように Decimal を使用できます。

from decimal import Decimal, ROUND_HALF_UP
print(Decimal("1.125").quantize(Decimal(".00"), rounding=ROUND_HALF_UP))
>>> 1.13

  • __str__ および __repr__
フォーマットされた文字パラメータには %r があります。ここでの r は、__repr__ マジック メソッドを呼び出すことです。その機能は __str___ に似ています。2 つの違いは次のとおりです:

class Animal:
def __init__(self, name):
self.name = name
def __str__(self):
return "我是" + self.name
def __repr__(self):
return "我的名字是" + self.name
if __name__ == "__main__":
cat = Animal("小黑")
print(cat)

Animal で __str__ も __repr__ マジック メソッドもクラスで定義されていない場合、印刷出力は

;<__main__.animal object at> と同様に cat オブジェクトのメモリ アドレスを取得します。

如果只定义了__str__ 或__repr__中的一个,那么print(cat)都将输出其对应的返回值,类似返回"我是小黑"或"我的名字是小黑";

如果既定义了__str__和__repr__两个魔法方法,那么print(cat)将输出__str__对应的返回值;__repr__和__str__的区别在于,一个侧重用户,一个侧重开发人员。如果定义了__repr__方法,那么在一些编辑器(Jupyter Notebook, JypyterLab)或终端中直接传递对象名即可获取__repr__的返回值,如下图所示:

10,000 ワードの長い記事、Python の文字列フォーマットの説明

5.用法详解

(1). name

(1.1) 不指定name
1) 单个数据
print("|我是%s" % "王暖暖|")
>>> |我是王暖暖|
2) 多个数据: 使用元组
print("|我是%s,今年%d岁|" % ("王暖暖", 18))
>>> |我是王暖暖,今年18岁|
(1.2) 指定name: 使用字典
1) 单个数据
print("|我是%(name)s|" % {"name": "王暖暖"})
>>> |我是王暖暖|
2) 多个数据
print("|我叫%(name)s, 今年%(age)d岁。|" % {"name": "王暖暖", "age": 18})
>>> |我叫王暖暖, 今年18岁。|
(1.3) 单个数据对应多个占位
# 元组内元素数量必须和占位符数量统一
print("|我是 %s %s %s!!!|" % ("王暖暖", "王暖暖", "王暖暖"))
# 使用字典则必须指明键值对
print("|我是 %(name)s %(name)s %(name)s!!!|" % ({"name": "王暖暖"}))
>>> |我是王暖暖 王暖暖 王暖暖!!!|

(2). flags + width

# 依次按flags中"+", "-", " ", "0"结合width=10演示
(2.1) 字符串:
print("|%+10s|" % "王暖暖")
>>> | 王暖暖| # 字符串右对齐
print("|%-10s|" % "王暖暖")
>>> |王暖暖 | # 字符串左对齐
print("|% 10s|" % "王暖暖")
>>> | 王暖暖| # 字符串右对齐
print("|%010s|" % "王暖暖")
>>> | 王暖暖| # 字符串右对齐
(2.2) 正整数
print("|%+10d|" % 26)
>>> | +26| # 正整数右对齐,正数加正号
print("|%-10d|" % 26)
>>> |26| # 正整数左对齐,正数无符号
print("|% 10d|" % 26)
>>> |26| # 正整数右对齐,正数前加空格
print("|%010d|" % 26)
>>> |0000000026| # 正整数右对齐,正数无符号,以0填充
(2.3) 负整数
print("|%+10d|" % -26)
>>> | -26| # 负整数右对齐,负数加负号
print("|%-10d|" % -26)
>>> |-26 | # 负整数左对齐,负数加负号
print("|% 10d|" % -26)
>>> | -26| # 负整数右对齐,负数加负号
print("|%010d|" % -26)
>>> |-000000026| # 负整数右对齐,负数加负号, 符号和数字之前填充0
(2.4) 正浮点数
# 如未指定浮点数精度,默认保留6位小数,其余均用空格填充(如指定0则用0填充);若width小于浮点数的数位则width无效。
print("|%+10f|" % 2.2)
>>> | +2.200000| # 正浮点数加正号右对齐,小数部分以0填充
print("|%-10f|" % 2.2)
>>> |2.200000| # 正浮点数左对齐,小数点后为空格
print("|% 10f|" % 2.2)
>>> |2.200000| # 正浮点数右对齐,浮点数前为空格
print("|%010f|" % 2.2)
>>> |002.200000| # 正浮点数右对齐,小数点前以0填充
(2.5) 负浮点数
print("|%+10f|" % -2.2)
>>> | -2.200000| # 负浮点数加负号右对齐,小数部分以0填充
print("|%-10f|" % -2.2)
>>> |-2.200000 | # 负浮点数加负号左对齐,小数点后为空格
print("|% 10f|" % -2.2)
>>> | -2.200000| # 负浮点数加负号右对齐,其余用空格填充
print("|%010f|" % -2.2)
>>> |-02.200000| # 负浮点数加负号右对齐,其余用0填充,注意符号在最左侧
(2.6) 详详解
1) print("|%+15f|" % 22.6)
 >>> | +22.600000|
a) 未指定保留位数,故小数点后占6位,用0填充;
b) 小数点占1位,"+"号占1位,共2位;
c) 小数点前系数"22"占2位;
c) 其余均用空格填充,故空格占5位,总计15位.
2) print("|%+015f|" % 22.6)
 >>> |+0000022.600000|
a) 未指定保留位数,故小数点后占6位,用0填充;
b) 小数点占1位,"+"号占1位,共2位;
c) 小数点前系数22占2位;
d) 其余均用0填充,故小数点前的"0"占5位,总计15位;
e) 注意: 此处同时使用了"+"和"0",配合二者的功能使用。
3) print("|%+15.3f|" % 22.66)
 >>> |+22.660|
a) 指定保留小数位数为3位,不足的用0填充;
b) 其余的用空格填充;
4) print("|%+015.3f|" % 22.66)
 >>> |+0000000022.660|
a) 指定保留小数位数为3位,不足的用0填充;
b) 其余的用"0"填充;

(3). precision

(3.1) 字符串
如果待格式化数据为字符串则表示字符串截取
print("|%.2s|" % "python")
>>> |py|
(3.2) 浮点数
保留小数点后.precision数字
print("|%(num).2f|" % {"num": 0.145})
>>> |0.14|
print("|%(num).2f|" % {"num": 1.145})
>>> |1.15|
print("|%(num).2f|" % {"num": 2.145})
>>> |2.15|
print("|%(num).2f|" % {"num": 3.145})
>>> |3.15|
注意: 此处列举的数字均存在"不精确尾数"和"四舍六入五双"两种情况
(3.3) 科学计数
print("|%.3f用科学计数法表示写作%.2E|" % (40.125, 40.125))
>>> |40.125用科学计数法表示写作4.01E+01|
解析: 先将40.125转为科学计数法形式: 4.0125*10^1(4.0125乘以10的1次方);
 而后再对4.0125精确到小数点后位, 即4.01;
 最后用e或E分隔系数和指数,即为4.01E+01
(3.4) g/G模式: 详见如下...

(4). type

(1) s: 字符串
print("|我是%s|" % "王暖暖") >>> |我是王暖暖|
(2) d, i, u: 十进制数字
print("|我最喜欢的十进制数是%d|" % 26)
print("|我最喜欢的十进制数是%i|" % 26)
print("|我最喜欢的十进制数是%u|" % 26)
>>> |我最喜欢的十进制数是26|
(3) f: 浮点数(默认保留6位小数)
# 保留小数详情见上...
print("|这是一个浮点数%f|" % 2.26)
>>> |这是一个浮点数2.260000|
(4) e, E: 科学计数
 print("|%f用科学计数法表示写作%e|" % (4.145, 4.145))
>>> |4.145000用科学计数法表示写作4.145000e+00|
print("|%.3f用科学计数法表示写作%.2E|" % (4.145, 4.145))
>>> |4.145用科学计数法表示写作4.14E+00|
(2) o: 八进制
print("|十进制%(num)d对应的八进制数为%(num)o|" % {"num": 26})
>>> |十进制26对应的八进制数为32|
(3) x, X: 十六进制
print("|十进制%(num)d对应的十六进制数为%(num)x|" % {"num": 26})
>>> |十进制26对应的十六进制数为1a|
print("|十进制%(num)d对应的十六进制数为%(num)X|" % {"num": 26})
>>> |十进制26对应的十六进制数为1A|
(6) g, G详见如下...
(7) c: unicode字符
print("|%d对应的unicode字符为:%c|" % (226, 226))
>>> |226对应的unicode字符为:â|
(12) %r: representation, 调用传入对象的__repr__方法的返回值
经测试,无论是使用%s类型还是%r类型,使用JypyterLab均直接输出格式化结果,其二者的却别在于,使用%r模式会在字符串数据的左右两侧加上'', 详见下图...
(11) %%: 转义%。
如果有待格式化数据需要输出百分号(%),需要使用%%进行转义
print("|I'm %d%% sure.|" % 100) >>> |I'm 100% sure.|

10,000 ワードの長い記事、Python の文字列フォーマットの説明

二、str.format()格式化

1.语法

"{[index][:[[fill]align][sign][#][0][width][grouping_option][.precision][type]]}".format()

2.参数详解

(1) index: 待格式化字符的索引或键,若占位符数量和参数数量不一致时必须指定索引;
(2) fill: 填充字符,可为任意字符;
(3) align: 对齐方式(常配合width使用),可选:
 # 和Excel中输入文本和数字的默认对齐方式一致
1) <: 左对齐(字符串默认对齐方式);
2) >: 右对齐(数字默认对齐方式);
3) ^: 居中对齐;
4) =: 内容右对齐,将符号(+或-)放置在填充字符的左侧,仅对数字类型有效;
(4) sign: 有无符号,可选:
1) +: 正数加正号,负数加负号;
2) -: 正数不变,负数加负号(默认);
3) 空格: 正数加空格,负数加负号;
(5) #:
 a. 对于整数,在输出值分别添加响应的0b, 0o, 0x前缀;
 b. 对于浮点数和复数, 在输出值保留小数点符号;
 c. 在g/G模式下,保留末尾的0;
(6) 0: 若未设置对齐方式,在width前加一个0将为数字类型启用感知正负号的零填充,等同于设置fill为0, align为"=";
(7) width: 字段总宽度(十进制整数), 所有前缀,分隔符和其它格式化字符之和;
(8) grouping_option: 设置分组(分隔):
 1) ",": 使用逗号作为千位分隔符;
 2) "_": 使用_作为分隔符:
a. 对于十进制数, 使用_作为千位分隔符;
b. 对于b, o, x/X,使用_每4位数插入一个下划线;
(9) .precision(十进制数):
 a. 整数型不允许设置precison, 如果设置即被转换为浮点数;
 b. 浮点型表示小数点"后"显示多少位小数位数;
 c. 以g或G格式化表示在小数点"前后"共显示多少个数位;
 d. 字符型表示截取多少个字符;
(10) {{或}}: 转义{或},当需要输出{或}的使用使用;
(11) type: 详见如下...

3.type:

format()格式化与%格式化的type大同小异,以下尽挑重点讲解
(1) b: binary, 二进制;
(3) g: general formatting, 详见如下...
(4) G: General formatting, 详见如下...

4.genaral formatting

g和G模式是我花时间最多去琢磨的一个点,所以单独把它抽离出来讲解。这里的g字母是general的缩写,百度可以查到一些资料,说某种条件下, g模式等同于f模式或e模式。但是,实际上,g与f, e这两种模式还有一些区别,详见如下:

(1) 给定精度
 对于给定精度 p >= 1,会将数值舍入到p个有效数位,再将结果以小数或科学计数法进行格式化,精度0会被视为等价于精度1。
 1) 对于浮点数:
print("|{:.2G}|".format(3.125))
先将3.125转换为科学计数法表示,即为3.125*10^0;
此时,指定的精度p=2, 表示小数点前后共保留2个有效数位, 指数exp=0,则
如果-4 ≤ exp < p(-4 ≤ 0 < 2),该数将使用"f"模式和精度p-1-exp(2-1-0=1)格式化,故
结果为: |3.1|
2) 对于Decimal:
print("|{:.2G}|".format(Decimal("4.145")))
先将Decimal("4.145")转换为科学计数法表示,即为4.145*10^0;
此时,指定的精度p=2, 表示小数点前后共保留2个有效数位,指数exp=0, 则
如果-6 ≤ exp < p(-6 ≤ 0 < 2), 该数将使用"f"模式和精度p-1-exp(2-1-0)格式化,故
结果为: |4.1|
3) 如果不满足m ≤ exp < p(m=-4或-6), 则使用"e"模式和精度p-1表示:
print("|{:.3G}|".format(4225.125))
先将4225.125转换为科学计数法表示,即为4.225125*10^3;
此时,指定的精度p=3, exp=3, 则
-4 ≤ exp < p(-4 ≤ 3 < 3)不成立,所以使用"e"模式和精度p-1(3-1=2)表示,故
结果为: |4.23E+03|
print("|{:.3G}|".format(Decimal("4225.256")))
同理如上,结果为|4.23E+3|
(2) 未给定精度
 如未指定精度,会对浮点数采用6个有效数位的精度; 对于 Decimal,结果的系数会沿用原值的系数数位。
只有很小的数字或很大的数字才会使用"e"模式表示, 其余的均用"f"模式表示:
a. 绝对值小于等于1e-6(0.000001)的数使用"e"模式表示;
b. 小数点前的数位大于6的数使用"e"模式表示。
例如:
 print("|{:G}|".format(0.0000002))
>>> |2E-07|
print("|{:G}|".format(5555555.6666))
>>> |5.55556E+06|
(3) 注意点
 1)
 需要注意的是,g/G和f,e/E并不完全相同,主要体现在精度的处理上。
对于f而言,精度p指的是保留小数点后p位小数;
对于e而言,精度p指的是将数据转换为科学计数法后保留小数点后p位;
而g/G模式下,则表示小数点前后保留p位有效数字。
print("|{:.3G}|".format(5555.6666))
>>> |5.56E+03|
print("|{:.3E}|".format(5555.6666))
>>> |5.556E+03|
print("|{:.3f}|".format(5555.6666))
>>> |5555.667|
2) 如果小数点之后没有数位,则小数点也会被略去,除非使用了#选项
print("{:G}".format(333.0))
>>> 333
print("{:#G}".format(333.0))
>>> 333.000
print("{:f}".format(333.0))
>>> 333.000000
 print("{:E}".format(333.0))
>>> 3.330000E+02

5.用法详解

基于前文已经详细讲解了%格式化中各个参数的用法,此处便不再做过多赘述,更多以实例讲解,如有必要再做具体解析。

   (1). index

print("|我叫{}, 今年{}岁.|".format("Zack", 18)) # 不指定index
print("|我叫{0}, 今年{1}岁.|".format("Zack", 18)) # 数字
print("|我叫{0[0]}, 今年{0[1]}岁.|".format(("Zack", 18, ))) # 元组
print("|我叫{name}, 今年{age}岁.|".format(name="Zack", age=18)) # 关键字参数
info = {"name": "Zack",
"age": 18}
print("|我叫{name}, 今年{age}岁.|".format(**info)) # 字典
>>> |我叫Zack, 今年18岁。|
print("|该复数的实部为{0.real}, 虚部为{0.imag}|".format(1+2j))
>>> |该复数的实部为1.0, 虚部为2.0|

    (2). fill+width+align

fill = &
align = None
width = 10
(1) 不指定align,无法指定fill, 默认为空格
print("|{0:10}|".format("王暖暖"))
>>> |王暖暖 | # 字符串
print("|{0:10}|".format(226))
>>> | 226| # 数字
(2) 指定align, fill=&, width=10
 print("|{0:&<10}|".format("王暖暖"))
>>> |王暖暖&&&&&&&|
print("|{0:&>10}|".format("王暖暖"))
>>> |&&&&&&&王暖暖|


print("|{0:&^10}|".format("王暖暖"))
>>> |&&&王暖暖&&&&|
 print("|{0:&=10}|".format(-226))
>>> |-&&&&&&226|# 符号放置最左侧

    (3). sign+align+fill+width

# 均以数字演示
sign=None
align=None
fill=*
width=10
(1) "+":
print("|{0:*<+10}|".format(226))
>>> |+226******|
print("|{0:*>+10}|".format(-226))
>>> |******-226|
(2) "-":
print("|{0:*<-10}|".format(226))
>>> |226*******|
print("|{0:*>-10}|".format(-226))
>>> |******-226|
(3) " ":
print("|{0:*< 10}|".format(226))
>>> |*** 226***| # 整数前有空格
print("|{0:*< 10}|".format(-226))
>>> |***-226***| # 负数前有负号

    (4). g/G

(1) b, o, x/X
print("|{0:#b}|".format(226))
>>> |0b11100010|
print("|{0:#o}|".format(226))
>>> |0o342|
print("|{0:#X}|".format(226))
>>> |0XE2|
(2) 浮点数和复数
即使指定小数点后保留0位数字,依旧保留小数点
print("|{:.0f}|".format(3.14))
>>> |3|
print("|{:#.0f}|".format(3.14))
>>> |3.|
print("|{:.0f}|".format(1+2J))
>>> |1+2j|
print("|{:#.0f}|".format(1+2J))
>>> |1.+2.j|
(3) g/G:
print("{:G}".format(333.0))
>>> 333
print("{:#G}".format(333.0))
>>> 333.000

    (5). "0"

(1)若未设置对齐方式,在width前加一个0将为数字类型启用感知正负号的零填充,等同于设置fill为0, align为"="
print("|{0:010}|".format(-3.14))
>>> |-000003.14|
等同于
print("|{0:0=10}|".format(-3.14))
>>> |-000003.14|
注意区别于
print("|{0:0>10}|".format(-3.14))
>>> |00000-3.14|
此功能等同于%格式化中的"0", 如下所示:
print("|%010.2f|" % -3.14)
>>> |-000003.14|

    (6). group_options

(1) ","千位分隔符
print("|{0:,}|".format(3141.5926))
>>> |3,141.5926|
(2) "_"
 1) 对于十进制数,使用"_"作为千位分隔符
print("|{0:_}|".format(3141.5926))
>>> |3_141.5926|
2) 对于b, o, x/X,使用"_"每四位插入一个下划线
print("|{0:_b}|".format(12345))
>>> |11_0000_0011_1001|
print("|{0:_o}|".format(12345))
>>> |3_0071|

    (7). {{或}}转义

print("This is a set: {{{0}}}".format("1, 2, 3"))
>>> This is a set: {1, 2, 3}

    (8). 补充

在处理精密数据的时候,因为不精确尾数的关系,可能导致一些数据失信,如下所示,将数据保留两位小数,有的精确为0.14而有的却精确为0.15。虽然Decimal可以处理此类问题,但是经过测试,Decimal并不使用于%格式化。传入Decimal和直接传入浮点数的结果一致,并无任何区别。故,如果要处理此类问题还是需要使用str.format()形式并传递Decimal类型的数据。

print("|%.2f|" % 0.145)
>>> |0.14|
print("|%.2f|" % Decimal("0.145"))
>>> |0.14|
print("|%.2f|" % 1.145)
>>> |1.15|
print("|%.2f|" % Decimal("1.145"))
>>> |1.15|
print("|{:.2f}|".format(Decimal("0.145")))
>>> |0.14|
print("|{:.2f}|".format(Decimal("1.145")))
>>> |1.14|

三、f-string格式化

1.语法

python3.6以后开始支持f-string字符串。f-string即formatting string, 它是str.format()的一个变种,其语法形式之殊途同归,很多时候使用f-string可以有效减少代码量,更为清晰易懂。语法:f"{}{}{}"

2.示例

(1)
name = "Zack"
age = 18
print(f"|我是{name}, 今年{age}岁|")
>>> |我是Zack, 今年18岁|
(2)
 for p in range(3):
url = f"https://www.baidu.com/s?wd=python&pn={p*10}&oq=python"
(3) 可直接调用对应对象的方法和属性
 channel = "ted"
 print(f"|我喜欢观看{channel.upper()}学习英语|")

四、format()

1.语法

# x为需要格式化的数据,formatter为格式化表达式,不需要指定{}。
format(x, formatter)

2.示例

#序列号
nums = [1, 2, 3]
serial_nums = [format(x, "0>8") for x in nums]
print(serial_nums)
>>> ['00000001', '00000002', '00000003']

五、总结

python字符串格式化语法较多,不便记忆,可以在具体需要使用的时候再查询即可。%格式化可以满足大多常用的功能,但是处理一些精密化或复杂的格式化需求的时候就束手无策了,所以推荐使用str.format()或f-string格式化处理字符串。

f-string是str.format()的一个分之,在一些特定情况下使用可以大大减少代码量,使代码更加清晰易懂,可以有选择性的使用f-string。

format()是python的一个内置函数,其使用频率不高,语法和str.format()大同小异,可以结合lambda函数使用或在其它一些特定情况下使用。

字符串格式化就讲到这里,我们下次再见啦~ bye bye

参考

为什么浮点数在计算机中可能不精确?https://mp.weixin.qq.com/s/3pg1wtsOnFqvmSw13YPVPg

如何在python里面精确四舍五入 https://mp.weixin.qq.com/s/25NMrQtFHUq0A4e4VpzT6Qpython

字符串格式化

​https://www.php.cn/link/398410ece9d7343091093a2a7f8ee381​

python官网  

​https://www.php.cn/link/4d215ab7508a3e089af43fb605dd27d1​

以上が10,000 ワードの長い記事、Python の文字列フォーマットの説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。