python格式化输出函数之format

format相对于老版的%有很多优点

1.不需要理会数据类型

2.单个参数可以多次输出,参数顺序可以不同

3.填充方式十分灵活,对齐方式异常强大

4.官方推荐用的方式,%方式在后面的版本终将会被淘汰

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

‘I love {0} ,I study {0} {1} years’.format(‘python’, 5) ==>I love python,I study python 5 years

format格式:

“{[field_name][!conversion][:][[fill]align][sign][#][0][width][,][.precision][type]}”.format()

1.字段名field_name

(1)每个替换字段由包含在花括号中的field_name标识的,如果field_name是简单的整数,就将被作为传递给str.format()的一个参数的索引位置,这种情况下,{0}、{1}..分别被format参数列表的第1、2….个参数代替,如果需要输出花括号,那就写两遍:{{0}}

(2)可以很容易连接字符串其他数据类型,当然也可以用来连接字符串,但最好用str.join

“I {0}{1}{2}”.format(‘你’,[1,2],(‘as’,3))===> “I 你[1, 2](‘as’, 3)”

(3)字段名为关键字参数的名称:关键字参数要在所有位置参数后

“{who} turned {age} this year”.format(who=’she’, age=88)==>she turned 88 this year

“the {who} was {0} this year”.format(12, who=’boy’)==>the boy was 12 this year

(4)字段名可以引用集合类型数据:利用列表、字符串、元组的索引

l=[‘python’, ‘c’, ‘c++’, ‘ruby’, ‘java’]

‘I learn {0[1]} first,then {0[2]} and {0[4]},finally I for in love with {0[0]}’.format(l) ==> ‘I learn c first,then c++ and java,finally I for in love with python’

(5)字典类型的参数:

d=dict(a=’hello’, b=’world’) =====>{“a”:”hello”, “b”:”world”}

“{0[a]} {0[b]}!!!”.format(d) ======>’hello world!!!’

这里需要注意的是:{0[a]}这里的a没有引号,加了会报错,但是如果是单纯的字典利用key取values的时候必须加引号:d[‘a’],d[‘b’]

(6)用句点引用参数的属性值

import math

“math.pi == {0.pi}”.format(math) ===>’math.pi == 3.141592653589793’

(7) py3.1以后,忽略字段名成为可能,这种情况下,Python会自动的进行处理

“{}:{}:{}”.format(‘a’,’b’,’c’) ===> ‘a:b:c’

(8)序列解析传参技术

“{0}{1}{2}”.format(*[1,2,3]) ==>’123’

“{0} {1}{2}”.format(*(‘hello’,’world’,3)) ==>’hello world3’

“{a} {b} {c}”.format(**{‘a’:’I’, ‘b’:’love’, ‘c’:’python’}) ===> ‘I love python’

2.转换conversion:!s !r !a

通过向字段中添加conversion指定符可以强制指定结果是以字符串形式输出还是以表象形式输出;有三个这种指定符:s,用于强制使用字符串形式,r,用于强制使用表象形式,a用于强制使用表象形式但仅限于ASCII字符:

import decimal

“{0} {0!s} {0!r} {0!a}”.format(decimal.Decimal(‘93.4’)) ==>”93.4 93.4 Decimal(‘93.4’) Decimal(‘93.4’)”

由于上面这个字符串仅由ASCII字符组成,所有!r和!a一样,下面这种方法可以阻止非ascii字符输出

“{0} {0!s} {0!r} {0!a}”.format(“我爱python”) ==>”我爱python 我爱python ‘我爱python’ ‘\u6211\u7231python’”

3.格式规约(这部分讲的是冒号之后的部分):[[fill]align][sign][#][0][width][,][.precision]

对于字符串而言,我们可以控制的包括填充字符、字段内对其方式、字段宽度(最大值、最小值)、整数分隔符(一般是逗号),浮点数精度控制

(1)fill填充字符可以是除{外的字符,一般可以是0,#,*等,但是只能为1个字符,这里需要注意的是如果指定了fill,就一定要指定对齐字符align,对齐有下面三种:向左对齐<;向右对齐>;居中对齐^;再之后为可选的最小宽度和最大宽度(最大宽度前面加上句点.)

例子:

s=’The sword of truth’

‘{0:25}’.format(s) ==> ‘The sword of truth ’

‘{0:>25}’.format(s) ==> ’ The sword of truth’

‘{0:<25}’.format(s) ==> ‘The sword of truth ’

‘{0:^25}’.format(s) ==> ’ The sword of truth ’

‘{0:-^25}’.format(s) ==> ‘—The sword of truth—-’

‘{0:#^25}’.format(s) ==> ‘###The sword of truth####’

‘{0:.<25}’.format(s) ==> ‘The sword of truth…….’

注意下面两种情况:

‘{0:.25}’.format(s) ===》’The sword of truth’

‘{0:.5}’.format(s) ===》’The s’

这里的句点不是填充符号,因为上面说过,fill必须和align一起出现,所以这里的句点表示的是最大宽度:

最小宽度为m 最大宽度为n 实际宽度为w

1) m、n>w 按最小宽度填充字符

‘{0:^5.6}’.format(‘123’) ==> ‘*123’

‘{0:^6.5}’.format(‘123’) ==> ‘*123*’

2)w>m、n截断

w>m>n ==> ‘{0:^6.5}’.format(‘1232345’) ==> ‘12323’

w>n>m ==> ‘{0:*^5.6}’.format(‘1232345’) ==> ‘123234’

3)m>w>n

‘{0:^6.4}’.format(‘12325’) ==> ‘*1232’

4)n>w>m

‘{0:*^4.6}’.format(‘12325’) ==> ‘12325’

5)单个

‘{0:*^4}’.format(‘12325’) ===> ‘12325’

‘{0:^6}’.format(‘12325’) ===>’12325’

‘{0:*^.4}’.format(‘12325’)===>’1232’

‘{0:*^.6}’.format(‘12325’)===> ‘12325’

(2)sign对于数字类型有效:+ -能在正数前面加上一个+,这个只需要记住他的位置就好了:[[fill]align][sign][#][0][width][,][.precision]

‘{0:#<+20.6f}’.format(12325.343) ==>’+12325.343000#######’

‘{0:b} {0:o} {0:x} {0:X}’.format(1461287) ==>’101100100110000100111 5446047 164c27 164C27’

注意:他们参数只能是数字不能使字符串,这里的b、o、x分别是数字的二进制、八进制、16进制、d为10进制是默认情况可以不写。

在宽度后面可以加上一个逗号用于对整数分组

‘{0:,}’.format(1461287) ==> ‘1,461,287’

(3)对于浮点数的格式规约在结尾处有点差别,第一在可选最小宽度后面可以通过一个句点后跟一个整数指定保留小数的位数(包括小数点),也可以早结尾处添加一个类型符号:e表示使用指数形式,E是表示使用E指数形式,f表示使用标准的浮点形式,g表示通常格式,%会使数据扩大100倍后面加上%

“{0:-<10.6}”.format(math.pi)==》’3.14159—’

“{0:-<.5}”.format(math.pi)==》’3.1416’

“{0:-<.5e}”.format(math.pi*100) ==>’3.14159e+02’

“{0:%}”.format(math.pi)==》’314.159265%’

(3)关于复数

“{0.real:.3f}{0.imag:+.3f}j”.format(4.2344+5.3445j) ==> ‘4.234+5.345j’

“{0.real:.3f}{0.imag:-.3f}j”.format(4.2344+5.3445j) ==> ‘4.234-5.345j’

前面的+-可以不写让他自己去判断:

“{0.real:.3f}{0.imag:.3f}j”.format(4.2344+5.3445j) ==> ‘4.234+5.345j’

“{0.real:.3f}{0.imag:.3f}j”.format(4.2344+5.3445j) ==> ‘4.234-5.345j’

————————————————

版权声明:本文为CSDN博主「py_tester」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/py_tester/article/details/78297628

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351