Python的format函数

字符串替换的语法如下:

{[field_name] [!conversion] [:format_spec]}

主要切分为三部分:

  1. 字段选取
  2. 值转换
  3. 样式输出

1. 字段选取

字符选取对应替换语法中的field_name部分,具体语法如下:

field_name         =  arg_name (.attribute_name | [element_index])*
arg_name           =  [identifier | digit+]
attribute_name     =  identifier
element_index      =  digit+ | index_string
index_string       =  <any source character except "]"> +

选取方式分为三种:

1.1. 关键字选取

In [5]: name, age = ('小飞', 24)                                                

In [6]: 'name: {name}, age: {age}'.format(name=name, age=age)                   
Out[6]: 'name: 小飞, age: 24'

In [7]: stu = {'name': name, 'age': age}                                        

In [8]: 'name: {name}, age: {age}'.format(**stu) # 字典拆包                               
Out[8]: 'name: 小飞, age: 24'

1.2. 位置选取

In [14]: name, age = ('小飞', 24)                                               

In [15]: 'name: {1}, age: {0}'.format(age, name)                                
Out[15]: 'name: 小飞, age: 24'

In [16]: 'name: {}, age: {}'.format(name, age) # 省略下标                                  
Out[16]: 'name: 小飞, age: 24'

1.3. 嵌套选取

在通过了关键字或位置选取了字段之后,可进一步指定字段的属性或元素。

In [17]: class Student: 
    ...:     def __init__(self, stu_name, stu_age): 
    ...:         self.name = stu_name 
    ...:         self.age = stu_age 
    ...:         self.attr = (stu_name, stu_age) 
    ...:                                                                        

In [18]:  stu = Student('小飞', 24)                                             

In [19]: 'name: {stu.name}, age: {stu.age}'.format(stu=stu)                     
Out[19]: 'name: 小飞, age: 24'

In [20]: 'name: {0.name}, age: {0.age}'.format(stu)                             
Out[20]: 'name: 小飞, age: 24'

In [21]: 'name: {0.attr[0]}, age: {0.attr[1]}'.format(stu)                      
Out[21]: 'name: 小飞, age: 24'

2. 值转换

值转换对应替换语法中的conversion部分,取值有:

  • r:对值调用str()方法
  • s:对值调用repr()方法
  • a:!a对值调用ascii()方法
In [22]: name, age = ('小飞', 24)                                               

In [23]: 'name: {0!s}, age: {1!s}'.format(name, age)                            
Out[23]: 'name: 小飞, age: 24'

In [24]: 'name: {name!r}, age: {age!r}'.format(name=name, age=age)              
Out[24]: "name: '小飞', age: 24"

In [25]: 'name: {!a}, age: {!a}'.format(name, age)                              
Out[25]: "name: '\\u5c0f\\u98de', age: 24"

3. 样式输出

样式输出对应替换语法的format_spec部分,具体语法如下:

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

3.1. 字宽

format_spec语法中的width对应字宽。

In [26]: '{:10}'.format(20)                                                     
Out[26]: '        20'

3.2. 数值正负号

format_spec语法中的sign对应数值的正负号,取值有:

  • +:正数加正,负数加负
In [32]: '{:+10}'.format(20)                                                     
Out[32]: '       +20'

In [33]: '{:+10}'.format(-20)                                                   
Out[33]: '       -20'
  • -:正数不变,负数加负,默认
In [34]: '{:-10}'.format(+20)                                                   
Out[34]: '        20'

In [35]: '{:-10}'.format(-20)                                                   
Out[35]: '       -20'

In [36]: '{:10}'.format(+20)                                                    
Out[36]: '        20'

In [37]: '{:10}'.format(-20)                                                    
Out[37]: '       -20'
  • :正数空格,负数加负
In [38]: '{: 10}'.format(20)                                                    
Out[38]: '        20'

In [39]: '{: 10}'.format(-20)                                                   
Out[39]: '       -20'

3.3. 对齐方式

format_spec语法中的[fill]align对应字符串的对齐方式,取值有:

  • <:左对齐
In [40]: '{:<10}'.format(20)                                                    
Out[40]: '20        '

In [41]: '{:*<10}'.format(20) # *号填充                                                   
Out[41]: '20********'
  • >:右对齐
In [42]: '{:>10}'.format(20)                                                    
Out[42]: '        20'

In [43]: '{:10}'.format(-20) # 默认为右对齐,符号位放置填充物右侧                                                    
Out[43]: '       -20'
  • =:右对齐,符号位放置填充物左侧,即:符号+填充物+数字
In [44]: '{:0=+10}'.format(20) #                                                   
Out[44]: '+000000020'

In [45]: '{:0=+10}'.format(-20)                                                 
Out[45]: '-000000020'
  • =:右对齐,符号位放置填充物左侧,即:符号+填充物+数字
In [44]: '{:0=+10}'.format(20) #                                                   
Out[44]: '+000000020'

In [45]: '{:0=+10}'.format(-20)                                                 
Out[45]: '-000000020'
  • ^:居中
In [47]: '{:^10}'.format(20)                                                    
Out[47]: '    20    '

In [48]: '{:*^10}'.format(20) # *号填充                                                   
Out[48]: '****20****'

3.4. 数据类型

format_spec语法中的type对应数据类型。

3.4.1. 字符串

当输入为字符串时,sNone均表示字符串

In [49]: '{:s}'.format('小飞')                                                  
Out[49]: '小飞'

In [50]: '{:}'.format('小飞')                                                   
Out[50]: '小飞'

3.4.1. 整型

当输入为整型时,type可取的值有:

  • c:输出整型对应的字符
In [51]: '{:c}'.format(65)                                                      
Out[51]: 'A'
  • b:输出整型对应的二进制
In [52]: '{:b}'.format(20)                                                      
Out[52]: '10100'
  • o:输出整型对应的八进制
In [53]: '{:o}'.format(20)                                                      
Out[53]: '24'
  • d:输出整型对应的十进制
In [54]: '{:d}'.format(20)                                                      
Out[54]: '20'
  • x:输出整型对应的十六进制,小写
In [55]: '{:x}'.format(26)                                                      
Out[55]: '1a'
  • X:输出整型对应的十六进制,大写
In [56]: '{:X}'.format(26)                                                      
Out[56]: '1A'
  • None:输出整型对应的十进制
In [57]: '{:}'.format(20)                                                       
Out[57]: '20'

3.4.2. 浮点数

当输入为浮点数时,type可取的值有:

  • f:输出对应的浮点数形式,默认保留6位小数,小写nan, inf
In [60]: '{:f}'.format(2.3333333333)                                            
Out[60]: '2.333333'

In [61]: import math                                                            

In [62]: '{:f}'.format(math.nan)                                                
Out[62]: 'nan'
  • F:输出对应的浮点数形式,默认保留6位小数,大写NAN, INF
In [63]: '{:F}'.format(2.3333333333)                                            
Out[63]: '2.333333'

In [64]: '{:F}'.format(math.inf) # 已导入math                                                
Out[64]: 'INF'
  • e:输出对应的科学计数形式,默认保留6位小数,小写e
In [65]: '{:e}'.format(2222.3333333333)                                         
Out[65]: '2.222333e+03'
  • E:输出对应的科学计数形式,默认保留6位小数,大写E
In [66]: '{:E}'.format(2222.3333333333)                                         
Out[66]: '2.222333E+03'
  • g:自动在f和e之间转换
In [67]: '{:g}'.format(2.3333333333)                                            
Out[67]: '2.33333'

In [68]: '{:g}'.format(2222222.3333333333)                                      
Out[68]: '2.22222e+06'
  • G:自动在F和E之间转换
In [69]: '{:G}'.format(2.3333333333)                                            
Out[69]: '2.33333'

In [70]: '{:G}'.format(2222222.3333333333)                                      
Out[70]: '2.22222E+06'
  • %:显示百分比
In [71]: '{:%}'.format(0.01)                                                    
Out[71]: '1.000000%'

In [72]: '{:.0%}'.format(0.01)                                                  
Out[72]: '1%'

3.5. 精度

In [73]: '{:.2f}'.format(0.0156)                                                
Out[73]: '0.02'

附注:python3中可使用f'var: {var}'


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

推荐阅读更多精彩内容