Python入门(四):对象类型之字符串(3)


  为了能够更方便地与用户交互,我们需要格式化输出。Python提供了两种方法来实现字符串的格式化,分别为 字符串格式化表达式字符串格式化调用。下面分别进行介绍:

1. 字符串格式化表达式

1.1 格式化表达式基础操作

 字符串格式化表达式基于C语言的 ‘printf’ 模型,通过对字符串定义了%二进制操作符来实现。(在数字类型中,%是取余数的操作)。%应用在字符串的时候,能够对字符串的值进行格式化。具体方法如下:
1). 在 % 操作符的左侧放一个需要进行格式化的字符串,字符串可以带有一个或者多个需要格式化的目标,并且需要格式化的字符串都以 % 开头。(例如 %d )

There are %d restaurants and %d libraries in our school.    #左侧

2). 在 % 操作符右侧防止需要嵌入的对象,这些对象会被嵌入到左侧的需要格式化的位置,本例就是 %d 的位置。

% (3 , 4)
>>> "There are %d restaurants and %d libraries in our school" %(3,4)
'There are 3 restaurants and 4 libraries in our school'

当只有一个值需要插入的时候,% 后面不需要加括号。同样注意,格式化总是返回新的字符串作为结果而不是对左侧的字符串直接进行修改。

1.2 字符串格式化表达式代码

格式化代码意义
%s字符串(或任何对象)
%rrepr()形式的字符串
%c字符
%d(十进制)整数
%i整数
%u无符号整数
%0八进位整数
%X %x十六进位整数(大小写)
%E %e浮点指数(大小写)默认保留小数点后6位
%F %f十进制浮点数(默认保留小数点后6位)
%g浮点e或f
%G浮点E或f
%常量%

 完整的字符串格式化表达式如下:

%[(name)][flags][width][.precision] typecode

[name] 是字典的键; [flags] 是标志位,有左对齐 (-) , 正负号(+) 和补零(0)等;[width] 是数字的整体长度; [.precision]是小数点后面的位数。

  • 常见数字的格式化输出
#整数
>>> x = 123
>>> res = 'results are: %d  %-6d   %06d' % (x,x,x)
>>> res
'results are: 123  123      000123'
#注意不加左对齐 - ,会出现如下结果,第二个值会默认靠右
>>> res = 'results are: %d   %6d   %06d' %(x,x,x)
>>> res
'results are: 123      123   000123'
#浮点数
>>> x = 123.4
>>> res = 'results are: %f, %+f, %012f, %12.3f' %(x,x,x,x)
>>> res
'results are: 123.400000, +123.400000, 00123.400000,      123.400'

## %g默认保留输入的小数点后的个数,输入的小数点后面数字个数大于4时,默认为4
>>> x =123.4
>>> res = 'results are: %g, %+g, %012g, %-12.3g' %(x,x,x,x)
>>> res
'results are: 123.4, +123.4, 0000000123.4, 123         '
>>> 
#浮点指数
>>> x = 12.3456
>>> res = 'results are: %e, %4E, %4.2e, %08.3e' %(x,x,x,x)
>>> res
'results are: 1.234560e+01, 1.234560E+01, 1.23e+01, 1.235e+01'

这里%4E 因为指定的整体长度小于默认情况下的长度,因此按照默认输出,小数点和E+01也算长度。 
换为 %20E 后我们可以看到效果(默认右对齐)>>> res = 'results are: %e, %20E, %4.2e, %08.3e' %(x,x,x,x)
>>> res
'results are: 1.234560e+01,         1.234560E+01, 1.23e+01, 1.235e+01'
  • 其他进制的数字的格式化输出
##十六进制
>>> res = 'results are: %x, %+06X' %(12,12)
>>> res
'results are: c, +0000C'
##八进制
>>> res = 'results are: %o, %+06o' %(12,12)
>>> res
'results are: 14, +00014'
  • 基于字典的格式化表达式
     字符串的格式化表达式还支持左边的转换目标来引用右边的键来提取对应的值。也是就使用上面的 [name]。
##创建一个字典
dict = {'price':100, 'weights':1.55}
>>> res = 'the price is %(price)+0d, the weights is %(weights).1f' %dict
>>> res
'the price is +100, the weights is 1.6'

这样,我们就将字典中的price值和weights值分别插入到了我们需要的位置。

2.字符串格式化调用方法

2.1 基本调用

 字符串格式化调用方法是Python独有的方法,并且这个方法和字符串格式化表达式方法有很大的重叠。简单来说就是主体字符串作为模板,通过format方法接收任意多个根据模板替换的值。

##根据数字序号(位置)进行格式化
>>> template = '{0},{1},{2}'
>>> template.format('Python',' is', ' easy')
'Python, is, easy'
##根据format中的关键词进行格式化
>>> template = '{name},{age},{gender}'
>>> template.format(name= 'Bob', age= '18', gender= 'male')
'Bob,18,male'

注意:format方法模板中的数字顺序可以更换,它会按照后面需要嵌入的值的序号来插入。

>>> template = '{1},{0},{2}'
>>> template.format('Python', ' is', ' easy')
' is,Python, easy'

2.2 添加格式化的调用

 像 % 格式化表达式一样,调用也支持更加具体的格式化。format格式化调用还支持添加字典键和位置以及关键词。
其中方括号里面指定字典键,点号表示位置或关键词所引用的对象属性。

import sys
>>> 'my {1[spam]} runs {0.platform}'.format(sys,{'spam':'laptop'})
'my laptop runs linux'

这里,1和0分别是format()中需要填入的数据的序号。1表示format括号中的第二个对象,而对象为字典,再通过 [spam]索引字典中键 ‘spam’ 映射的内容,即 ‘laptop’; 0表示format后括号中的第一个对象,即为 sys,放入前面就构成了sys.platform这个命令,返回了结果。

 格式化调用中,方括号中还可以指定列表的偏移量进行索引,但是只有单个的非负索引才能有效。

>>> list1 = list('Python')  ##创建一个列表
>>> list1
['P', 'y', 't', 'h', 'o', 'n']
>>> s = 'first = {0[0]}, third = {0[2]}'.format(list1)
>>> s
'first = P, third = t'
###索引为负数的时候,报错
>>> s = 'last={0[-1]}'.format(list1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list indices must be integers or slices, not str

若想要指定负的偏移量或者分片,只能在格式化字符串之外运行表达式。 也就是说,我们先在外指定负的偏移量和分片,将它赋给另一个变量,我们再用格式化字符串使用这些新的变量。

>>> list1 = list('Python')  ##创建一个列表
>>> list1
['P', 'y', 't', 'h', 'o', 'n']
>>> parts = list1[-1], list1[:3]
>>> s = 'last = {0[0]}, slice = {0[1]}'.format(parts)
>>> s
"last = n, slice = ['P', 'y', 't']"

format形式还可以使用 *元组 , ** 字典的方式进行传值。

##元组
>>> parts = list1[-1], list1[:3]
>>> s = 'last = {0}, slice = {1}'.format(*parts)
>>> s
"last = n, slice = ['P', 'y', 't']"
##字典
>>> dict = {'name':'Bob','age':'18','gender':'male'} ##创建字典
>>> s1 = 'Name is {name}, age is {age}, {gender}.'.format(**dict)
>>> s1
'Name is Bob, age is 18, male.'

添加更为具体的格式化
 在刚刚的基础上,我们可以再通过在 {number [key] } {key} 后增加一个冒号 : ,再加上一个formatspace的格式就看指定字段大小、对齐方式和特定类型编码
formatspace的格式如下:

[ [ fill ] align ] [sign] [#] [0] [width] [grouping_option] [.precision] [typecode]

如果指定了一个有效的 align 值,则可以在该值前面加一个 fill 字符,它可以为任意字符,如果省略则默认为空格符。也就是说fill是填充字符,在指定宽度 width大于字符本身宽度时将会用fill的字符进行填充。

align为对齐方式,< 为左对齐, >为右对齐, = 强制将填充放置在符号(如果有)之后但在数字之前, ^为居中对齐。

sign为符号,+ 用于正数和负数,- 用于负数(默认), 空格表示应在正数上使用前导空格,在负数上使用减号。

[#]选项可以让“替代形式”被用于转换。 替代形式可针对不同类型分别定义。 此选项仅对整数、浮点、复数和 Decimal 类型有效。 对于整数类型,当使用二进制、八进制或十六进制输出时,此选项会为输出值添加相应的 ‘0b’, ‘0o’ 或 ‘0x’ 前缀。 对于浮点数、复数和 Decimal 类型,替代形式会使得转换结果总是包含小数点符号,即使其不带小数。

width是一个定义最小字段宽度的十进制整数。 如果未指定或者指定值小于内容的宽度,则字段宽度将由内容确定。

group_option针对整数,指定千分位的分隔符,有 , 和 _ 两个可选项
.precision 十进制数字, 表示小数点后几位
typecode就是字符的类型,d, i, f, e, g, s 等

##指定左对齐,宽度
>>> list = ['python',123456]
>>> '{0[0]:<30}'.format(list)
'python                        '

##指定右对齐,正符号,宽度,千分位
>>> '{0[1]:>+20,}'.format(list)
'            +123,456'

##指定右对齐,正符号,宽度,小数点位数,指数浮点数
>>> '{0[1]:>+20.2e}'.format(list)
'           +1.23e+05'

## 指定右对齐,正符号,宽度,十六进制表示
>>> '{0[1]:>+20X}'.format(list)
'              +1E240'          #注意这里的E不是科学计数而是十六进制里面的E

更详细和高级的格式化用法可以参见官方文档str.format

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值