【Python】Python字符串格式化问题:%、format()与f-strings

机器学习初学者

共 6395字,需浏览 13分钟

 ·

2021-07-18 17:00

目   录

一、字符串格式化方法概览

二、format() 常用格式化

    1、通过位置

    2、通过关键字参数

    3、通过对象属性

    4、通过下标

    5、格式限定符

        1)字符的填充与对齐

        2)数字精度与类型f处理

        3)进制转换

        4)千位分隔符

    6、列表字典拆分

三、format() 底层语法


一、字符串格式化方法概览

方法 1 --------  过去的格式化方法,代码中还能经常见到
在 python 2.6 之前,利用 百分号 % 表示占位符,进行格式化

name='小伍哥''Hello,%s'%nameHello,小伍哥

方法 2 --------  现阶段使用最多的方法

Python2.6 引入,它通过 {}: 来代替%表示占位符,性能比 % 更强大,字符串的 format 方法

name='小伍哥''Hello,{}'.format(name)'Hello,小伍哥'

方法 3 -------- 推荐使用的方法

为了进一步简化格式化方法,Eric Smith 在2015年提交了 PEP 498 -- Literal String Interpolation 提案。Python 3.6 引入了新的字符串格式化方式 f-strings,字符串开头加上一个字母 f ,与其它格式化方式相比,不仅简洁明了,可读性更好,更不容易出错,而且运行效率也更高

name='小伍哥'f'Hello,{name}''Hello,小伍哥'

 

Python中常见的格式化的方法主要有三种,本文讲解目前最常用的format格式化方式,后期讲进行对比讲解。


 

二、format() 常用格式化

1、通过位置

'{0},{1}'.format('小伍哥',18)'小伍哥,18'
'{},{}'.format('小伍哥',18)'小伍哥,18'
'{1},{0},{1}'.format('小伍哥',18)'18,小伍哥,18'
'{0}{1}{2}{3}{4}'.format('上','海','自','来','水')'上海自来水'
'{0}{1}{2}{3}{4}{3}{2}{1}{0}'.format('上','海','自','来','水')'上海自来水来自海上'

字符串的format函数可以接受不限个参数,位置可以不按顺序,可以不用或者用多次,不过2.6不能为空{},2.7才可以。foramt会把参数按位置顺序来填充到字符串中,第一个参数是0,然后1……

也可以不输入数字,这样也会按顺序来填充同一个参数可以填充多次,这个是format比%先进的地方

 

2、通过关键字参数

'{name},{age}'.format(age=18,name='小伍哥')'小伍哥,18'

 

3、通过对象属性

class Person:  def __init__(self,name,age):    self.name,self.age = name,age  def __str__(self):      return 'This guy is {self.name},is {self.age} old'.format(self=self)
print(Person('小伍哥',18))This guy is 小伍哥,is 18 old
c = 3-5jprint(('The complex number {0} is formed from the real part {0.real} and the imaginary part {0.imag}.').format(c))The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0

4、通过下标

p=['小伍哥',18]'{0[0]},{0[1]}'.format(p)'小伍哥,18'
coord = (3, 5)print('X: {0[0]}; Y: {0[1]}'.format(coord))X: 3; Y: 5

有了这些便捷的“映射”方式,我们就有了偷懒利器。基本的python知识告诉我们,list和tuple可以通过“打散”成普通参数给函数,而dict可以打散成关键字参数给函数(通过和*)。所以可以轻松的传个list/tuple/dict给format函数。非常灵活。

 

5、格式限定符

它有着丰富的的“格式限定符”(语法是{} 中带: 号)

1)字符的填充与对齐

填充常跟对齐一起使用

^ < >分别是居中、左对齐、右对齐,后面带宽度

: 号后面带填充的字符,只能是一个字符,不指定的话默认是用空格填充

'{:>8}'.format('18')' 18''{:0>8}'.format('18')'00000018''{:*>8}'.format('18')'******18'

注:字符串模块内置函数中也存在对齐的函数 str.center(),str.ljust(),str.rjust(),str.zfill()

'shuai'.center(10,'*')#居中对齐'**shuai***'
'shuai'.ljust(10,'*')#左对齐'shuai*****'
'18'.zfill(10)#右对齐'0000000018'

 

2)数字精度与类型f处理

精度常跟类型f一起使用

'{:.2f}'.format(321.33345)'321.33'
'π is {:.2f}'.format(3.1415926)π is 3.14
'π is %.2f'% 3.1415926π is 3.14
'{0:.4f}+{1:.4f}'.format(321.33345,325.33345)'321.3335+325.3335'
"{:.2%}".format(0.00234)'0.23%'

其中.2表示长度为2的精度,f表示float类型。

数字

格式

输出

描述

3.1415926

{:.2f}

3.14

保留小数点后两位

3.1415926

{:+.2f}

+3.14

带符号保留小数点后两位

-1

{:+.2f}

-1.00

带符号保留小数点后两位

2.71828

{:.0f}

3

不带小数

5

{:0>2d}

05

数字补零 (填充左边, 宽度为2)

5

{:x<4d}

5xxx

数字补x (填充右边, 宽度为4)

10

{:x<4d}

10xx

数字补x (填充右边, 宽度为4)

1000000

{:,}

1,000,000

以逗号分隔的数字格式

0.25

{:.2%}

25.00%

百分比格式

1000000000

{:.2e}

1.00e+09

指数记法

13

{:>10d}

        13

右对齐 (默认, 宽度为10)

13

{:<10d}

13

左对齐 (宽度为10)

13

{:^10d}

    13

中间对齐 (宽度为10)

 

3)进制转换

主要就是进制了,b、d、o、x分别是二进制、十进制、八进制、十六进制。

'{:b}'.format(17)'10001''{:d}'.format(17)'17''{:o}'.format(17)'21''{:x}'.format(17)'11'

  • b: 输出整数的二进制方式

  • c: 输出整数对应的 Unicode 字符;

  • d: 输出整数的十进制方式;

  • o: 输出整数的八进制方式;

  • x: 输出整数的小写十六进制方式;

  • X: 输出整数的大写十六进制方式;

 

数字

格式

输出

描述

11

'{:b}'.format(11)

1011

进制转换

11

'{:d}'.format(11)

11

进制转换

11

'{:o}'.format(11)

13

进制转换

11

'{:x}'.format(11)

b

进制转换

11

'{:#x}'.format(11)

0xb

进制转换

11

'{:#X}'.format(11)

0XB

进制转换

 

4)千位分隔符

用,号还能用来做金额的千位分隔符。

'{:,}'.format(1234567890)'1,234,567,890'

 

6、列表字典拆分

在format格式化时,可使用* 或者 ** 进行对list、tuple拆分。

foods = ['fish', 'beef', 'fruit']s = 'i like eat {} and {} and {}'.format(*foods)# i like eat fish and beef and fruitprint(s)
foods = ['fish', 'beef', 'fruit']s = 'i like eat {2} and {0} and {1}'.format(*foods)# i like eat fruit and fish and beefprint(s)dict_temp = {'name': 'Lily', 'age': 18}
字典需要用 ** 进行拆分
s = 'My name is {name}, i am {age} years old'.format(**dict_temp)print(s) # My name 
kwargs = {'name': 'egon', 'age': 18}print('我的名字是 {name}, 我的年龄是 {age}.'.format(**kwargs)) # 使用**进行解包


三、format() 底层语法

上面讲解了常见的用户,该函数的通用的底层其实非常复杂和通用的,有非常多的参数,且都是可选参数,导致学习起来非常困难,有兴趣的可以仔细研究,format() 方法的语法格式如下:
str.format(args)
str    : 用于指定字符串的显示样式
args: 用于指定要进行格式转换的项,如果有多项,之间有逗号进行分割
学习 format() 方法的难点,在于搞清楚 str 显示样式的书写格式。在创建显示样式模板时,需要使用 {} : 来指定占位符,其完整的语法格式为:

{ [index][ : [ [fill] align] [sign] [#] [width] [.precision] [type] ] }

格式中用 [] 括起来的参数都是可选参数,即可以使用,也可以不使用。
各个参数的含义如下:
index:指定:后边设置的格式要作用到 args 中第几个数据,数据的索引值从 0 开始。如果省略此选项,则会根据 args 中数据的先后顺序自动分配。
fill:指定空白处填充的字符。注意,当填充字符为逗号(,)且作用于整数或浮点数时,该整数(或浮点数)会以逗号分隔的形式输出,例如(1000000会输出 1,000,000)。
align:指定数据的对齐方式,具体的对齐方式如表 1 所示。

align

含义

<

数据左对齐。

>

数据右对齐。

=

数据右对齐,同时将符号放置在填充内容的最左侧,该选项只对数字类型有效。

^

数据居中,此选项需和 width 参数一起使用。

sign:指定有无符号数,此参数的值以及对应的含义如下表所示。

sign参数

含义

+

正数前加正号,负数前加负号。

-

正数前不加正号,负数前加负号。

空格

正数前加空格,负数前加负号。

#

对于二进制数、八进制数和十六进制数,使用此参数,各进制数前会分别显示 0b、0o、0x前缀;反之则不显示前缀。

width:指定输出数据时所占的宽度。

precision:指定保留的小数位数。

type:指定输出数据的具体类型,如下表所示。

type类型值

含义

s

对字符串类型格式化。

d

十进制整数。

c

将十进制整数自动转换成对应的 Unicode 字符。

e 或者 E 

转换成科学计数法后,再格式化输出。

g 或 G

自动在 e 和 f(或 E 和 F)中切换。

b

将十进制数自动转换成二进制表示,再格式化输出。

o

将十进制数自动转换成八进制表示,再格式化输出。

x 或者 X

将十进制数自动转换成十六进制表示,再格式化输出。

f 或者 F

转换为浮点数(默认小数点后保留 6 位),再格式化输出。

%

显示百分比(默认显示小数点后 6 位)。

每个参数的取值范围

str             ::=  [[fill]align][sign][#][0][width][grouping_option][.precision][type]fill            ::=  <any character>align           ::=  "<" | ">" | "=" | "^"sign            ::=  "+" | "-" | " "width           ::=  正整数grouping_option ::=  "_" | ","precision       ::=  正整数type            ::=  "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" |                     "x" | "X" | "%"


···  END  ···

往期精彩回顾




本站qq群851320808,加入微信群请扫码:
浏览 51
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报