format 用法

本文根据官方文档及自己理解整理,只整理出自己可以理解的部分,h因个人水平有限,难免有所错误和纰漏,欢迎批评指正。

格式{ [field_name] ["!" conversion] [":" format_spec] }

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

大括号的内容大概分为两部分,冒号":"前的部分和后面的部分。里面的参数全部都可以省略。

冒号前部分主要为数据引用转化部分

冒号后面为指定详细的显示格式(format specification)

冒号前部分

冒号前的部分,分两块,一块为field_name,另一块为使用叹号"!"开头conversion(指定函数转化)

field_name

field_name可以有以下几种方式:

常规:

1.指定索引

2.省略,什么也不写,默认为其在字符串中的位置索引,从0开始。

3.标识符

复杂:

  1. 指定索引或标识符的前提下,使用其attribute_name(属性名) 比如point.x;0.name等方式
  2. 指定索引或标识符的前提下,使用其element_index(索引),比如lst[2];0[0]等
>>> "Hello,My name is {},I'm {}.".format('Wesley','12')
"Hello,My name is Wesley,I'm 12."

>>> "Hello,My name is {0},I'm {1}.".format('Wesley','12')
"Hello,My name is Wesley,I'm 12."

>>> "Hello,My name is {name},I'm {age}.".format(age='12',name='Wesley')
"Hello,My name is Wesley,I'm 12."

比较复杂一些

>>> "Hello,My name is {0[0]},I'm {0[1]}.".format(youth)
"Hello,My name is Wesley,I'm 12."

>>> "Hello,My name is {boy[0]},I'm {boy[1]}.".format(boy=youth)
"Hello,My name is Wesley,I'm 12."

>>> from collections import namedtuple
>>> Person=namedtuple("Persion",['name','age'])
>>> boy = Person('Wesley',12)

>>> "Hello,My name is {0.name},I'm {0.age}.".format(boy)
"Hello,My name is Wesley,I'm 12."

>>> "Hello,My name is {boy.name},I'm {boy.age}.".format(boy=boy)
"Hello,My name is Wesley,I'm 12.

conversion部分

conversion部分:

  • !s 调用函数str()
  • !r 调用函数repr()
  • !a 调用函数ascii()

对传进来的数值使用format函数之前,首先使用指定的函数对其进行强制类型转换为str类型。str(),repr()和ascii()三个函数转换为字符串的方式有所不同。若省略,则由__format__函数自动处理。

冒号后部分

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" | "%"

format_spec对于不同类型的数值,其支持的参数不同。

字符串

format specification中,很多方法只支持数字,相对来说,对数值做字符串处理,主要支持以下:

  • 宽度,width : 用数字标识
  • 对齐 align: 对字符串分别用'<' '^' '>' 标识 左对齐 居中 右对齐
  • 填充 fill : 用指定字符填充空白位,默认为空格

对齐填充和宽度

字符串,默认左对齐,默认填充为空格;

都可以省略,可以指定对齐方式,填充省略,默认为空格。

若要修改填充,必须指定对齐方式

对齐分三种,左对齐('<'),右对齐('>'),居中('^')

>>> '{:}'.format("hello")
'hello'

指定宽度为10个字符,默认为左对齐

>>> '{:10}'.format("hello")
'hello     '

指定宽度为10个字符,右对齐

>>> '{:>10}'.format("hello")
'     hello'

指定宽度为10个字符,居中对齐,空白字符用“*”填充

>>> '{:*^10}'.format("hello")
'**hello***'

若填充为0,还可以在宽度前加一个数字0,字符串格式同样遵循指定对齐方式

指定宽度为10个字符,居中对齐,空白字符用“0”填充。

>>> '{:^010}'.format("hello")
'00hello000'

字符串各种不怎么用前导0做填充,这个主要给数字格式用的,其默认的对齐方式为‘=’,只能在数字格式中使用的对齐方式)

>>> '{:010}'.format("hello")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: '=' alignment not allowed in string format specifier

数字类型

format specification中,对于数字类型,同样有宽度,填充和对齐方式选项,相对于字符串,数字类型还支持:

  • sing 控制符 ’+‘ ’-‘ ’和space
  • 进制转换
  • 小数位控制
  • 前导0
  • 第四种对齐方式‘=’

sing位

数字专用,sign 位置在对齐align后面,#、前导0或宽度前面;

sign 正数3.14 负数3.14
“+” 不显示符号“3.14” 显示负号(-)“-3.14”
“-” 显示正号(+)“+3.14” 显示负号(-)“-3.14”
空格 前面有个空格“ 3.14” 显示负号(-)“-3.14”

进制转换和井号

花括号内最右边的字段type,用来指这个数据如何被显示出来。对整数来说,可以指定type很多,如下表:

Type Meaning
'b' Binary format. Outputs the number in base 2. 二进制
'c' Character. Converts the integer to the corresponding unicode character before printing.字符
'd' Decimal Integer. Outputs the number in base 10. 默认,十进制
'o' Octal format. Outputs the number in base 8.八进制
'x' Hex format. Outputs the number in base 16, using lower- case letters for the digits above 9.小写16进制
'X' Hex format. Outputs the number in base 16, using upper- case letters for the digits above 9.大写16进制
'n' Number. This is the same as 'd', except that it uses the current locale setting to insert the appropriate number separator characters.
None The same as 'd'.

>>> '{:}'.format(97)
'97'
>>> '{:d}'.format(97)
'97'
>>> '{:n}'.format(97)
'97'
>>> '{:b}'.format(97)
'1100001'
>>> '{:o}'.format(97)
'141'
>>> '{:x}'.format(97)
'61'
>>> '{:c}'.format(97)
'a'
>>> '{:x}'.format(0x61)
'61'

井号#用来显示数字的前缀

>>> '{:#b}'.format(97)
'0b1100001'
>>> '{:#x}'.format(97)
'0x61'

来个组合的,显示97的二进制形式,显示正负号,指定宽度为20,居中对齐,填充@

>>> '{:@^+#20b}'.format(97)
'@@@@@+0b1100001@@@@@'

小数点精度

对于小数位,type位有很多,我就能看懂f e 和 %,只用过f和%,别的还没用过。

type 'f', 将数字表示为小数部分,默认为6位小数点;超位舍弃,"四舍六入五取偶"的方式舍弃

>>> '{:f}'.format(122)
'122.000000'
>>> '{:f}'.format(122.0000006)
'122.000001'

使用.precision用来确定小数点精度;其位置在倒数第二位[type]前面

>>> '{:.2f}'.format(122.0000006)
'122.00'

居中对齐,宽度20,两位小数点位置,填充为-

>>> '{:-^20.2f}'.format(122)
'-------122.00-------'

前导0和align ‘=’

对字符串指定宽度,默认alignment 为 ‘<’ 左对齐;

对数字,指定快递,默认alignmeng为‘>‘ 右对齐;

>>> '{:10}'.format('-12') #字符串
'-12       '
>>> '{:10}'.format(-12)  #数字
'       -12'

空白字符默认为空格;可以使用前导0对空白字符进行填充;

>>> '{:010}'.format(-12)
'-000000012'

使用前导0后,其对齐方式看似右对齐('>'),其实是使用了对齐方式‘=’,'='与'>'的区别在与符号位的位置

'=',符号位置在首位;即在填充位的前面

‘>’,符号位跟数字在一起

>>> '{:010}'.format(-12)
'-000000012'
>>> '{:>010}'.format(-12)
'0000000-12'
>>> '{:0=10}'.format(-12)
'-000000012'
>>> '{:0>10}'.format(-12)
'0000000-12'

format的嵌套

>>> '{:{}{}}'.format(3,.2,"f")
'3.00'

以下为官方文档的案例

>>> for align, text in zip('<^>', ['left', 'center', 'right']):
...     '{0:{fill}{align}16}'.format(text, fill=align, align=align)
...
'left<<<<<<<<<<<<'
'^^^^^center^^^^^'
'>>>>>>>>>>>right'
>>>
>>> octets = [192, 168, 0, 1]
>>> '{:02X}{:02X}{:02X}{:02X}'.format(*octets)
'C0A80001'
>>> int(_, 16)
3232235521
>>>
>>> width = 5
>>> for num in range(5,12):
...     for base in 'dXob':
...         print('{0:{width}{base}}'.format(num, base=base, width=width), end=' ')
...     print()
...
    5     5     5   101
    6     6     6   110
    7     7     7   111
    8     8    10  1000
    9     9    11  1001
   10     A    12  1010
   11     B    13  1011

字符串之format整理的更多相关文章

  1. Python内置的字符串处理函数整理

    Python内置的字符串处理函数整理 作者: 字体:[增加 减小] 类型:转载 时间:2013-01-29我要评论 Python内置的字符串处理函数整理,收集常用的Python 内置的各种字符串处理 ...

  2. javascript中字符串常用操作整理

    javascript中字符串常用操作整理 字符串的操作在js中非常频繁,也非常重要.以往看完书之后都能记得非常清楚,但稍微隔一段时间不用,便会忘得差不多,记性不好是硬伤啊...今天就对字符串的一些常用 ...

  3. Python第二天 变量 运算符与表达式 input()与raw_input()区别 字符编码 python转义符 字符串格式化 format函数字符串格式化 帮助

    Python第二天  变量  运算符与表达式  input()与raw_input()区别  字符编码  python转义符  字符串格式化  format函数字符串格式化  帮助 目录 Pychar ...

  4. 【转】Python格式化字符串str.format()

    原文地址:http://blog.xiayf.cn/2013/01/26/python-string-format/ 每次使用Python的格式字符串(string formatter),2.7及以上 ...

  5. 字符串str.format()方法的个人整理

    引言: 字符串的内置方法大致有40来个,但是一些常用的其实就那么20几个,而且里面还有类似的用法,区分度高比如isalpha,isalnum,isdigit,还有一些无时不刻都会用到的split切分, ...

  6. C语言字符串操作函数整理

    整理C语言字符串相关的函数,以程序方式验证,以注释方式做说明. #include<stdio.h> #include<string.h> #include<stdlib. ...

  7. Python 中格式化字符串 % 和 format 两种方法之间的区别

    Python2.6引入了 format 格式化字符串的方法,现在格式化字符串有两种方法,就是 % 和 format ,具体这两种方法有什么区别呢?请看以下解析. # 定义一个坐标值 c = (250, ...

  8. python中的printf:%号拼接字符串和format函数

    在C语言中,我们使用printf("%s","hello")这种形式进行字符串的拼接 在python中,进行这样的拼接有两种实现方式,分别是%号拼接以及使用fo ...

  9. python3字符串格式化format()函数的简单用法

    format()函数 """ 测试 format()函数 """ def testFormat(): # format()函数中有几个元素, ...

随机推荐

  1. 西安邀请赛-L(打表找规律)

    题目链接:https://nanti.jisuanke.com/t/39279 题意:给定n个不同的数表示的序列,定义两种操作:1. 交换前一半和后一半(如果有奇数个,则中间的不管).2. 交换每个偶 ...

  2. [Python3] 041 文件 持久化

    目录 文件 持久化 1. pickle 1.1 例子1 1.2 例子2 1.3 注意 2. shelve 2.1 举例 2.2 特性 2.3 强制写回 2.4 使用 with 管理上下文环境 文件 持 ...

  3. PTA(Basic Level)1077.互评成绩计算

    在浙大的计算机专业课中,经常有互评分组报告这个环节.一个组上台介绍自己的工作,其他组在台下为其表现评分.最后这个组的互评成绩是这样计算的:所有其他组的评分中,去掉一个最高分和一个最低分,剩下的分数取平 ...

  4. ajax怎么打开新窗口具体如何实现

    var newwindow=window.open('about:blank'); jQuery.ajax({ type: 'POST', url: 'clickRate.action', dataT ...

  5. C++多线程基础学习笔记(五)

    一.互斥量 1.1 互斥量的基本概念 简单来说,一个锁就是一个互斥量,既然是锁,就有两种状态:加锁和解锁,通过加锁>>>操作共享数据>>>解锁的方式,实现保护共享数 ...

  6. Python 入门 之 反射

    Python 入门 之 反射 1.反射 : (自省) ​ 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省). Python面向对象中的反射:通过字符串的形式操作对象的相关属性.P ...

  7. certutil 命令配合PS反弹后门

    Certutil.exe是一个命令行程序,作为证书服务的一部分安装.您可以使用Certutil.exe转储和显示证书颁发机构(CA)配置信息,配置证书服务,备份和还原CA组件以及验证证书,密钥对和证书 ...

  8. WPF中Matrix介绍

    最近在做一些图形变换操作的功能,图形变换涉及大学中的矩阵运算部分的知识,又重新复习了一下矩阵.这里做一下记录.由于不知道矩阵如何输入,一个个截图又麻烦,所以这里就全部用截图了^-^.

  9. JavaScript冒泡排序法实现排序操作

    var arr = [10,8,6,9,1,7,1,13,5,1,9]; //冒泡排序 function bubbleSort(tmpArr){ for(var i = tmpArr.length-1 ...

  10. 2018年4月份,阿里最新的java程序员面试题目,仅供参考。

    目录 技术一面(23问) 技术二面(3大块) 性能优化(21点) 项目实战(34块) JAVA方向技术考察点(15点) JAVA开发技术面试中可能问到的问题(17问) 阿里技术面试1 1.Java I ...