Python2.6+ 增加了str.format函数,用来代替原有的'%'操作符。它使用比'%'更加直观、灵活。下面详细介绍一下它的使用方法。
下面是使用'%'的例子:
"" "PI is %f..." % 3.14159 # => 'PI is 3.141590...' "%d + %d = %d" % (5, 6, 5+6) # => '5 + 6 = 11' "The usage of %(language)s" % {"language": "python"} # => 'The usage of python'
格式很像C语言的printf是不是?由于'%'是一个操作符,只能在左右两边各放一个参数,因此右边多个值需要用元组或者字典来包括,不能元组字典一起用,缺乏灵活度。
同样的例子用format方法改写:
"PI is {0}...".format(3.14159) # => 'PI is 3.14159...' "{0} + {1} = {2}".format(5, 6, 5+6) # => '5 + 6 = 11' "The usage of {language}".format(language = "Python") # => 'The usage of Python'
是不是很直观?(当然,使用C语言的我也很喜欢前一种格式表达方式 :-) )
格式化字符串
"{named} consist of intermingled character {0} and {1}".format("data", "markup", named = "Formats trings") format(10.0, "7.3g") # => ' 10' "My name is {0} :-{{}}".format('Fred') # => 'My name is Fred :-{}'
注意第一行的'\',如果一个语句要换行,必须在结尾加上反斜线转义。
用'%'无法像这样将元组和字典混用。其实这里是命名参数,Python的一个特性。可以在定义数组的时候用*args, **kwargs语法展开集合和字典。需要注意,命名参数放在后面。
第二个语句表示format内置函数用来格式化单个值。
第三个语句表示了{}的转义,因为{}在被格式化字符串里是特殊字符,不能直接显示。转义方式是多嵌套一层。
使用属性和索引
"My name is {0.name}".format(open('out.txt', 'w')) # => 'My name is out.txt'
'{0.name}' 相当于调用对象的属性 open('out.txt', 'w').name
"My name is {0[name]}".format(dict(name='Fred')) # => 'My name is Fred'
使用索引也是可以的。
obj[key] 相当于 obj.____getitem____('key')
标准说明符(Specifiers)
写过C语言的程序员应该清楚printf的复杂。format也定义了很多标准的说明符,用来解释一个值的格式,然后插入字符串内。例如:
"My name is {0:8}".format('Fred') # => 'My name is Fred '
':'之后便是说明符了,上面例子中说明符只有一个'8'(minimumwidth),它表示插入的值宽度至少为8。'Fred'只有4,所以又加了4个空格。
说明符的详细格式为:
[[fill]align][sign][#][0][minimumwidth][.precision][type]
(不比C的printf更简洁啊!)
注意:'[]'表示该元素可选。所以,所有的格式说明符都是可选的!就像之前的例子,几乎都没有用这个(只是为了例子更清晰)。实际上,这些是很有用的。
我们一个个来看:
1、[fill]align 表示排列方式。当minimumwidth设置的比插入的值大时,就有了留白,就像上一个例子中的'My name is Fred '。默认把留白放在了右边,也就是说插入值默认是左对齐的。如果我们试试{0:>8},会发现结果变成了'My name is Fred'。
fill 表示用来填充留白的字符。只有在align指定了的情况下fill才有用! align可以是下面的标识:
- < 左对齐,默认
- > 右对齐
- = 将留白放在align标识后面,只对数字有效。什么意思呢?align下面会讲到,显示数字的正负号,同样只对数字有效。如果指定了'=',那么就会把数字的正负号显示在留白的前面。例如:format(-12, "0=8") # => '-0000012'注意这里用的是格式化单个值的内置函数format。'0'是fill元素,用它来填充留白;'='就是该标识了;'8'是指最小宽度为8,因此才有5个留白。那么align呢?align其实就是说明正负号的显示方式,这里使用默认的'-',之后会讲到。
- ^ 居中对齐
2、sign 数字符号,只对数字有效。
- + 显示加号和减号
- - 不显示加号,显示减号。在不指定最小宽度的情况下负数总是比正数多占一个符号位置。默认
- ' ' (一个空格) 用一个留白代替加号
3、# 显示数字的前缀表示几进制(0b, 0o, 0x)
4、0 用'0'填充留白。
5、minimumwidth 指定最小宽度,已经用过很多次了。
6、.precision 'precision'是一个十进制数字,表示显示小数点后几位。
7、type 值的类型:
①整型:
- b 二进制
- c 字符型,把数字转成表示unicode的字符
- d 十进制
- o 八进制
- x 十六进制,显示小写字母
- X 十六进制,显示大写字母
- n 与d行为相同,使用本地的数字表示方式
- ''(空,没有空格) 与d相同
②浮点数
- e 科学计数法表示,小写e
- E 科学计数法表示,大写E
- f 显示为定点数,默认小数点后六位
- F 同f
- g 自动选择是否用科学记数法表示
- G 同g
- n 同g,使用本地表示方式
- % 使用百分比表示
- ''(空) 同g
每个对象可以重写自己的格式化说明符,例如datatime类重写了后可以这样表示:
"Today is: {0:%a %b %d %H:%M:%S %Y}".format(datetime.now())
预先转换
':'之后是格式说明符,之前还可以加预先转换的标识
- !r 调用对象的_repr_方法来转换成标准字符串
- !s 调用对象的_str_方法来转换成字符串
重写_format_方法
我们在格式化一个字符串时,首先格式化每个值,然后再插入字符串内。格式化值调用的就是format内置方法。format则是简单地调用该值的_format_方法。
def format(value, format_spec): return value.__format__(format_spec)
在object类内实现了_format方法,只是将本身用str()转换成字符串,然后将字符串传入内置的format方法,实际上就是调用转换为字符串后的format_方法。
class object: def __format__(self, format_spec): return format(str(self), format_spec)
int/float/str自身实现了_format_方法,前面已经介绍了它们各自的说明符。
结束语
还有一点儿是自定义Formatter,不过平常也用不到。留作下篇string模块源码解读的内容吧。建议有兴趣的朋友多看看Python标准库的源码,很有学习价值。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 中国武警男声合唱团《辉煌之声1天路》[DTS-WAV分轨]
- 紫薇《旧曲新韵》[320K/MP3][175.29MB]
- 紫薇《旧曲新韵》[FLAC/分轨][550.18MB]
- 周深《反深代词》[先听版][320K/MP3][72.71MB]
- 李佳薇.2024-会发光的【黑籁音乐】【FLAC分轨】
- 后弦.2012-很有爱【天浩盛世】【WAV+CUE】
- 林俊吉.2012-将你惜命命【美华】【WAV+CUE】
- 晓雅《分享》DTS-WAV
- 黑鸭子2008-飞歌[首版][WAV+CUE]
- 黄乙玲1989-水泼落地难收回[日本天龙版][WAV+CUE]
- 周深《反深代词》[先听版][FLAC/分轨][310.97MB]
- 姜育恒1984《什么时候·串起又散落》台湾复刻版[WAV+CUE][1G]
- 那英《如今》引进版[WAV+CUE][1G]
- 蔡幸娟.1991-真的让我爱你吗【飞碟】【WAV+CUE】
- 群星.2024-好团圆电视剧原声带【TME】【FLAC分轨】