ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

python-字符串全解(五):字符串格式化表达式以及格式化方法(1)

python-字符串全解(五):字符串格式化表达式以及格式化方法(1) 这一章我们来谈论字符串的格式化表达式以及格式化方法。在早期的时候python只提供字符串格式化表达式这个看起来就是从C那边继承过来的后来有推出了字符串格式化方法。这两种方式都能实现字符串的格式化各有优劣。格式化表达式更像是语言的特征。但是从目前来看我们很难说明哪一个更好它们的功能很相似要同时记住这两种相同的且复杂的用法确实和python标榜的简洁相背不过既然这已然是客观现实所以我们还是都需要学习一下的。你可以根据自己的爱好选择其中一种但是难免会遇到其他人和你有不同的偏好所以下面我们会对比这两种用法来讲。1.字符串格式化表达式格式概述...%s... % (values)字符串格式化表达式随着python语言出现已经有了在python2.6以前的代码中就大量存在了即便是现在很多程序员也习惯了这种方式这个c语言的printf的格式化很像printf(%s...%d,a,2)这个printf函数的第一个参数是不是和格式化表达式的字符串很像后面第二个参数是a对应的是%s第三个参数是2对应的是%d。第二个和第三个参数对应的就是格式化表达式的values我们看这个valuse用双括号括住了说明这个参数是一个元组。当然如果values只有一个值这个括号是可以省略的但是一定要记住这是一个元组尤其是有多于一个值的时候需要用括号括起来。关于%s 和%d我们会后续慢慢说明。当然后面参数用元组还有一种表现形式是字典...%s... % {key:value,...}通过字典可以不按顺序引用参数。2.字符串格式化方法概述...{}....format(values)在字符串部分其中{}可以看作是字符串表达式中的%s字符串中有几个{}format方法的参数一般情况下就有几个这和格式化表达式中的valuse可以看作是一样的。但是如果values的个数多于{}呢答案是如果values的个数多余字符串中的格式化占位符那么多余的参数会被忽略但是如果少了呢这得分两种情况来讲一种情况会出错但是另外一种情况不会出错。我们看下下面格式化表达式和格式化方法的简单对比a %s % abc #b %s %d % abc #TypeError: not enough arguments for format string c %s %d % (abc, 1) #d %s %d % (abc, 1, efg) #not all arguments converted during string formatting e {}.format(abc) #f {} {}.format(abc) #IndexError: Replacement index 1 out of range for positional args tuple g {} {}.format(abc, 1) h {} {}.format(abc, 1, 3) i {0} {0}.format(abc) j %(abc)s %(abc)d % {abc: 1} print(a {}, c {}, e{}, g {}, \ h {}, i {}, j {}.format(a, c, e, g, h, i, j)) #输出结果a abc, c abc 1, eabc, g abc 1, h abc 1, i abc abc, j 1 1我们可以看到a成功输出了abc但是b出错原因是字符串中有%s和%d两个格式化占位符但是最后的元组的值只给了一个报错也提示没有足够的参数。我们改成c给出相匹配的参数。d会出错原因是给出的参数多于格式化占位符这里我们给了三个但是格式化占位符只有两个。但是对于格式化方法却没有这个问题h就是这样虽然也给了三个参数但是可以成功最后的那个参数会被忽略这是格式化表达式和格式化方法的不同之处。e和g会成功因为参数个数和格式化占位符是一样的。f会失败因为格式化占位符有两个但是参数给了一个。但是同样的情况i就会成功因为i在{}中输入了数字这个数字代表参数的位置参数的位置是从0开始的所以我们可以用位置来代表参数即便是参数只有一个只要每个占位符都输入正确的参数位置那么这个方法的调用就是正确的我们可以看到结果是abc abc因为这两个格式化占位符都用了同一个参数。这里有一点要注意如果你要在{}中填入参数位置那么每个{}中都要填写要不然会出下面的错误ValueError: cannot switch from manual field specification to automatic field numbering。对于字符串格式化表达式要实现占位符比参数多的情况就需要将参数的元组形式换成字典的形式就像j这样我们用字典来作为参数在%和格式化类型码之间输入(key)注意这个key不需要带引导因为在字符串中直接写出来了就行。上面我们介绍了这两种格式化工具的整体上的异同之处也给出了使用它们的方法或许到这里你觉得你已经足够应对多数情况了事实上也是如此如果你只是打印一些参数那你已经学会了。但是字符串格式化表达式或者方法的重点在于格式化所以接下来我们要讨论这个格式化这里面涉及到的内容比较多但是如果你认真的学习掌握它们也是轻而易举的事情这对很多人来说都比较复杂但是不要怕我们终将完全掌握它只要你肯花时间。3.字符串格式化表达式详解在上面我们概述格式化表达式的时候我们用到了%s%d这样的形式当时可能好奇为什么是%s或者%d。在格式化表达式中%代表格式化参数的占位符意思是需要有个参数放在这里替换%然后跟的是要替换的参数需要以什么形式出现这个形式我们叫做类型码就像上面我们写到的用s或者d都属于类型码。如果有人看到过别人写的书或者文章喜欢用表格来列出这些类型可能你一扫而过将来用的时候也就会比较迷茫。如果我们对一个新事物的认识如果一开始没有透彻那么你带着这种不透彻继续往下学习会发现转过头就会忘记了。所以我不会用表格列出对于每个类型码逐一的介绍这样你不会一扫而过同时也会加深理解。3.1类型码3.1.1 字符串(s)s代表字符串那么对应的参数应该是字符串或者是任何可以通过str()转化为字符串的对象。看下面的代码class NoStr: __str__ None class A: pass nostr NoStr() aclass A() a %s % abc b %s % 1 c %s % [abc, 1] d %s % {abc: 1} e %s % aclass #f %s % nostr #TypeError: NoneType object is not callable print(a {}, b {}, c {}, d {}, e {}.format(a, b, c, d, e)) #输出结果a abc, b 1, c [abc, 1], d {abc: 1}, # e __main__.A object at 0x103a41ca0从上面的代码可以看出a对应的参数是字符串b是整数c是列表d是字典e是用户定义的类这些都可以打印出来因为除了a虽然都是别的类型它们都可以通过str()调用返回一个字符串。python3已经移除了经典类也就是说所有的类都继承自objectobject实现了__str__方法所以不存在那个类不能通过str转换的因为你通过str()最终是调用了这个类内部__str__方法我们可以看到e打印了类的信息。当然我们对类NoStr做了一个小小的设置将这个__str__方法设置为None一方面是我们在这个类中定义相同的方法会屏蔽父类中同名的方法另一方面因为我们设置这个方法为None在调用的时候None是不可调用的所以最终会报错就像f一样我们通过将__str__方法设置为None近似模拟了不支持str转化的类。当然这和不存在__str__方法还不一样因为__str__方法是python内部的方法我们是无法删除的当然还有更高级的拦截技术而且我假定我们现有的知识还不足以用元类这样的高阶用法所以这里就不展开讲了。你或许以为到这里s就介绍完了其实不然既然重点是格式化那么s显然只是个类型码还不能完全代表格式。比如我打印的是一个列表列表每个成员有长有短我想他们占用的长度是一样的对齐的方式也是一样的此时显然一个类型码不能完全的解决问题。那么接下来我们就引入了字符串格式化的一般结构%[(keyname)][flags][width][.precision]typecode这个结构和我们上面代码中只输入%s显然要复杂的多。如果你对一些说明性的文档很熟悉那么用方括号[]扩起来的参数都是可选的所以我们的%s就相当于只选了一个typecode。在上面介绍参数个数和格式化占位符个数对应的时候我们提到了字典(keyname)就是后面的参数是字典而不是元组的时候用这个上面我们已经说过了这次就不再多说。3.1.1.1[flags]这个就是我们所说的对齐标签一共有四个值左对齐-1数值符号正数前的空白空格零填充(0)我们一个个的详细说明。左对齐(-1)表示在格式化的时候这个参数需要靠左对齐。如果没有设置[width]参数对齐就无从谈起因为看不出来只有在宽度大于参数占据的字符数的时候没有占据的部分会默认用空格表示这时候才能看出来参数是靠左还是靠右。如果设置了[width]默认为右对齐所以在这种情况下我们需要用-1来修改成左对齐。数值符号()这个参数的类型码是数字类型的时候才起作用对字符串无效。如果设置则这个参数会在数值为正数的时候显示。这里的数字类型包含了整数以及浮点数。正数前的空白(空格)这个只有是数字类型的类型码才起作用对字符串无效。假如这个数是正数则正数前加一个空白如果是负数则负号会替代这个空白这样做保证数字对齐。零填充(0)这个只有是数字类型的类型码才起作用对字符串无效。设置了[width]如果宽度大于参数占用的字符数并且没有设置左对齐都会用0填充。3.1.1.2[width]这个[width]用来规定这个参数应该占有的最小的字符数记住这是最小的字符数假如你设置这个[width]是10但是这个参数本身要占11个字符那么这样10就不会起作用。3.1.1.3[.pricision]浮点数精度顾名思义这个用于浮点数用来设定浮点数小数点后面的位数如果不设置默认的精度是6。当然你如果在整数上也设置了这个那么这个的意义和[width]是一样的如果同时设置了[width]那取最大的那个。不过一般情况下最好只是针对浮点数用以免引起不必要的混乱这个精度设置对字符串无效。[width]和[.pricision]还有一个特别诡异的用法他可以将[width]和[.pricision]从参数读入从而动态的配置这非常的抽象且不符合一般人的认知。为了更好的说明这些问题请参照以下代码a |%s| % abc b |%5s| % abc c |%5s| % abcdefg d |%-5s| % abc e |%-.5s| % abc f |%-*s| |%0 *s| % (5, abc, 6, 12) print(a {}, b {}, c {}, d {}, e {}, f {} .format(a, b, c, d, e, f)) #输出结果a |abc|, b | abc|, c |abcdefg|, d |abc |, # e |abc|, f |abc | | 12|a没有添加任何格式化标签显示的就是|abc|b设置了宽度是5我们发现abc靠右显示了并且左边填入了两个空格以对应最小占位是5。c设置的宽度仍然是5但是因为参数的长度显然超过了设置的宽度所以会按照实际的宽度显示。d通过设置-将字符靠左对齐并且在右侧补了两个空格。e通过给字符串设置精度从打印结果来看这个精度对字符串无效。f是一个混合体第一个格式化位置设置了靠左并且将宽度设置为*这时候就需要从下一个参数中读取这个值此时的下一个参数就是第一个参数就是5然后s读取下一个参数就是“abc”所以这个%-*s就等于%-5s然后第二个格式化位置设置了0就是不足的位置补0并且设置了就是整数要带加号然后又设置了空格表示如果正数就在正数前显示一个空格这和自相矛盾我们可以发现这三个设置对字符串都是无效的。然后我们又有碰到*我们从下一个参数读取这个值发现是6然后到s读取下一个值12我们可以看到打印出来的12靠右并且前面左侧填充了四个空格。3.1.2 十进制整数(d或者i)当我们将s换成d的时候就代表十进制数所有的参数都将转化为十进制数来表示当然前提是你这个参数能转化为十进制才行对于各种类型的数据转化为10进制可不像转化为字符串那么容易成功。在上面的小节中我们已经完全介绍了各种格式化标记所以我们直接看代码#a |%d| % 123 #TypeError: %d format: a real number is required, not str b |%d| % 123 c |%5d| % 123 d |%5d| % 1234567 e |%-5d| % 123 f |%05d| % 123 g |%-05d| % 123 h |%-.5d| % 123 i |%-07.5d| % 123 j |%- *.*d| |%0 *d| |%05d| % (7, 2, 123, 6, 12, -12) print(b {}, c {}, d {}, e {}, f {},\ g {}, h {}, i {}, j {}.format(b, c, d, e, f, g, h, i, j)) #输出结果b |123|, c | 123|, d |1234567|, e |123 |, f |00123|, # g |123 |, h |00123|, i |00123 |, j | 123 | |00012| |-0012| from decimal import Decimal k |%d| % 0x12 l |%d| % 0b10010 m |%d| % 0o22 n |%d| % 0.85 o |%d| % 1.85 p |%d| % Decimal(1.85) q |%d| % 200.2e-2 print(k {}, l {}, m {}, n {}, o {}, p {}, q {} .format(k, l, m, n, o, p, q)) #输出结果k |18|, l |18|, m |18|, n |0|, o |1|, p |1|, q |2|a直接报错说明参数必须是数字不能是str这就杜绝了一些可能的自动转化。b直接输出123c因为设定width为5所以靠右显示并且在左边设置了两个空格。d虽然设定width是5但是因为数字本身是7位所以按照7位展示。e通过-让数字靠左展示可以看到右边补充了两个空格。f设定了0以及宽度表示不足的地方补0所以可以看到在左边补了两个0。g同时设定了靠左不足补0我们发现这个补0并没有起作用原因是如果靠左了补0就会在右边现在整数右边补0会改变数值大小所以整数在靠左的情况下补0无效。h体现整数只设置精度的情况下也可以实现类似宽度的效果参数靠右并且在左边补了0。精度的补0和设置0来补0是不同的。和g一样都是设置了靠左但是这个精度是先补足精度然后再靠左所以会在左边补0。i同时设置了靠左补0宽度精度因为宽度大于精度所以占7个字符精度是5所以得出00123因为靠左所以不会再去补0而是在右边填充了两个空格。j有三个参数第一个设置了靠左正数前面加空白就是*前面设置的空格然后第一星号从下一个参数读取宽度以及.之后的第二个星号从下一个参数读取精度从参数可以看出宽度是7精度是2因为是整数所以这个精度虽然小于整数但是并不会截断整数这个精度等于无效。所以最近显示了7个字符的宽度因为设置了-就会靠左展示因为设置了空格这个是正数所以前面需要有一个空白所以靠左的第一个位置是空白后面跟着123并且不足的位置补空格。第二个设置了不足的位置补0如果是整数应该显示加号正数前面加空格以及从下一个位置读取宽度我们可以看出不足的位置确实补了0并且加了号但是正数前面的空格没有加这是因为空格和号冲突了所以空白不起作用。第三个设置了不足的位置补0如果是正数前面显示加号以及宽度5因为是负数所以没有显示加号而显示负号因为-12不足5位所以在前面补了两个0。从k到q展示了不同类型的数字到十进制的转换。klm分别是十六进制二进制以及八进制他们都表示十进制的18所以我们看到格式化成10进制的形式打印出来的值都是一样的。n和o都是浮点数转换为整数的时候会丢失精度而且用的是floor转换意思是不论小数点后面的值是多少一律舍弃。p是小数q是指数浮点数转化为整数的道理是一样的都会丢失小数部分。之前我们都用是d来表示十进制整数如果你把d换成i效果也是一样的。这里面有c语言的历史原因不过目前python建议都用d所以你如果看到别的代码里面写i就认为和d是一样的。3.1.3 十进制浮点f(F)对于十进制浮点数的格式化我们用f来表示对于参数也一样只要能转化为浮点数的类型就能正确的用f来格式化。目前来看只要是数字类型的都可以用转化为浮点数。看下面的代码#a |%f| % 123 #TypeError: must be real number, not str b |%f| % 123.12 c |%12f| % 123.1 d |%12f| % 1234567.1 e |%-12f| % 123.1 f |%012f| % 123.1 g |%-012f| % 123.1 h |%-.2f| % 123.1 i |%-12.5f| % 123.1 j |%- *.*f| |%0 *f| |%012f| % (7, 2, 123.121, 14, 12.12, -12.12) print(b {}, c {}, d {}, e {}, f {},\ g {}, h {}, i {}, j {}.format(b, c, d, e, f, g, h, i, j)) #输出结果b |123.120000|, c | 123.100000|, d |1234567.100000|, # e |123.100000 |, f |00123.100000|, g |123.100000 |, h |123.10|, # i |123.10000 |, j | 123.12| |000012.120000| |-0012.120000| from decimal import Decimal k |%f| % 0x12 l |%f| % 0b10010 m |%f| % 0o22 n |%f| % 0.85 o |%f| % 1.85 p |%f| % Decimal(1.85) q |%f| % 200.2e-2 print(k {}, l {}, m {}, n {}, o {}, p {}, q {} .format(k, l, m, n, o, p, q)) #输出结果k |18.000000|, l |18.000000|, m |18.000000|, n |0.850000|, # o |1.850000|, p |1.850000|, q |2.002000|上面的代码和整数的情况差不多我们快速的过一下。a会出错那是因为字符串无法转化为浮点数。b的参数是浮点数可以直接打印出浮点数格式化浮点数默认的精度是6可以我们可以看到小数点后面有6位不够的情况下会补0。c设置的宽度是12所以默认会靠右显示左边用空格补足。d设置的宽度是12但是因为这个浮点数整个占位超过12位所以会按该浮点数的实际占位的长度来展示。e设置了靠左展示宽度12位我们会发现右边是以空格补全。f设置了不足补0宽度12所以该浮点数靠右展示并且左边用0补充。g设置了靠左展示不足补0宽度12因为是靠左展示所以左边不会补0并且因为默认的精度是6所以在小数点后面补了5个零剩余用空格来填充。h设置了靠左展示设置精度是2所以我们发现小数点后面只保留了两位因为没有设置宽度所以不设置靠左展示的效果也是一样的也就是我们写为h |%.2f| % 123.1。i设置了靠左展示宽度12精度5因为展示的宽度不足12所以会在右边补空格。j第一个格式化位置设置了左对齐正数前面补空格宽度从下一个参数读取第一个参数7精度从下一个参数读取第二个参数2第三个参数是第一个位置需要格式化的参数。所以展示出来是靠左但是前面有一个空格这是因为正数的原因精度度是2因为宽度是7所以右边没有补空格刚好满足宽度。第二个格式化位置设置了不足补0如果是正数则前面加加号如果是是正数则前面加空格宽度从下一个参数读取第四个参数14因为设置了正数前面显示加号所以设置正数前面加空格无效因为宽度大于展示的位数并且没有设置靠左所以会靠右展示并在左侧补0。第三个格式化位置设置很相似只是参数是负数所以最终是靠右展示左边不足补0因为是负数所以数字前面是负号而不是加号。从k到q只是将这些不同类型的数转化为浮点数再展示这里便不再赘述。如果你把小写的f换成大写的F效果是一样的因为浮点数除了数字没有别的。上面对于字符串十进制正数浮点数的格式化所有的规则我们都说的很详细了。我们再来回顾一下这些标志看看你忘记了没有(keyname)主要是针对参数是字典形态这样你可以根据字典的键名来锁定参数而不需要按顺序来。flags包含如果是正数在前面显示-左对齐或者靠左显示空格如果是正数则在数字前面显示一个空格这个和冲突所有如果设置则显示0如果给定了宽度参数的位数小于宽度的时候用0来补充但是如果指定-左对齐这时0不会被填充到左边直接无效只有-左对齐对字符串有效其他设置对字符串无效。width指定参数占位的最小宽度指定宽度后默认右对齐或者靠右展示如果宽度小于参数的长度则按照参数的长度展示.pricision指定浮点数的精度精度的优先级高于宽度例如对于小数1.1精度设置为5宽度只是4那么会忽略宽度直接显示1.10000精度有默认值不设定的时候默认为6。对于整数例如%d如果你设定了精度则会在前面补0即使你设定了靠左对齐。所以精度的优先级时高于其他的设定的。精度设定对字符串是无效的。上面的总结在给出的代码中都有明确的例子如果你忘记了请回头再温习一下。下面的其他类型码我会简略的说明因为上面的例子已经足够你举一反三了。3.1.4指数浮点数e(E)指数浮点数e和十进制浮点数f是一样的只是表现形式不同。直接看下面代码#a |%e| % 123 #TypeError: must be real number, not str b |%e| % 1231111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111.12 c |%13e| % 123.1 d |%12e| % 1234567.1 e |%-12e| % 123.1 f |%014e| % 123.1 g |%-014e| % 123.1 h |%-.2e| % 123.1 i |%-14.5e| % 123.1 j |%- *.*e| |%0 *e| |%014e| % (7, 2, 123.121, 14, 12.12, -12.12) print(b {}, c {}, d {}, e {}, f {},\ g {}, h {}, i {}, j {}.format(b, c, d, e, f, g, h, i, j)) #输出结果b |1.231111e105|, c | 1.231000e02|, d |1.234567e06|, e |1.231000e02|, # f |001.231000e02|, g |1.231000e02 |, h |1.23e02|, i |1.23100e02 |, # j | 1.23e02| |01.212000e01| |-01.212000e01| from decimal import Decimal k |%e| % 0x12 l |%E| % 0b10010 m |%e| % 0o22 n |%e| % 0.85 o |%e| % 1.85 p |%e| % Decimal(1.85) q |%e| % 200.2e-2 print(k {}, l {}, m {}, n {}, o {}, p {}, q {} .format(k, l, m, n, o, p, q)) #输出结果k |1.800000e01|, l |1.800000e01|, m |1.800000e01|, # n |8.500000e-01|, o |1.850000e00|, p |1.850000e00|, q |2.002000e00|上面的代码和f的代码差不多只是b我将参数的小数点之前的位数加到100以上。一般情况下我们不会有这么大的数字所以我们可以看到格式化成e的固定形式是指数部分永远是(-)xx的形式这个xx一般第一个x是0说明指数部分即便不够两位也要补全为两位这是e类型码的固定形式和我们上面所说的设置没有关系。同时e永远是以x.xxxxxx开始的这也是固定的形式固定精度也是6位。排除这些e本身的点其他和十进制浮点数f一模一样。同时看l这个里面我讲类型码由小写e改为大写E则显示的时候显示大写E。3.1.5浮点数g(G)刚学完十进制浮点数和指数浮点数这时候又冒出来一个浮点数是不是有点意外。有时候我们可能想一股脑儿的处理浮点数只要求简洁的表示形式而不要求固定的格式。这时候用g是最好的选择他会根据参数的情况自动选择是用十进制浮点数展示还是用指数浮点数展示。看下面的代码#a |%e| % 123 #TypeError: must be real number, not str b |%g| % 1231111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111.12 c |%13g| % 123.1 d |%12g| % 1234567.1 e |%-12g| % 123.1 f |%014g| % 123456 g |%-014g| % 123.1 h |%-.2g| % 123.1 i |%-14.5g| % 123.1 j |%- *.*g| |%0 *g| |%014g| % (7, 2, 123.121, 14, 12.12, -12.12) print(b {}, c {}, d {}, e {}, f {},\ g {}, h {}, i {}, j {}.format(b, c, d, e, f, g, h, i, j)) #输出结果b |1.23111e105|, c | 123.1|, d | 1.23457e06|, e |123.1 |, # f |00000000123456|, g |123.1 |, h |1.2e02|, i |123.1 |, # j | 1.2e02| |0000000012.12| |-0000000012.12| from decimal import Decimal k |%g| % 0x12 l |%G| % 0b10010 m |%g| % 0o22 n |%g| % 0.85 o |%g| % 1.85 p |%g| % Decimal(1.85) q |%g| % 200.2e-2 print(k {}, l {}, m {}, n {}, o {}, p {}, q {} .format(k, l, m, n, o, p, q)) #输出结果k |18|, l |18|, m |18|, n |0.85|, o |1.85|, p |1.85|, q |2.002|从上面的代码中我们可以总结出如下的规律1精度我们看到默认的精度还是6但是这个精度不是小数点后的精度是小数点前后加起来的精度从b和d便可得出这个结论。这个精度会尽量的省略没有必要的0例如c它不会在小数点后面补0甚至参数是整数也不会带小数点的例如g主打一个怎么简洁怎么来。2如果这个数达到百万也就是说整数部分到达7位的时候就会展示为指数浮点数小于百万则显示十进制浮点数。d和f很好的展示了这个特点。3当用G时如果显示指数浮点数则用大E来表示。除了上面说的三条其他方面的设置基本上和十进制浮点数或者指数浮点数一致。3.1.6 八进制(o)十六进制(x,X)为什么有10进制8进制16进制恰恰没有二进制呢这有一定的历史原因之前也说过python的这种格式化来源于CC就没有这个设计另一方面二进制实在是太长了打印出来看起来太过于麻烦所以没有实现。不过python后面出了f-string在这个格式化里面加上了b来表示二进制。 八进制十六进制和十进制其实没啥太多区别所以我们简单看几个例子。#a |%0| % 123 #TypeError: must be real number, not str b |%o| % 12311111111111111111111111111111111111111111111111111 #c |%13x| % 123.1 d |%12x| % 123 e |%-12x| % 123 f |%014o| % 123456 g 10 h f{g: b} print(b {}, d {}, e {}, f {}, h{}.format(b, d, e, f, h)) #输出结果b |4071715243006206037625053346316573622720270707070707070707|, # d | 7b|, e |7b |, f |00000000361100|, h 1010 from decimal import Decimal k |%x| % 0x12 l |%X| % 0b10010 m |%x| % 0o22 n |0o%o| % 0o22 o |0x%x| % 0o22 #n |%x| % Decimal(1.85) print(k {}, l {}, m {}, n {}, o {}.format(k, l, m, n, o)) #输出结果k |12|, l |12|, m |12|, n |0o22|, o |0x12|上面的代码中只能输入整数浮点数会报错这不像十进制d可以将浮点数转化为整数所以c会报错。还有就是转化为八进制或者十六进制之后数字前面是不会带0o或者0x这样的标志这一点需要明白为了显示进制的前缀我们需要手动加上例如n和o记住需要加到%号前面要不然会当成类型码。小写x和大写X效果都是一样的。 h是python新加的f-string通过设定:b来打印二进制。3.1.7字面量%因为在字符串格式化表达式中%已经有了特殊的含义所以如果我们需要在字符串格式化表达式中表示%字面量的时候就需要特殊的写法这个就是用%%来代表%看下面的代码#a %d% % 36 #ValueError: incomplete format b %d%% % 36 print(b {}.format(b))上面的代码我们想在格式化串中表示36%像a这样直接在d后面写一个百分号会提示格式化不完整的错误。为了在格式化串中表示%的字面量我们就必须写两个百分号。这个我们之前将转义字符的时候是一样的因为\时转义字符的开始标志为了表示\本身我们就得用两个斜杠\\。好了碍于篇幅限制字符串表达式我们就谈到这里下一章我们来讨论字符串格式化方法。
返回列表