百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

实战python中强大的format函数,居家必备,真心好用!

lipiwang 2024-10-18 09:41 10 浏览 0 评论

一个格式化输出的例子

相应源码

看完示例,我们一起研究一下这个format函数到底什么鬼!

首先大家要知道,format函数是字符串对象的一个方法,也可以写为str.format(),它提供了非常强大的用于创建字符串的途径。对于简单的情况,使用str.format()方法是容易的,但是如果需要进行复杂的格式化操作,就要学习该方法需要的格式化语法。

str.format()方法会返回一个新字符串,在新字符串中,原字符串的替换字段被适当格式化后的参数所替代,例如;

>>> "{0}语言{1}函数可以用来生成格式化字符串.".format("Python", "format")

'Python语言format函数可以用来生成格式化字符串.'

每个替换字段都是由包含在花括号中的字段名标识的。如果字段名是简单的整数,就将被作为传递给str.format()方法的一个参数的索引位置。因此,在这种情况下,名为0的字段被第一个参数所替代,名为1的字段则被第二个参数所替代。

如果需要在格式化字符串中包含花括号,就需要将其复写,下面看示例:

>>> "{{{{{0}语言}}{1}函数}}可以用来生成格式化字符串。".format("Python", "format")

'{{Python语言}format函数}可以用来生成格式化字符串。'

值得提醒的是,str.format()函数也可以用来连接字符串,作用同str.join()函数。

替换字段可以使用下面的任意一种语法格式:

1、{字段名}

2、{字段名!转换格式符}

3、{字段名:格式规约}

4、{字段名!转换格式符:格式规约}

先上例子,再继续说

四种语法格式示例

>>> #{字段名}

>>> '{0}'.format('Hello world!')

'Hello world!'

>>> #{字段名!转换格式符}

>>> '{0!a}'.format('战狼2')

"'\\u6218\\u72fc2'"

>>> #{字段名:格式化规约}

>>> '{0:a>30,.2f}'.format(1234567.876543)

'aaaaaaaaaaaaaaaaaa1,234,567.88'

>>> #{字段名!转换格式符:格式化规约}

>>> '{0!a:>30}'.format('战狼2')

" '\\u6218\\u72fc2'"

一、字段名

字段名或者是一个与某个str.format()方法参数对应的整数来确定位置,或者是方法的某个关键字参数的名称。看示例。

>>> #通过参数对应的整数来确定位置

>>> "{0}今年{1}岁了。".format("妈妈",76)

'妈妈今年76岁了。'

>>> #通过关键字参数名称确定位置

>>> "{who}今年{age}岁了。".format(who="妈妈",age=76)

'妈妈今年76岁了。'

>>> #上面两种方法混用

>>> "{who}今年{0}岁了。".format(76,who="妈妈")

'妈妈今年76岁了。

字段名还可以使用集合数据类型------比如,列表List、字典Dict。在这样的情况下,我们可以包含一个索引(不是一个分片)来标识特定的数据项,看示例:

>>> #列表索引来确定数据项

>>> familylist = ["妈妈",76]

>>> "{0[0]}今年{0[1]}岁了。".format(familylist)

'妈妈今年76岁了。'

>>> #词典关键字确定数据项

>>> familydict = dict(who="妈妈",age=76)

>>> "{0[who]}今年{0[age]}岁了。".format(familydict)

'妈妈今年76岁了。'

总而言之,通过字段名语法,可以引用传递给str.format()方法的位置参数与关键字参数。如果参数是集合数据类型,比如列表或字典,或参数还包含一些属性,那么可以使用中括号“[]”或句点"."表示法存取所需的部分。看下图

带注释的字段名实例

值得注意的是,从Python3.1开始,忽略字段名也被认为是合法的,Python会自动处理(使用从0开始的数值),比如:

>>> "{} {} {}".format("Python","can","count")

'Python can count'

二、转换格式符

这里只有三个转换符号,用"!"开头。"!r"对应 repr(),也就是强制使用表象形式;"!s"对应 str(),也就是强制使用字符串形式; "!a"对应ascii(),用于强制使用表象形式,但仅限于ASCII字符。看示例:

表象形式输出与打印输出的区别

>>> #Python的表象形式输出

>>> import decimal

>>> decimal.Decimal("3.14159265")

Decimal('3.14159265')

>>> #Python的打印形式输出,更关注读者感兴趣的东西

>>> print(decimal.Decimal("3.14159265"))

3.14159265

四种准换格式符的对比示例

>>> import decimal

>>> "{0}-{0!s}-{0!r}-{0!a}".format(decimal.Decimal("3.14159265"))

"3.14159265-3.14159265-Decimal('3.14159265')-Decimal('3.14159265')"

三、格式化规约

整数、浮点数以及字符串的默认格式通常都足以满足要求,但是如果需要实施更精确的控制,我们就可以通过格式规约很容易地实现。为了更加易于掌握详细信息,我们分别讲述格式化字符串、整数和浮点数,先看下图的通用语法。

格式化规约的通常形式

  • 字符串格式规约

对于字符串而言,我们可以控制的包括填充字符、字段内对齐以及字段宽度的最小值与最大值。

字符换格式规约是使用冒号(:)引入的,其后跟随可选的字符对--------一个填充字符(可以没有)与一个对齐字符(<用于左对齐,^用于中间对齐,>用于右对齐),之后跟随的是可选的最小宽度(整数),如果需要指定最大宽度,就在其后使用句点,句点后跟随一个整数值。注意:如果我们指定一个填充字符,就必须同时指定对齐字符。看示例。

>>> s = "字符串格式化"

>>> "{0}".format(s)#默认格式化

'字符串格式化'

>>> "{0:30}".format(s)#最小宽度30

'字符串格式化 '

>>> "{0:>30}".format(s)#最小宽度30,右对齐

' 字符串格式化'

>>> "{0:^30}".format(s)#最小宽度30,居中对齐

' 字符串格式化 '

>>> "{0:-^30}".format(s)#最小宽度30,居中对齐,'-'填充

'------------字符串格式化------------'

>>> "{0:.<30}".format(s)#最小宽度30,左对齐,'.'填充

'字符串格式化........................'

>>> "{0:.5}".format(s)#最大宽度5

'字符串格式'

>>> maxwidth = 4

>>> "{0}".format(s[:maxwidth])#采用字符串分片方式动态控制输出格式

'字符串格'

>>> "{0:.{1}}".format(s,maxwidth)#采用内部替换字段方式动态控制输出格式

'字符串格'

请大家注意以上最后两个示例,我们可以通过使用标准的字符串分片和使用内部替换字段两种方式动态控制输出格式。

  • 整数格式规约

对于整数,通过格式规约,可以控制填充字符、字段内对齐、符号、最小字段宽度、基数等。

整数格式规约以冒号开始,其后可以跟随一个可选的字符对----------一个填充字符(可以没有)与一个对齐字符(<用于左对齐,^用于中间对齐,>用于右对齐,=用于在符号与数字之间进行。填充),之后跟随的是可选的符号字符,+表示必须输出符号,-表示只输出负数符号,空格表示为正数输出空格、为负数输出符号-。在之后跟随的是可选的最小宽度整数值--------其前可以使用字符#引导,以便获取某种基数进制为前缀的输出(对二进制、八进制、十六进制数值),也可以以0引导,以便在对齐时使用0填充。如果希望输出其他进制数据,而非十进制数,就必须添加一个类型字符--------b用于表示二进制,o用于表示八进制,x用于表示小写十六进制,X用于表示大写十六进制,为了完整性,也可以用d表示十进制整数。此外,还有两个其他类型字符:c,表示输出整数对应的Unicode字符;n,表示以场所敏感的方式输出数字。

字很多,但是看懂了比较容易帮助理解,下面看代码示例。

>>> #填充示例

>>> "{0:0=12}".format(1234567)#用0填充,最小宽度12

'000001234567'

>>> "{0:0=12}".format(-1234567)#用0填充,最小宽度12,数值为负数

'-00001234567'

>>> "{0:012}".format(1234567)#用0填充,最小宽度12

'000001234567'

>>> "{0:a=12}".format(1234567)#用a填充,最小宽度12

'aaaaa1234567'

>>> #对齐示例

>>> "{0:*<15}".format(1234567)#用*填充,最小宽度15,左对齐

'1234567********'

>>> "{0:*>15}".format(1234567)#用*填充,最小宽度15,右对齐

'********1234567'

>>> "{0:*^15}".format(1234567)#用*填充,最小宽度15,居中对齐

'****1234567****'

>>> "{0:*^15}".format(-1234567)#用*填充,最小宽度15,居中对齐,数值为负

'***-1234567****'

>>> #符号字符示例

>>> "[{0:}][{1:}]".format(7654321,-1234567)#正号用空格,负号用-号

'[7654321][-1234567]'

>>> "[{0: }][{1: }]".format(7654321,-1234567)#正号用空格,负号用-号

'[ 7654321][-1234567]'

>>> "[{0:+}][{1:+}]".format(7654321,-1234567)#强制用符号,正号用+号,负号用-号

'[+7654321][-1234567]'

>>> "[{0:-}][{1:-}]".format(7654321,-1234567)#必须用符号才用符号,正号不用符号,负号用-号

'[7654321][-1234567]'

>>> #类型字符示例

>>> "[{0:b}][{0:o}][{0:x}][{0:X}]".format(12345678)#b是二进制,o是八进制

'[101111000110000101001110][57060516][bc614e][BC614E]'

>>> "[{0:#b}] [{0:#o}] [{0:#x}] [{0:#X}]".format(12345678)#x是小写十六进制,X是大写十六进制

'[0b101111000110000101001110] [0o57060516] [0xbc614e] [0XBC614E]'

>>> #,号分组示例

>>> "[{0:,}] [{0:*>13,}]".format(123456789)

'[123,456,789] [**123,456,789]'

  • 浮点数格式规约

对于浮点数,通过格式规约,可以控制填充字符、字段对齐、符号、最小字段宽度、十进制小数点后的数字个数,以及是以标准形式、指数形式还是以百分数的形式输出数字。

用于浮点数的格式规约与用于整数的格式规约是一样的,只是在结尾处有两个差别。在可选的最小宽度后面,通过写一个句点并在其后跟随一个整数,我们可以指定在小数点后跟随的数字个数。我们也可以在结尾处添加一个类型字符:e表示使用小写字母e的指数形式,E表示使用大写字母E的指数形式,f表示标准的浮点形式,g表示“通常”格式——这与f的作用是相同的,除非数字特别大(在这种情况下与e的作用相同——以及几乎与g等同的G,但总是使用f或E)。另一个可以使用的是%——这会导致数字扩大100倍,产生的数字结果使用f并附加了一个%字符的格式输出。请看示例。

>>> #填充示例

>>> "{0:0=18}".format(1234567.76543)#用0填充,最小宽度18

'000001234567.76543'

>>> #对齐示例

>>> "{0:*^18}".format(1234567.76543)#用*填充,最小宽度18,居中对齐

'**1234567.76543***'

>>> #符号字符示例

>>> "[{0:+}][{1:+}]".format(1234567.76543,-1234567.76543)#强制用符号,正号用+号,负号用-号

'[+1234567.76543][-1234567.76543]'

>>>

>>> #,号分组示例

>>> "[{0:,}] [{0:*>18,}]".format(1234567.76543)

'[1,234,567.76543] [***1,234,567.76543]'

>>> #指数形式和标准形式示例

>>> "[{0:12.2e}] [{0:12.2f}]".format(1234567.76543)#最小宽度12,小数点后2位,第一个用指数e形式表示

'[ 1.23e+06] [ 1234567.77]'

>>> "[{0:*>12.2e}] [{0:*>12.2f}]".format(1234567.76543)#最小宽度12,小数点后2位,第一个用指数e形式表示,用*填充

'[****1.23e+06] [**1234567.77]'

>>> "[{0:*>+12.2e}] [{1:*>+12.2f}]".format(1234567.76543,-1234567.76543)#最小宽度12,小数点后2位,第一个用指数e形式表示,用*填充,强制使用符号

'[***+1.23e+06] [*-1234567.77]'

四、几点细节

  • 类内格式化重写

类和类型可以定义一个__format__()方法来控制怎样格式化自己。它会接受一个格式化指示符作为参数,根据format前的字符串格式来定制不同的显示,如: ’{:xxxx}’ 此时xxxx会作为参数传入__format__函数中:

  1. class move(object):

  2. def __format__(self, format):

  3. if (format == 'jump'):

  4. return "I'm afraid I can't do that."

  5. return 'move'

  6. '{:jump}'.format(move())

  7. 输出结果:I'm afraid I can't do that.

还有一个内置的format()方法可以用来格式化一个值。它会调用类型的__format__()方法,并将格式化指示符作为参数传进去。

  1. >>> format(75.6564, '.2f')

  2. '75.66'

  • 时间日期的特例

  1. >>> from datetime import datetime

  2. >>> '{:%Y-%m-%d %H:%M}'.format(datetime(2018, 2, 3, 4, 5))

  3. '2018-02-03 04:05'

  • 中文字符无法对齐问题

中文字符在字符占用上相当于两个英文字符,但是字体设计上,一般一个中文字符的宽度不会等于两个英文字符的宽度,所以打印出来的效果有偏差。

  1. c = [

  2. '爱',

  3. '爱爱',

  4. '爱爱爱',

  5. '爱爱爱爱',

  6. '爱爱爱爱爱',

  7. '爱爱爱爱爱爱',

  8. '爱爱爱爱爱爱爱'

  9. ]

  10. print('----正常字符串格式化:----')

  11. for x in range(len(c)):

  12. print('|%20s|' % c[x])

效果如下:

打印出的字符有偏差,无法对齐

但是等宽字符一个中文字体的宽度刚好等于两个英文字符宽度。我们可以根据这个,自动计算字符串的长度。

  1. c = [

  2. '爱',

  3. '爱爱',

  4. '爱爱爱',

  5. '爱爱爱爱',

  6. '爱爱爱爱爱',

  7. '爱爱爱爱爱爱',

  8. '爱爱爱爱爱爱爱'

  9. ]

  10. def chinese(data):

  11. count = 0

  12. for s in data:

  13. if ord(s) > 127:

  14. count += 1

  15. return count

  16. print('----通过函数计算长度格式化:----')

  17. for x in range(len(c)):

  18. number = chinese(c[x])

  19. newStr = '{0:{wd}}'.format(c[x],wd=20-number)

  20. print('|%s|' % newStr)

通过函数计算长度格式化

好的,今天我们的学习就到这里吧,相信大家应该对str.format()函数有了一个了解了,有什么疑问或者想和我交流就请私信或留言给我吧。

相关推荐

前端入门——css 网格轨道详细介绍

上篇前端入门——cssGrid网格基础知识整体大概介绍了cssgrid的基本概念及使用方法,本文将介绍创建网格容器时会发生什么?以及在网格容器上使用行、列属性如何定位元素。在本文中,将介绍:...

Islands Architecture(孤岛架构)在携程新版首页的实践

一、项目背景2022,携程PC版首页终于迎来了首次改版,完成了用户体验与技术栈的全面升级。作为与用户连接的重要入口,旧版PC首页已经陪伴携程走过了22年,承担着重要使命的同时,也遇到了很多问题:维护/...

HTML中script标签中的那些属性

HTML中的<script>标签详解在HTML中,<script>标签用于包含或引用JavaScript代码,是前端开发中不可或缺的一部分。通过合理使用<scrip...

CSS 中各种居中你真的玩明白了么

页面布局中最常见的需求就是元素或者文字居中了,但是根据场景的不同,居中也有简单到复杂各种不同的实现方式,本篇就带大家一起了解下,各种场景下,该如何使用CSS实现居中前言页面布局中最常见的需求就是元...

CSS样式更改——列表、表格和轮廓

上篇文章主要介绍了CSS样式更改篇中的字体设置Font&边框Border设置,这篇文章分享列表、表格和轮廓,一起来看看吧。1.列表List1).列表的类型<ulstyle='list-...

一文吃透 CSS Flex 布局

原文链接:一文吃透CSSFlex布局教学游戏这里有两个小游戏,可用来练习flex布局。塔防游戏送小青蛙回家Flexbox概述Flexbox布局也叫Flex布局,弹性盒子布局。它决定了...

css实现多行文本的展开收起

背景在我们写需求时可能会遇到类似于这样的多行文本展开与收起的场景:那么,如何通过纯css实现这样的效果呢?实现的难点(1)位于多行文本右下角的展开收起按钮。(2)展开和收起两种状态的切换。(3)文本...

css 垂直居中的几种实现方式

前言设计是带有主观色彩的,同样网页设计中的css一样让人摸不头脑。网上列举的实现方式一大把,或许在这里你都看到过,但既然来到这里我希望这篇能让你看有所收获,毕竟这也是前端面试的基础。实现方式备注:...

WordPress固定链接设置

WordPress设置里的最后一项就是固定链接设置,固定链接设置是决定WordPress文章及静态页面URL的重要步骤,从站点的SEO角度来讲也是。固定链接设置决定网站URL,当页面数少的时候,可以一...

面试发愁!吃透 20 道 CSS 核心题,大厂 Offer 轻松拿

前端小伙伴们,是不是一想到面试里的CSS布局题就发愁?写代码时布局总是对不齐,面试官追问兼容性就卡壳,想跳槽却总被“多列等高”“响应式布局”这些问题难住——别担心!从今天起,咱们每天拆解一...

3种CSS清除浮动的方法

今天这篇文章给大家介绍3种CSS清除浮动的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。首先,这里就不讲为什么我们要清楚浮动,反正不清除浮动事多多。下面我就讲3种常用清除浮动的...

2025 年 CSS 终于要支持强大的自定义函数了?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!1.什么是CSS自定义属性CSS自...

css3属性(transform)的一个css3动画小应用

闲言碎语不多讲,咱们说说css3的transform属性:先上效果:效果说明:当鼠标移到a标签的时候,从右上角滑出二维码。实现方法:HTML代码如下:需要说明的一点是,a链接的跳转需要用javasc...

CSS基础知识(七)CSS背景

一、CSS背景属性1.背景颜色(background-color)属性值:transparent(透明的)或color(颜色)2.背景图片(background-image)属性值:none(没有)...

CSS 水平居中方式二

<divid="parent"><!--定义子级元素--><divid="child">居中布局</div>...

取消回复欢迎 发表评论: