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}'
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。