python字符串中的格式字符不可省略_python字符串格式化

写的不好,学习字符串格式化时候的记录笔记,待日后完善(有一些用法还不熟练)

旧式格式化

模板

格式化字符串时,Python使用一个字符串作为模板 ,模板中有格式符,这些格式符为真实值预留位置,并说时真实数值应该呈现的模式,Python用一个tuple 将多个值传递给模板,每个值对应一个格式符。

'name:%s, age:%d' % ('jianglei', 18)

>>>'name:jianglei, age:18'

在上面的例子中,'name:%s, age:%d' 作为模板,%s 为第一个格式符代表字符串, %d 为第二个格式符代表十进制整数。('jianglei', 18)元组作为实际传入的参数。‘jianglei’ 对应%s 18对应 %d,模板和参数之间有一个%号代表格式化操作

整个语句实际上是一个字符串表达示,可以像普通的字符串一样赋值给变量

>>>str = 'name:%s, age:%d' % ('jianglei', 18)

>>>str

'name:jianglei, age:18'

>>>

元组中的参数必须与格式符的数量相一致要不会报错

>>> 'name:%s, age:%d' % ('jianglei')

Traceback (most recent call last):

File "", line 1, in 'name:%s, age:%d' % ('jianglei')

TypeError: not enough arguments for format string

>>> 'name:%s, age:%d' % ('jianglei', 18, "a")

Traceback (most recent call last):

File "", line 1, in 'name:%s, age:%d' % ('jianglei', 18, "a")

TypeError: not all arguments converted during string formatting

格式符与参数的类型不一致也会报错

>>> 'name:%s, age:%d' % ('jianglei', "1")

Traceback (most recent call last):

File "", line 1, in 'name:%s, age:%d' % ('jianglei', "1")

TypeError: %d format: a number is required, not str

我们也可以用字典来传递真实值

>>>'name: %(name)s, age:%(age)d' % {'name':'jianglei', 'age':18}

'name: jianglei, age:18'

格式符

格式符

含义

%s

str()的显示

%r

repr()的显示

%c

单个字符

%d, %i

十进制整数

%b

二进制整数

%o

八进制整数

%h

十六进制整数

%e

科学计数法 基底为e

%E

科学计数法 基底为E

%f

浮点数

%F

同上,浮点数

%g

科学计数法 或 浮点数(根据显示的长度决定)

%G

同上

可以用如下的方式,对格式进行进一步的控制

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

flag可以为+, -, '', 0

+表示右对齐

-表示左对齐

’ ‘空格表示为正数空一个格出来

0表示0填充

width 表示宽度

precision 表示小数点后的精度

width和precision可以用星号来表示,在后面的元组中传入

>>>'%0*.*f' % (10,4,213.1)

'00213.1000'

新式字符串格式化

Str.format()方法和格式化程序类共享相同的格式字符串语法(尽管在格式化程序,子类可以定义自己的格式字符串语法)

格式化字符串为花括号{}包围的替换字段。所有括号外的内容均被视为文本,不做改变复制到输出。如果您需要在文本中包括花括号字符,它可以通过双花括号字符来进行转义:{{和}}

替换的语法如下:

字段

语法

replacement_field

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

field_name

arg_name ("." attribute_name | "["element_index "]" )*

arg_name

[identifier | integer]

attribute_name

identifier

element_index

integer | index_string

index_string

+

format_spec

在不那么正式的术语,置换领域可以开始与指定的对象,其值是要进行格式化并插入到的输出而不是替换字段的字段名。字段名(可选) 其次是转换领域,前面有一个感叹号’!’,和format_spec,这前面有一个冒号’:’。这些指定非默认格式的重置价值。

另请参阅格式描述迷你语言节。

字段名本身始于arg_name ,是数字或关键字。如果它是一个数字,它是指一个位置的参数,而如果它是一个关键字,它指命名的关键字参数。如果在格式字符串中的数值 arg_names 是 0,1,2,……在序列中,它们可以全部省略 (不只是一些) 和数字 0,1,2,……将自动插入顺序。因为arg_name不是引号分隔的它不是可以指定任意字典键 (例如,字符串’10’或’:-]’) 在格式字符串中。Arg_name的后面可以由任意数量的索引或属性的表达式。表达式形式.name选择使用getattr(),而窗体’[索引]’的表达式并使用getitem()索引查找的命名的属性。

2.7 版本中的更改:定位参数说明符,则可以省略,所以’{} {}’相当于’ {0} {1}’。

一些简单的格式字符串的示例:

"First, thou shalt count to {0}" # References first positional argument

"Bring me a {}" # Implicitly references the first positional argument

"From {} to {}" # Same as"From {0} to {1}"

"My quest is {name}" # References keyword argument'name'

"Weight in tons {0.weight}" #'weight' attribute of first positional arg

"Units destroyed: {players[0]}" # First element of keyword argument'players'.

转换场导致前格式类型强制。通常情况下,值进行格式设置的作业是由值本身的format()方法完成的。然而,在某些情况下是需要强制类型将被格式化为字符串,重写其自己定义的格式。通过在调用format()之前,将值转换为一个字符串,绕过正常的格式化逻辑。

目前支持两种转换标志: ‘! s’值,调用str()和’ ! r’调用repr()。

Format_spec字段包含格式如何表现的说明,包括这些细节作为字段宽度、对齐、 填充、 小数精度等方面的规范。每个值类型可以定义它自己的”格式设置迷你语言”或format_spec的解释。

大多数内置类型支持一种共同的格式设置迷你语言下, 一节所述。

Format_spec字段还可以包含嵌套的替代字段内。这些嵌套的替换字段可以包含唯一字段的名称 ;不允许转换标志和格式规范。在 format_spec 内的替换字段替换之前的format_spec字符串被解释。这将允许动态地指定的值的格式。

请参阅格式示例部分的一些例子。

格式说明符Mini-Language

“格式说明符”位于格式字符串的被置换区域中,用于定义每一个值如何显示 (请参见格式字符串语法)。它们也可以直接传递给内置的format ()函数。每个 formattable 的类型都可以定义格式描述如何被解释。

大多数内置类型都实现了以下的格式描述选项中,虽然一些格式选项只支持数值类型。

标准格式说明符的一般形式为:

format_spec ::= [[fill]align][sign][#][0][width][,][.precision][type]

fill ::=

align ::= " | ">" | "=" | "^"

sign ::= "+" | "-" | " "

width ::= integer

precision ::= integer

type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"

如果指定了一个无效的对齐值,它可以以可以是任何字符和空间,如果省略默认填充字符开头。请注意它不可能会同时使用str.format()方法 ; 作为填充字符使用{和} 但是这种限制并不影响format ()函数。

align

不同的对方方式选项的含义如下所示

选项

代表意义

‘如果有足够的空间,左对齐

‘>’

如果有足够的空间,右对齐

‘=’

‘^’

如果有足够的空间,居中

如查没有定义最小字段宽度,则字段宽度总是等于数据的宽度,在这种情况下对齐选项就没有意义了

sign

符号选项只适用于有效的数字类型

选项

代表意义

‘+’

数字的正负号都显示出来

‘-‘

正数的符号不显示,负数的符号显示出来

’ ‘

正数前面加一个空格,负数的符号显示出来

#

只适用于二进制,八进制,十六进制整。

如果#号存在指定输入前缀为0b,0o,0x

,

只适用于整数,将整数以千数位以,分割

width

定义最小字段宽度。如果未指定,那么将由内容决定字段宽度

0

只适用于整数,如果有足够的空间使用0填充

精度

小数点的位数,只适用于浮点数

type

适用于字符串的格式有

type

代表意义

’s’

字符串,可以省略

适用于整数的跟上面的旧式字符串一样

模板字符串格式化

class string.Template(template)

substitute(mapping[, **kws])

#对模板进行替换,返回一个新的字符串

#mapping 可以是任何的类字典对象,对象里的key与要模板里要替换的标识符相匹配

#你也可以提供关键字参数

#如果mapping 和 kws都提供了,还有重复,kws里的优先级比较高

safe_substitute(mapping[, ** kws])

#像`substitute()`,除了在mapping,和kws里没有缺少要替换的参数时,他不会引发一个`KeyError`异常。原始的标识符会保留在返回的结果里,不像substitute(),别的$,仅会返回$,而不是引发ValueError异常

#然而别的异常可能会发生,这个方法叫“safe"加为替换操作总是试着返回一个可用的字符串而不是引发一个异常。别一种理解,safe_substitue()无限接进安全的,因为他会安静的忽略不正确的模板

template(模板,参数传入的)

模板提供了简单的字符串替换,模板不用%作为标识符,模板提供了$作为标识符起点,遵守下面的规则

$$是转义字符,他会被替换成一个$

标识符要与后面提供的参数相对应,标识符后至少要有一个空格 如$name is a boy $age

${identifier} 与 $identifier是等价的,但是他在标识符与单词紧紧连接的时候有用如${noun}ification

在出现了除上述规则外的$ 会引发ValueError

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值