Python中字符串格式化str.format的详细介绍
前言
Python在2.6版本中新加了一个字符串格式化方法:str.format()。它的基本语法是通过{}和:来代替以前的%.。
格式化时的占位符语法:
replacement_field::="{"[field_name]["!"conversion][":"format_spec]"}"
“映射”规则
通过位置
str.format()可以接受不限个参数,位置可以不按顺序:
>>>"{0}{1}".format("hello","world")
'helloworld'
>>>"{}{}".format("hello","world")
'helloworld'
>>>"{1}{0}{1}".format("hello","world")
'worldhelloworld'
通过关键字参数
使用关键参数时字符串中需要提供参数名:
>>>"Iam{name},ageis{age}".format(name="huoty",age=18)
'Iamhuoty,ageis18'
>>>user={"name":"huoty","age":18}
>>>"Iam{name},ageis{age}".format(**user)
'Iamhuoty,ageis18'
通过对象属性
str.format()可以直接读取用户属性:
>>>classUser(object):
...def__init__(self,name,age):
...self.name=name
...self.age=age
...
...def__str__(self):
...return"{self.name}({self.age})".format(self=self)
...
...def__repr__(self):
...returnself.__str__()
...
...
>>>user=User("huoty",18)
>>>user
huoty(18)
>>>"Iam{user.name},ageis{user.age}".format(user=user)
'Iamhuoty,ageis18'
通过下标
在需要格式化的字符串内部可以通过下标来访问元素:
>>>names,ages=["huoty","esenich","anan"],[18,16,8]
>>>"Iam{0[0]},ageis{1[2]}".format(names,ages)
'Iamhuoty,ageis8'
>>>users={"names":["huoty","esenich","anan"],"ages":[18,16,8]}
>>>"Iam{names[0]},ageis{ages[0]}".format(**users)
指定转化
可以指定字符串的转化类型:
conversion::="r"|"s"|"a"
其中"!r"对应repr();"!s"对应str();"!a"对应ascii()。示例:
>>>"repr()showsquotes:{!r};str()doesn't:{!s}".format('test1','test2')
"repr()showsquotes:'test1';str()doesn't:test2"
格式限定符
填充与对齐
填充常跟对齐一起使用。^,<,>分别是居中、左对齐、右对齐,后面带宽度,:号后面带填充的字符,只能是一个字符,不指定则默认是用空格填充。
>>>"{:>8}".format("181716")
'181716'
>>>"{:0>8}".format("181716")
'00181716'
>>>"{:->8}".format("181716")
'--181716'
>>>"{:-<8}".format("181716")
'181716--'
>>>"{:-^8}".format("181716")
'-181716-'
>>>"{:-<25}>".format("Here")
'Here-------------------->'
浮点精度
用f表示浮点类型,并可以在其前边加上精度控制:
>>>"[{:.2f}]".format(321.33345)
'[321.33]'
>>>"[{:.1f}]".format(321.33345)
'[321.3]'
>>>"[{:.4f}]".format(321.33345)
'[321.3335]'
>>>"[{:.4f}]".format(321)
'[321.0000]'
还可以为浮点数指定符号,+表示在正数前显示+,负数前显示-;(空格)表示在正数前加空格,在幅负数前加-;-与什么都不加({:f})时一致:
>>>'{:+f};{:+f}'.format(3.141592657,-3.141592657)
'+3.141593;-3.141593'
>>>'{:f};{:f}'.format(3.141592657,-3.141592657)
'3.141593;-3.141593'
>>>'{:f};{:f}'.format(3.141592657,-3.141592657)
'3.141593;-3.141593'
>>>'{:-f};{:-f}'.format(3.141592657,-3.141592657)
'3.141593;-3.141593'
>>>'{:+.4f};{:+.4f}'.format(3.141592657,-3.141592657)
'+3.1416;-3.1416'
指定进制
>>>"int:{0:d};hex:{0:x};oct:{0:o};bin:{0:b}".format(18)
'int:18;hex:12;oct:22;bin:10010'
>>>"int:{0:d};hex:{0:#x};oct:{0:#o};bin:{0:#b}".format(18)
'int:18;hex:0x12;oct:0o22;bin:0b10010'
千位分隔符
可以使用","来作为千位分隔符:
>>>'{:,}'.format(1234567890)
'1,234,567,890'
百分数显示
>>>"progress:{:.2%}".format(19.88/22)
'progress:90.36%'
事实上,format还支持更多的类型符号:
type::="b"|"c"|"d"|"e"|"E"|"f"|"F"|"g"|"G"|"n"|"o"|"s"|"x"|"X"|"%"
其他技巧
占位符嵌套
某些时候占位符嵌套还是很有用的:
>>>'{0:{fill}{align}16}'.format("hello",fill='*',align='^')
'*****hello******'
>>>
>>>fornuminrange(5,12):
...forbasein"dXob":
...print("{0:{width}{base}}".format(num,base=base,width=5),end='')
...print()
...
...
555101
666110
777111
88101000
99111001
10A121010
11B131011
作为函数使用
可以先不指定格式化参数,而是在不要的地方作为函数来调用:
>>>email_f="Youremailaddresswas{email}".format
>>>print(email_f(email="suodhuoty@gmail.com"))
Youremailaddresswassudohuoty@gmail.com
转义大括号
当在字符串中需要使用大括号时可以用大括号转义:
>>>"The{}setisoftenrepresentedas{{0}}".format("empty")
'Theemptysetisoftenrepresentedas{0}'
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。