关于使用format()方法格式化字符串,读这一篇就够了!

时间:2023-02-25 08:32:03

从Python 2.6开始,又出现了另外一种格式化字符串的方法——format()方法。format()方法是字符串众多方法中的一个,调用这个方法时要使用点操作符(.),该方法返回一个格式化好的字符串。其调用格式如下:

s.format(……)

其中,s是一个待格式化的字符串,里面包含若干组格式说明符(format specifiers),每组格式说明符都放在一对花括号({})之中。格式化之后,花括号连同其中的格式说明符都会被格式好的对象所取代,每组格式说明符都对应一个待格式化的对象。我们要把待格式化的对象以参数的形式传给format函数,待格式化的对象可以有很多个,你可以把它们逐个传递给format函数,也可以先把它们放入元组、列表或者字典再传给format函数。

>>> 'I am {},and I am {} years old.'.format('Jack',18)

'I am Jack,and I am 18 years old.'

上例中,'I am {},and I am {} years old.'是待格式化的字符串,其中包含两个花括号({}),依次对应于两个待格式化的对象('Jack'和18)。格式化之后,这两个花括号就会被格式化好的对象替换掉。需要强调的是,如果花括号中是空的,那花括号的顺序和待格式化的对象的顺序就是一致的,它们之间是一一对应的关系,即左侧第一个花括号对应第一个参数,第二个花括号对应第二个参数,以此类推。并且,由于花括号({})最终全部要被替换,所以花括号的个数应该小于或等于待格式化对象的个数,否则就会引发索引错误。

# {}个数(3个)大于待格式化对象的个数(2个)

>>> 'I am {},and I am {} years old.I love {}'.format('Jack',18)

Traceback (most recent call last):

File "<pyshell#21>", line 1, in <module>

'I am {},and I am {} years old.I love {}'.format('Jack',18)

IndexError: tuple index out of range

此外,我们还可以主动为花括号进行编号。在待格式化的字符串中,从左到右依次为{0}、{1}、{2}……其中,{0}对应第一个参数、{1}对应第二个参数、{2}对应第三个参数……在对花括号进行了编号之后,我们就可以灵活地调整它们的位置了。

>>> 'I am {2} years old.I am {1} and I love {0}'.format('Python','Jack',18)

'I am 18 years old.I am Jack and I love Python'

上例中,{0}对应'Python'、{1}对应'Jack'、{2}对应18。如前所述,当待格式化的对象有多个时,我们既可以像上面这样把它们以参数的形式传递给format函数,也可以先把它们放入一个元组或列表中,再把整个元组或列表传递给format函数。

>>> tu = ('Python','Jack',18)

# {0}对应tu[0],即'Python'

# {1}对应tu[1],即'Jack'

# {2}对应tu[2],即18

# *把元组解包成位置参数

>>> 'I am {2} years old.I am {1} and I love {0}'.format(*tu)

'I am 18 years old.I am Jack and I love Python'

# 使用位置编号和索引从元组获取元素

>>> 'I am {0[2]} years old.I am {0[1]} and I love {0[0]}'.format(tu)

'I am 18 years old.I am Jack and I love Python'

# 把整个元组视为一个对象

>>> 'I love {}'.format(tu)

请注意,在把元组tu传递给format函数时,我们通常会在元组前面加上*号,这表示把元组解包成位置参数,即对元组tu中的各个元素进行格式化。当然,我们也可以不使用*,通过位置编号和索引来获取元组中的各个元素。如果你既没有使用*号,也没有使用位置编号和索引从元组中获取元素,那整个元组会被视作一个对象,且只与前面一个{}相对应。

当然,我们也可以先把待格式化的对象放入一个列表中,然后再把整个列表传递给format函数,传递列表时也要在前面加上*,把列表解包成位置参数。

>>> li = ['Python','Jack',18]

# {0}对应li[0],即'Python'

# {1}对应li[1],即'Jack'

# {2}对应li[2],即18

# *把列表解包成位置参数

>>> 'I am {2} years old.I am {1} and I love {0}'.format(*li)

'I am 18 years old.I am Jack and I love Python'

此外,我们还可以使用位置编号和索引从列表中获取元素,如下:

>>> 'I am {0[2]} years old.I am {0[1]} and I love {0[0]}'.format(li)

'I am 18 years old.I am Jack and I love Python'

与元组一样,如果你既没有使用*号,也没有使用位置编号和索引来获取列表中的元素,那整个列表都会被视作一个对象,且只与前面一个{}相对应。

>>> li

['Python', 'Jack', 18]

# 把整个列表视为一个对象

>>> 'I love {}'.format(li)

"I love ['Python', 'Jack', 18]"

此外,我们还可以把多个待格式化的值放入到一个字典中,然后再把字典作为参数传给format函数。传递字典时,我们要在前面添加两个**号,这表示把字典解包成关键字参数,并在{}中使用字典的键来引用字典中的值。

# **表示把字典解包成关键字参数

>>> dic = {'name': 'Jack', 'age': 18, 'favorite': 'Python'}

>>> 'I am {age} years old.I am {name} and I love {favorite}'.format(**dic)

'I am 18 years old.I am Jack and I love Python'

当然,我们也可以不使用**,而结合使用位置编号和字典的键来获取字典中的值,如下:

>>> dic = {'name': 'Jack', 'age': 18, 'favorite': 'Python'}

# 请注意:在使用字典的键获取值时,请不要在键上加引号。

# 这一点与从普通字典获取值的方法有所不同

>>> 'I am {0[age]} years old.I am {0[name]} and I love {0[favorite]}'.format(dic)

'I am 18 years old.I am Jack and I love Python'

上例中,我们是先创建好了字典,再把字典传递给format函数。其实,我们可以不创建字典,而直接把字典中的键与值传递给format函数,但此时键与值之间不再使用冒号(:),而要使用赋值号(=),形成所谓的“关键字参数”。

# 使用关键字参数

>>> 'I am {age} years old.I am {name} and I love {favorite}'\

.format(name = 'Jack',age = 18,favorite = 'Python')

'I am 18 years old.I am Jack and I love Python'

 


“人生苦短,要学Python!”

更多内容,请关注:

关于使用format()方法格式化字符串,读这一篇就够了!


那么,花括号中都可以有些什么呢?整理如下:

关于使用format()方法格式化字符串,读这一篇就够了!

请注意:使用中括号([])括起来的部分是可选的,你可以根据具体情况自行决定是否使用。

-          No或Key:编号或字典键,用来指定花括号与哪个待格式化的对象对应。该部分可省略,省略表示从左到右从0开始编号。

-          显式转换标志(Explicit Conversion Flag,可选):在对待格式化对象进行格式化之前先做一下转换。目前只有如下两种转换标志可用:

  • !r:使用repr()把待格式化的对象转换为字符串
  • !s:使用str()把待格式化的对象转换为字符串

接下来,从冒号开始是格式化说明符部分,格式化说明符可以省略。若不指定格式说明符,则默认使用标准格式说明符。如果指定了格式化说明符,则前面的冒号一定不能省略。

-          填充(fill):指定空白处的填充字符,只能是单个字符。若不指定,则默认使用空格填充。

-          对齐方式(align):指定被格式化对象在字符串中的对齐方式。可使用的对齐方式有:

  • <:内容左对齐,这是字符串的默认对齐方式。若未指定填充字符,则空白处使用空格填充。
  • >:内容右对齐,这是数字的默认对齐方式。若未指定填充字符,则空白处使用空格填充。
  • =:内容右对齐,且只对数字类型有效。若有符号,将其放在填充字符左侧,形成“符号+填充字符+数字”的格式,比如-000000120。
  • ^:内容居中对齐。空白处按fill指定的字符进行填充。若未指定填充字符,则空白处使用空格填充。

请注意,fill、align与minimum width(最小宽度)有密切关系。若不指定最小宽度,则默认使用填充数据的宽度,此时fill和align就不再有意义。若最小宽度大于填充数据宽度,并指定了填充字符,则后面必须指定align,否则会报错。

-        符号(sign):sign只对数字类型有效,有如下三种取值:

  • +:显示数字的正负号。
  • -:只显示数字的负号(正号不显示,这是默认行为)。
  • 空格:正数前加空格,负数前加负号

-          #:输出二进制、八进制、十六进制整数时,添加前缀0b、0o、0x。

-          0:这个0位于最小宽度前,表示空白处填充0,相当于把fill设置为0且使用=对齐方式。

-          最小宽度(minimum width):这是一个十进制整数,用来指定格式化字段宽度(以字符计)。若不指定最小宽度或指定宽度小于或等于被格式化数据的宽度,则使用被格式化数据的宽度。

-          分组符号(grouping_option):为数字添加千位分隔符,可以使用,或_。

-          精度(precision):精度是一个十进制数字,指定精度时,前面一定要加上点号。若被格式化的数据为浮点数,精度用来指定要保留的小数位数;若被格式化的数据为字符串,精度用来指定保留多少个字符,当精度值等于或大于字符串长度时,显示整个字符串。

-          格式化类型(type):格式化类型用来指定数据的格式化方式,具体分为如下几种情况:

1)         当待格式化的数据为字符串时,使用s格式化类型,此时s可以省略。

2)         当待格式化的数据为整数时,可以使用的格式化类型有:

      • b:把十进制整数转换成二进制数然后格式化
      • c:把十进制整数视作Unicode码,转换成相应的Unicode字符,再做格式化
      • d:十进制整数
      • o:把十进制整数转换成八进制数然后格式化
      • x:把十进制整数转换成十六进制数然后格式化(9以上的数字为小写)
      • X:把十进制整数转换成十六进制数然后格式化(9以上的数字为大写)
      • n:等同于d,但它使用当前区域设置插入合适的数字分隔字符
      • 省略:等同于d

3)         当待格式化的数据为浮点数时,可以使用的格式化类型有:

      • e:使用科学计数法(小e)表示浮点数,然后再格式化。
      • E:使用科学计数法(大E)表示浮点数,然后再格式化。
      • f:先转换成浮点数(默认保留6位),再做格式化
      • F:先转换成浮点数(默认保留6位),再做格式化
      • g:根据数字大小,自动在f和e之间进行切换
      • G:根据数字大小,自动在f和E之间进行切换
      • n:数字,功能与g相同。但但它使用当前区域设置插入合适的数字分隔字符
      • %:显示百分比。默认显示小数点后六位
      • 省略:等同于g,但至少打印小数点后一位数

下面举一些例子:

# 未指定填充字符,则使用空格填充

# 20为最小宽度

>>> 'I love {:20}'.format('Python')

'I love Python              '

# 使用星号填充,并把字符串居中对齐

>>> 'I love {:*^20}'.format('Python')

'I love *******Python*******'

>>> '{:*<20}'.format(-52)

'-52*****************'

>>> '{:*=20}'.format(-52)

'-*****************52'

>>> '{:*<20}'.format(52)

'52******************'

# <和20之间有空格

>>> '{:*< 20}'.format(52)

' 52*****************' # 52前面有个空格

# <和20之间有空格

>>> '{:*< 20}'.format(-52)

'-52*****************'

# +表示显示正负号

# #表示显示二进制、八进制、十六进制前缀

# 第一个0表示用0填充

#10表示最小宽度

# x表示把55转换为十六进制数

>>> '{:+#010x}'.format(55)

'+0x0000037'

# 10是最小宽度

# .3是数字精度

>>> '{:10.3f}'.format(3.1415926)

'     3.142'

# .3表示保留3个字符

>>> '{:10.3s}'.format('Python')

'Pyt       '

# 显示百分比

>>> '{:10.3%}'.format(3.1415926)

'  314.159%'

最后,提醒大家注意的是,{}可以嵌套使用,例如:

# {1}用来获取第二个参数3,用作数字精度

>>> 'pi = {0:.{1}f}'.format(3.1415926,3)

'pi = 3.142'

到此为止,关于使用format函数格式化字符串的内容就全部讲完了。相比于使用%格式化字符串,使用format函数格式化字符串更灵活、更强大,但也更复杂。对于简单的字符串格式化,我们完全可以使用%来做,但对于一些较为复杂的字符串格式化任务,毫无疑问,使用format会更合适一些。


“人生苦短,要学Python!”

更多内容,请关注:

关于使用format()方法格式化字符串,读这一篇就够了!

关于使用format()方法格式化字符串,读这一篇就够了!的更多相关文章

  1. python中format&lpar;&rpar;方法格式化字符串

    format()是python2.6新增的一个格式化字符串的方法,功能非常强大,有可能在未来完全替代%格式化方法,相比 % ,format()的优点有: 1 .格式化时不用关心数据类型的问题,form ...

  2. Java中利用MessageFormat对象实现类似C&num; string&period;Format方法格式化

    我们在写C#代码的时候常常会使用到string.Format("待格式化字符串{0},{1},....",参数1,参数2,...),来格式化字符串,特别是拼接字符的时候,这种方式使 ...

  3. Python中应该使用&percnt;还是format来格式化字符串?

    转载自http://www.cnblogs.com/liwenzhou/p/8570701.html %的特点是,前面有几个%,后面的括号里就得有几个参数,如果只有一个%,括号可以省略 基本格式 'a ...

  4. Python中使用&percnt;还是format来格式化字符串?

    Python中应该使用%还是format来格式化字符串?   %还是format Python中格式化字符串目前有两种阵营:%和format,我们应该选择哪种呢? 自从Python2.6引入了form ...

  5. Python面试题之Python中应该使用&percnt;还是format来格式化字符串?

    Python中格式化字符串目前有两种阵营:%和format,我们应该选择哪种呢? 自从Python2.6引入了format这个格式化字符串的方法之后,我认为%还是format这根本就不算个问题.不信你 ...

  6. Python中该使用&percnt;还是format来格式化字符串?

    %还是format 1.皇城PK Python中格式化字符串目前有两种阵营:%和format,我们应该选择哪种呢? 自从Python2.6引入了format这个格式化字符串的方法之后,我认为%还是fo ...

  7. Python中用format函数格式化字符串的用法

    这篇文章主要介绍了Python中用format函数格式化字符串的用法,格式化字符串是Python学习当中的基础知识,本文主要针对Python2.7.x版本,需要的朋友可以参考下   自python2. ...

  8. Python中用format函数格式化字符串

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存. 1.百分号方式 语法:%[( ...

  9. 【python】format函数格式化字符串的用法

    来源:http://www.jb51.net/article/63672.htm 自python2.6开始,新增了一种格式化字符串的函数str.format(),可谓威力十足.那么,他跟之前的%型格式 ...

随机推荐

  1. LINQ to SQL Select查询

    1. 查询所有字段 using (NorthwindEntities context = new NorthwindEntities()) { var order = from n in contex ...

  2. RMAN还原32位数据库到64位实例的错误处理

    将ORACLE 10g 32bit数据库还原到测试机ORACLE 10g 64bit的数据库实例上, 还原.恢复数据库后,使用open resetlogs打开数据库后,发现警告日志里面有ORA-120 ...

  3. 04-c&num;入门(类型转换)

    “无论是什么类型,所有的数据都是一系列的位,即一系列0和1.变量的含义是通过解释这些数据的方式来传达的.”——这句原话是书上翻译的,不过后一句话总感觉理解起来不是很通俗,自己觉得这样理解可能会合适些: ...

  4. CSS全屏布局的5种方式

    × 目录 [1]float [2]inline-block [3]table[4]absolute[5]flex[6]总结 前面的话 全屏布局在实际工作中是很常用的,比如管理系统.监控平台等.本文将介 ...

  5. Lua-C交互函数

    lua_gettable(lua_State * , tableIndex) //获取表的在key位置的值 过程:tableIndex为表在栈的位置,例:-2为第二个位置 , 此时会弹(出)栈作为参数 ...

  6. 微信小程序字体设置

    微信小程序css篇----字体(Font) 一.字体:font.属性在一个声明中设置所有字体属性. 可设置的属性是(按顺序): "font-style font-variant font-w ...

  7. Java开发知识之Java的数字处理类Math类

    Java开发知识之Java的数字处理类Math类 一丶Java.text.DecimalFormat类与NumberFormat类 首先 Java.text.DecimalFormat指的是Decim ...

  8. JAVA-类方法与实例方法

    1.实例方法:一个方法如果不加static关键字,那么这个方法是实例方法.意思是他属于类的某个实例,通过这个实例调用它,对类的其他实例不产生影响. 2.类方法:也称静态方法.在方法前加static关键 ...

  9. 【转】C&num;单元测试,带你快速入门

    [转]C#单元测试,带你快速入门 注:本文示例环境 VS2017 XUnit 2.2.0 单元测试框架 xunit.runner.visualstudio 2.2.0 测试运行工具 Moq 4.7.1 ...

  10. 如何查看Python对象的属性

    在Python语言中,有些库在使用时,在网络上找到的文档不全,这就需要查看相应的Python对象是否包含需要的函数或常量.下面介绍一下,如何查看Python对象中包含哪些属性,如成员函数.变量等,其中 ...