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

目   录

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

二、format() 常用格式化

    1、通过位置

    2、通过关键字参数

    3、通过对象属性

    4、通过下标

    5、格式限定符

        1)字符的填充与对齐

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

        3)进制转换

        4)千位分隔符

    6、列表字典拆分

三、format() 底层语法

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

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

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

方法 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-5j
print(('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 fruit
print(s)


foods = ['fish', 'beef', 'fruit']
s = 'i like eat {2} and {0} and {1}'.format(*foods)
# i like eat fruit and fish and beef
print(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  ···





往期精彩回顾



适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑温州大学《机器学习课程》视频
本站qq群851320808,加入微信群请扫码:

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值