>  기사  >  백엔드 개발  >  10,000 단어의 긴 기사, Python 문자열 형식 설명

10,000 단어의 긴 기사, Python 문자열 형식 설명

王林
王林앞으로
2023-04-19 11:04:021438검색

10,000 단어의 긴 기사, Python 문자열 형식 설명

안녕하세요 여러분 신인입니다!

인생은 짧아요, 파이썬을 배워요!

오늘의 글은 매우 자세하고 문자열 형식 출력에 대한 역사상 가장 완벽한 설명이라고 할 수 있습니다!

지난 주말에 "판다 데이터 포맷팅"을 보고 이런 지식 포인트(소수점 자릿수 설정, 백분위수 설정, 천 단위 구분 기호 설정)를 정리하고 메모를 해야겠다는 생각이 들었습니다. 그런데 계속해서 알아보다보니 모두 문자열 서식과 뗄래야 뗄 수 없는 관계였기에 뒤집어서 문자열 서식에 대한 지식을 복습하게 되었습니다.

근데 전혀 예상 못했는데 지식 포인트가 별로 없는 줄 알았는데, 꼼꼼히 정리하고 나니 대부분 이해하는데 일주일 넘게 걸렸네요. 특히 g와 G의 사용법은요. 너무 일반적이어서 공식 홈페이지에 가서 살펴보았는데 제 공식 홈페이지가 너무 공식적이어서 일부 의미를 이해할 수 없어서 조금씩 시행착오를 거듭하다가 마침내 10번 중 9번은 답을 얻었습니다. 고민 끝에 아래와 같은 게시물이 만들어졌습니다...

디렉토리:

  • 1. % 형식 지정
  • 2. str.format()으로 형식 지정
  • 3. f -STRING FARMATTING at 4. FARMAT () 5. SOMPANTING
  • 1. 반올림 vs 5개 쌍으로 반올림
  • 반올림

"소수점 이하 n자리를 유지"하거나 "n개의 유효 숫자를 유지"해야 하는 경우 숫자를 적절하게 반올림해야 합니다. 예를 들면 다음과 같습니다. 1.125를 소수점 이하 두 자리로 반올림해야 하는 경우 결과는 1.13이 되어야 합니다. 그러나 % 또는 형식 형식을 사용하면 다음과 같이 예상한 결과와 매우 유사합니다.

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

위 결과에서 볼 수 있듯이 1.125를 소수점 이하 두 자리까지 유지한 결과는 1.12가 아닙니다. 1.13, 왜요? 계속 읽으세요(5개 쌍으로 반올림)...

5개 쌍으로 반올림

    정확히 n자리로 또는 소수점 n자리를 유지하려면 다음 규칙을 사용하세요(소수점 n자리를 유지하려면):
  • a. 4자리 반올림: n+1번째 숫자 ≥ 4이면 소수점 n자리를 유지하고,
  • b.6번 반올림: n+1번째 숫자 ≥ 6이면 n번째 자리를 1로 유지합니다. ;

c. 5개 쌍: 소수점 n자리를 유지하고 n+1번째 숫자 = 5인 경우 n+1번째 숫자 뒤에 숫자가 없으면 n번째 숫자는 짝수이므로 폐기됩니다. , n번째 숫자가 홀수이면 1로 이월됩니다.

n+1번째 숫자 뒤에 0이 아닌 숫자가 있으면 n번째 숫자는 1로 이월됩니다. 홀수 또는 짝수.

    print("{:.2f}".format(1.125))는 소수점 두 자리(n=2)를 유지한 다음 소수점 이하 두 번째 자리의 마지막 자리 2(n+1 자리)를 관찰해야 합니다. n+1번째 숫자는 5이고, 5 이후에는 다른 숫자가 없습니다. n번째 숫자 2는 짝수이므로 바로 버려지므로 최종 결과는 1.12입니다.
  • 십진수를 이진수로 변환

a. 십진수를 이진수로 변환: 2로 나누고 나머지를 취하고 역순으로 정렬;

b 십진수 부동 소수점 수를 이진수로 변환: 밑수로 곱하기;

Inexact mantissa

    십진 부동 소수점 숫자의 소수 부분은 이진수로 변환할 때 무한 소수를 곱할 수 없습니다. 그러나 컴퓨터는 무한 십진수를 처리할 수 없습니다. 십진수 부동 소수점 수에 해당하는 이진수를 최대 53비트까지 유지하며 53비트 이후의 데이터는 직접 잘려 이진수 부동 소수점 수를 다시 변환할 때 부정확해집니다. 십진수로.
  • Decimal

위에서 언급한 것처럼 일부 부동 소수점 숫자에는 부정확한 가수가 있을 수 있으므로 정확한 계산이 필요한 일부 데이터는 처리하기 어렵습니다. 각 부정확한 소수점의 누적은 심각한 데이터 신뢰를 깨뜨릴 수 있습니다. 처리를 위해 Python 표준 모듈 Decimal 모듈 아래의 Decimal 클래스를 사용합니다.

    Decimal은 소수 부동 소수점 숫자에 대한 정밀 산술 지원을 제공합니다. Decimal이 나타내는 부동 소수점 숫자는 정확한 소수이며 부정확한 가수가 없습니다. 또한 Decimal은 ROUND_UP(0에서 멀어지는 반올림), ROUDN_DOWN(0으로 반올림), ROUND_HALF_UP(반올림, 절반은 5를 의미, 위쪽은 0에서 멀어지는 방향을 의미) 등과 같은 "반올림"을 위한 다양한 모드도 제공합니다.
  • Decimal(값)에서 값은 정수, 문자열, 튜플, 부동 소수점 숫자 또는 다른 Decimal 개체를 전달할 수 있습니다. 부동 소수점 숫자를 직접 전달하는 경우 문자열을 사용하여 값에 전달하는 것이 좋습니다. 값이 있더라도 여전히 부정확한 가수가 있을 것입니다.
  • 따라서 "반올림" 기능을 구현하려면 아래와 같이 Decimal을 사용할 수 있습니다.
(1) %: 占位符;
(2) (name):命名占位字符;
(3) flags可选:
1) +: 右对齐,正数加正号,负数加负号;
2) -: 左对齐,正数无符号,负数加负号;
3) 空格: 右对齐(默认的对齐方式),正数前加空格,负数前加负号;
4) 0: 右对齐,以0填充,正数无符号,负数加负号,并将符号放置在0最左侧;
(4) width: 占位宽度, 若指定宽度小于原数据长度则按原长度数据输出;
(5) .precison: 小数点后保留位数;在字符串中则表示截取/字符串切片;
(6) type: 详见如下...

    __str__ 및 __repr__
  • 형식 지정 문자 매개변수에는 %r이 있고 여기에는 r이 있습니다. 호출 __repr__ 매직 메소드이고 그 기능은 __str___과 유사하며 둘 사이의 차이점은 다음과 같습니다.
(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) %%: 转义%,输出百分号。

__str__ 또는 __repr__ 매직 메소드가 Animal 클래스에 정의되어 있지 않으면 cat 객체의 인쇄 출력은 다음과 같습니다.

;

와 유사한 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제