![Python实战指南:手把手教你掌握300个精彩案例](https://wfqqreader-1252317822.image.myqcloud.com/cover/214/44510214/b_44510214.jpg)
1.4 格式化字符串
案例13 输出十六进制字符串
导语
字符串的格式化方法是在字符串表达式前面加上前缀f,字符串表达式中需要进行格式化处理的部分用一对大括号包裹起来。大括号内可以是任意表达式,也可以引用其他变量。例如:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P34_80076.jpg?sign=1739304069-2VbV1cEXc6CsismGLle6fSYhhTKyYCjA-0-9cd6e8ec05cfdf10f68fe3209bc59b59)
字符串表达式中的“{age}”就会被age变量的值替换,最终字符串表达式会变成
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P34_80077.jpg?sign=1739304069-f9j7IqFSfpzLsyaTu0GV6nRs6WbRgKkw-0-a7d6d3397176ca703701e86c8a1881e7)
在大括号中,表达式之后可以使用格式控制符来定制字符的显示格式。格式控制符以一个冒号(英文标点)开头。例如,下面格式控制符表示一个浮点数的字符串形式,并且保留两位小数(形如“0.15”“73.08”等)。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P34_80078.jpg?sign=1739304069-xUYFkHJedgIQLCg5EgtV7BJSYKULdTcI-0-699b6e7ab63c9f00913a5bcd016c5024)
产生的字符串为“0.13”。大括号中的f表示输出内容的类型为浮点数,小数位的设置必须以“.”开头,后面的数值即所保留的小数位数。
本案例希望输出数值的十六进制字符串,一般常见的格式为0xnnnn或者0XNNNN。只要把上面例子中的f改为x或者X,就可以将数值转换为十六进制的表示形式。X表明十六进制中的字母为大写(A、B、C、D、E、F),x则表明字母是小写(a、b、c、d、e、f)。
操作流程
步骤1:定义一个整数列表。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P35_80080.jpg?sign=1739304069-X7dFoMLffBArNuC9AwRi9flkeeamu3PP-0-886c579181baed0a6ba87c646dc5f27c)
步骤2:通过for循环,将列表中的数值分别以十进制和十六进制的方式打印出来。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P35_80081.jpg?sign=1739304069-rWNgJ34W4sq79edph70zb9Wuj9wvneYE-0-2ad689f152a1483f2801e36099f979b0)
在输出十六进制的字符串时,格式控制符x前加上“#”符号,可以让输出的十六进制字符串前面加上“0x”,形如0x20e4c。
“6d”中的数字6表示生成的字符串宽度为6个字符,如果实际字符数小于6,则剩余空间用空格填充;“#8x”中的数字8的含义也一样,即生成的字符串宽度为8个字符。
步骤3:执行上述代码,得到如下结果。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P35_80082.jpg?sign=1739304069-uuiJ6pm4MTqAWAtKbCwT2AJ7LlUzpuLW-0-3d361b3962ee9829937a3fc68605f1bd)
其中,左边的数值为十进制,右边是与之对应的十六进制数值。
案例14 设置字符串的对齐方式
导语
在定制字符串格式时,可以指定字符串的对齐方式,使用到的字符为:“<”“>”“^”或“=”。其中,“<”表示左对齐,“>”表示右对齐,“^”表示居中对齐。另外,“=”比较特殊,它只用于数字类型。“=”控制符将数值的符号对齐到左边,把数值部分拉到右边,中间的空余部分由空格或者“0”填充。例如
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P35_80085.jpg?sign=1739304069-9I4BggXKfCjZpuzedcq9RbdJjVsTOsh2-0-578f394f1e51c266de5bfe074a450b04)
操作流程
步骤1:输出三行字符串,对齐方式依次为左对齐、居中对齐和右对齐。为了让对齐效果更直观,设置字符串的总长度为30个字符。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P35_80086.jpg?sign=1739304069-UHVm8uAClq6oQncdOypy114bEHquxaIo-0-3de2c6afb585bf6101173d53f295cdd0)
字符串在对齐后,剩余的字符空间将用空格来填充。输出结果如下:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P36_80089.jpg?sign=1739304069-ysX5zaZ1XjLXj5viPEhJEGgn2x4odeYg-0-b3170c0afdf5516c749bec8eb4012803)
步骤2:输出三行字符,对齐方式依次为左对齐、居中对齐和右对齐,字符总宽度也设定为30。这一轮输出将使用“∗”符号来填充剩余空间。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P36_80090.jpg?sign=1739304069-U3OGskJ866IV4O7jlEDjs8h2RBczp7V1-0-a941bc5e88cec714ffa992ecf77e42d6)
把“∗”字符放在对齐控制符(“<”“>”等)之前,表示用该字符去进行剩余空间的填充。其输出结果如下:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P36_80092.jpg?sign=1739304069-PKrSshl1t06uVoPIehVe5SZyr70RXaIk-0-286293a01ab0408ffa6b5b87fa885ca3)
步骤3:“=”对齐控制只适用于数值类型的格式(如“d”“x”等)。下面代码依次输出十六进制、八进制、十进制、二进制的数值,并使用“=”控制让其两端对齐。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P36_80093.jpg?sign=1739304069-rhoB3UXjAjDQunY2TlfwhcR6AI69IvVe-0-ff1cb5b3e65fd7fb655618e6a5ee493f)
输出结果如下:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P36_80094.jpg?sign=1739304069-zgztdCIA8A1lod1qjHn2S7ljr2dq4d2x-0-2bc39bdf912c14f05477bb36a2a7c2c2)
在格式控制符中添加“#”字符的含义是:当呈现十六进制数值时会在字符串前面加上“0x”或“0X”;当呈现的是八进制的数值时,会在字符串前面加上“0o”;当呈现的数值是二进制时,会在字符串前面加上“0b”。
案例15 数字的千位分隔符
导语
每三位(千位)使用一个逗号分隔的数字格式多见于财务计算,在对字符串进行格式化时,只要在类型标志或宽度/小数位标志前面加上一个英文的逗号,输出的数字文本就会每三位(千位)插入一个英文的逗号。
逗号标志一般与d(十进制整数)或f(浮点数)一起使用,不能与n(常规数字)一起使用。因为n标志表示的数字格式是以区域/语言的本地化设置相关,与逗号标志连用可能会发生冲突。
操作流程
步骤1:声明变量,并赋值一个浮点数值。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P37_80096.jpg?sign=1739304069-7i7gyr8WcXQ5TfOSQuHhPi6yQzCbhalO-0-cb61722d0e5e027d897a4e41fa39dc07)
步骤2:格式化为整数,并加上千位分隔符。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P37_80097.jpg?sign=1739304069-wM645JVo40JDoDFfNNVeQXB1L1w4rqiA-0-e9a17cf04f79e877dc38234c5003e9d0)
d标志符只能用于整型数值,因此需要调用int类的构造函数int(num)将浮点数值num转换为整数值。
输出结果如下:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P37_80098.jpg?sign=1739304069-YVNUodMLZ3EksYsgBarULODQjx9iLq2w-0-1cf91d6753dea423a7a01b16e608fbe7)
步骤3:输出浮点数值,并加上千位分隔符。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P37_80099.jpg?sign=1739304069-trMbK8MNdaIYp1BjG0ykkmIllONiDrDI-0-50bf2b8e519cf1d0f8e5584bceb14913)
输出结果如下:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P37_80100.jpg?sign=1739304069-Ewe6BS6Ru8wQZvDFQwqmVKL2VSU7XE7s-0-b464fbc9a491df1c8d630c9c94a8105f)
步骤4:输出浮点数值,加上千位分隔符,并保留两位小数。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P37_80101.jpg?sign=1739304069-fo0o6kLdsWVjNBKf6HXw8l1ME5IyYU7C-0-bd1eb8ec86dbfc960ce091d1b66a3f6e)
输出结果如下:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P38_80103.jpg?sign=1739304069-rukk5gHr1QaYGux5PnhkzTnlc0mlaD3S-0-5ccef81cc450d12c98bf2f94dbbce99c)
案例16 “_”分隔符
导语
下画线(_)分隔符的作用与逗号分隔符相同,可以对数值字符串进行分组。对于十进制数值,下画线每三位(千位)一组;而对于二进制、八进制、十六进制的数值字符串,下画线每四位一组。
操作流程
步骤1:声明变量并赋值。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P38_80104.jpg?sign=1739304069-uqMxbkNXdBBCW2k2xsboA7k12aoc3H57-0-9eadd9c40f8d94ca37716aa93df629bf)
步骤2:分别输出变量number的十进制、二进制、八进制、十六进制的字符串形式,以下画线作为分隔符。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P38_80105.jpg?sign=1739304069-i1SMcuiSBAKFHyhegDesJtPb3LFZ0kjp-0-0702d6f9e8aa67ff89db6957297db89d)
步骤3:运行以上代码,得到如下结果。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P38_80106.jpg?sign=1739304069-3EVWCRfCJ4HT1CCcKNZj7jCQHr9lI8bA-0-9d66fbebcac6892710e022f6a1e9e712)
案例17 自定义日期格式
导语
常用的日期/时间格式控制符如表1-1所示。
表1-1 常用日期时间格式控制符
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-T38_80108.jpg?sign=1739304069-IOZY6GwIkNNFODc0w89WVUohhSlaVmEH-0-8dfae0fe6507dce8ac33e664fb59e1a5)
操作流程
步骤1:导入datetime模块。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P40_80187.jpg?sign=1739304069-9bfgnFBvqbTQC54EsrQ5BxeYzu9zXaVq-0-fd7ac125d30ca7a4fc7030c847dc5348)
步骤2:案例化一个date对象,它表示日期数据。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P40_80188.jpg?sign=1739304069-DD5RsnQKir9SZot1OsOdrJproL5FdgSk-0-304d64529f5add4b133e9584d87515ed)
调用构造函数时传递的参数依次为年、月、日。
步骤3:输出形如“2015-9-15”的格式。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P40_80189.jpg?sign=1739304069-HjNJkcSLZ2ViKNdGTAD8cdB7L4nJpQiY-0-85415e758e66fe76a6f8b388d9c3689c)
步骤4:输出形如“2015年9月15日”的格式。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P40_80190.jpg?sign=1739304069-n1P1l84HNmNMSuX7OGNV2FIJdJgtyEbf-0-5a5de64d55641f379450c33c983d258b)
步骤5:案例化一个time对象,它表示时间数据。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P40_80191.jpg?sign=1739304069-Ze7mdUbi1R0Jn9THmuDg60BUjFBpEqBM-0-0f3b4256cd2800a853094949c62fca7d)
传递给time类构造函数的参数值依次为时、分、秒。
步骤6:输出本地化的时间格式。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P40_80192.jpg?sign=1739304069-F531pWPSbhti9WqUFRyrH0i2cMlDghUy-0-dfc7027e2661ec7b306d82b783697dad)
上述代码执行后的输出结果如下:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P40_80193.jpg?sign=1739304069-QqqhXY5YmK6sCIWUwvuUsvnWjMySPxRK-0-b66610e70ee1a8414c5d9a980d1ab928)
案例18 使用format方法
导语
字符串类型(str)有一个format案例方法,也可以对字符串进行格式化,使用方法与f前缀基本相同(差别主要在调用方式上,格式控制符的用法是完全一样的)。
在带格式化控制符的字符串中,可以使用序号或者命名方式定义占位符,然后调用字符串案例的format方法,并将要替换占位符的实际内容通过format方法的参数传递。举个例子,请读者思考以下代码:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P41_80195.jpg?sign=1739304069-1Du8foWqG1uHHvJLq92srxKhOnH2ip3u-0-5d05690d7c79b71b6975fdca6838a51e)
上述字符串中有两处占位符,序号从0开始。调用format方法时传递两个参数,第一个参数“Dick”替换字符串中的“{0}”,第二个参数“重庆”替换字符串中的“{1}”,于是,调用得到的新字符串为“我叫Dick,我来自重庆”。
当然,占位符也可以不用序号,而是直接取个名字,例如
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P41_80196.jpg?sign=1739304069-bwliVR7ps5TV3sjuvBGU11x0x9DSpcCn-0-f9d65e9fba6e7e6eafab3ae1430bc0d2)
如果占位符是命名的,那么在调用format方法时必须以关键字方式来传递参数,即必须写上参数名称。这些参数的名字与数量取决于原字符串中的占位符,必须一一匹配。例如,在上面代码中,字符串中有命名的为“who”的占位符,在调用format方法时,用“Lucy”进行替换;同理,参数count用7替换字符串中的“count”占位符,最终得到新字符串案例“你好,Lucy,你已完成7项任务”。
操作流程
步骤1:分别以十进制和二进制来显示同一个数值。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P41_80197.jpg?sign=1739304069-VzTdvJ0AkNxBxA7ggjsMWkU5X5wiHHeR-0-adc6880bdd9bc3dc9c99bf6cdf62d80d)
虽然字符串中有两处占位符,但它们的序号相同,因此,在format方法调用时,只要传递一个参数即可。
步骤2:以下字符串中有三处占位符。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P41_80198.jpg?sign=1739304069-10loV9vwebi4scqPkdtHwcwDVzSEghQk-0-6c16fa3190607ccdaaf7debfaaea2220)
参数值“1.png”替换字符串中的“{0}”,参数值“Bob”替换字符串中的“{1}”,参数值315073(整数值)替换字符串中的“{2}”(int类型的值自动转换为字符串)。
步骤3:再看看带有命名占位符的字符串。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P41_80199.jpg?sign=1739304069-5piVqGrYmWLWb40OOUL9PS6g5xDyyalA-0-6e93289a3e77443e100185117c7a7654)
“lang1”被“C++”替换,“lang2”被“Python”替换。
以上代码运行后的输出结果如下:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P42_80201.jpg?sign=1739304069-rQFmJIsGrRUM33QLUc3Ajd3E0T5huG3g-0-6bf59ed13bc3819a24561b78a664ba8e)
案例19 省略格式占位符的名称和序号
导语
通过调用format方法进行字符串格式化时,字符串中的占位符是可以省略其序号或者名称的。这种情况下,传递给format方法的参数的顺序,必须与占位符在字符串中出现的顺序一致。例如:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P42_80202.jpg?sign=1739304069-gXbQNrJIHdUGB3uRTleyUHPeyMKfNP0A-0-b5e5ab55c6a7dde5e9f617250fe6b25b)
格式占位符只用一对空白的大括号表示,format方法调用时所传递的参数值,会按照占位符出现的顺序进行替换。即:第一对大括号被整数值3替换,第二对大括号被整数值7替换。
操作流程
步骤1:声明三个变量。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P42_80203.jpg?sign=1739304069-aMLzTtw9ej15AumdABWqV4LKcCONjzx8-0-e1a951dc56b428658519dae14a88eeca)
变量a和b明确进行赋值,变量c的值来自于变量a和b的和。
步骤2:调用format方法进行字符串格式化。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P42_80204.jpg?sign=1739304069-xfIAItreDuYHlkllT9Ec8M9PiZC4kD58-0-3b0070d4b3cd64f64a616062f3e1de07)
在字符串表达式中,出现了三个占位符,但它们的序号(或名称)被省略。接下来必须向format方法传递三个参数值,用来依次替换字符串案例中的占位符。经格式化处理后输出的结果如下:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P42_80205.jpg?sign=1739304069-2XUj96xgap6gnpl7GCnyHUaDfOoIJMMx-0-69169a12ccd6558efcac4f96979b76b2)
步骤3:声明一个变量,使用十进制的整数赋值(int类型)。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P42_80206.jpg?sign=1739304069-MHDJUBk1xVL2h09DI11sAY3RnIt2SI1I-0-d8a20b8bd52f1abe73ae97b1a8c008d9)
步骤4:输出格式化字符串。变量dc的值在字符串表达式中出现两次,第一次显示为十进制整数值,第二次显示为八进制整数值。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P43_80208.jpg?sign=1739304069-9jhxkPVQdAuufmI6cXTgCyfW2DcmeKJB-0-710587f3ee6da572c24eb9d00a89218d)
虽然占位符的序号(或名称)被省略了,但使用格式控制符时依然要以英文冒号开头。变量dc在字符串案例中出现两次,尽管是同一个值,但在调用format方法时仍然要按照占位符出现的顺序和次数传递参数,所以变量dc被传递了两次。
格式化后的输出结果如下:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P43_80209.jpg?sign=1739304069-VCiPEE3pwmyoSbfTnsoNL6V6jZ2kB41f-0-1aeef1deb91a1e9d4dc9607ec74c6b8e)
案例20 字符串模板
导语
字符串模板允许在字符串中定义占位符,然后用具体的内容将占位符替换,此方案与字符串格式化类似。但字符串模板仅仅定义占位符,不定义格式控制符。
模板占位符的定义格式为:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P43_80210.jpg?sign=1739304069-OBGQFwwvgk0G1rgJ4y4gFbwdqdReOW8R-0-682afc309ba4c7cc5ff1c7314d4a3db4)
即以字符“$”开头,后面紧跟着的是占位符的名称。例如:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P43_80211.jpg?sign=1739304069-aGJpm3mWaYQJJCJnKlOXemcYbxNlvK1h-0-0cbac27760bb13ab6a34b9ab988dd4be)
如果占位符city的值为“天津”,那么由以上模板产生的字符串为“我来自天津”。如果字符中本身包含“$”字符,并非作为模板占位符名称,那么可以连用两个“$”来注明,也就是说,“$$”不会被识别为占位符。
占位符的名称有时候需要加上大括号,主要应用场景是:占位符名称与其他字符混合使用时,例如:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P43_80212.jpg?sign=1739304069-IncSWgaYFdVcqoQIJanzzEsxjv1FVhUS-0-ab11300e6b3bfba19c5b08db33c9612c)
这时候不容易确认占位符的名字是叫“o”,还是叫“os”或是“ose”,这种情况下,就需要使用大括号了,假设占位符的名字是“os”,那该字符串模板就要写成:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P43_80213.jpg?sign=1739304069-vphCUcs1RcuX5hVkI2YojYdUNkW9QpEs-0-87f78f8faf831bf860fd8029cce6b0d4)
字符串模板的使用方法是引入string模块中的Template类,将作为模板的字符串案例传递给Template类的构造函数,最后调用Template案例的substitute方法将字符串模板中的占位符替换并产生新的字符串案例。
操作流程
步骤1:导入string模块。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P44_80215.jpg?sign=1739304069-1SFD9opFrrQeGePVOonYri1CZmBVh9rt-0-8918182eb23f4a4d7d7ad93c540ef3f4)
步骤2:案例化一个字符串模板。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P44_80216.jpg?sign=1739304069-B3dOvf6zvdFIRYyCzrLm8ckUXyTmkjj9-0-a4654745d650cdcffa0336e5b595cdfa)
步骤3:对上述模板中的“what”占位符进行两次替换。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P44_80217.jpg?sign=1739304069-1XxRLYdlJgcEiVUy9DV7WwMdWtjeBx0X-0-0102b5dc55837d2dd0e33362c65b4eaf)
第一次替换时,用“白云”替换掉模板中的“what”占位符,产生的新字符串案例为“天空飘着几朵白云”;第二次替换时,“what”占位符被“乌云”替换,产生字符串“天空飘着几朵乌云”。
步骤4:再案例化一个字符串模板。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P44_80218.jpg?sign=1739304069-rgyRUSZ1OtKPhxa0Jn7sh2DeDS4Ijeby-0-cd50cfd0a4cfafb61b4aae4ebc72a536)
这种情况下,占位符“len”必须使用大括号来包裹,否则占位符名字会被识别为“leninch”,当替换“len”时会发生错误。
步骤5:将模板中的“len”占位符替换为具体的内容。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P44_80219.jpg?sign=1739304069-XFtttIIep6gc4kMVFLmYrZbUQwEFOiUE-0-7abb9fd513f5233c18391ae6a5058b79)
步骤6:本案例运行后输出的结果如下:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P44_80220.jpg?sign=1739304069-nq4MRvWHl2XkRMMtyGDsViGWGx1HypWH-0-593bba08e1ead4b9d6403fad1fc24b21)
案例21 字符串模板的安全替换模式
导语
string.Template类还公开了一个safe_substitute方法,此方法与substitute方法的功能相同——替换掉字符串模板中的占位符。但是,如果模板中的占位符数量与传递给substitute方法的参数不匹配,就会发生错误。这时就可以改用safe_substitute方法,该方法只替换参数与模板中能匹配的部分占位符,其余占位符将被忽略,不会引发错误。
操作流程
步骤1:导入Template类。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P45_80222.jpg?sign=1739304069-2ypbIwfu91nLK4CXb7DRenWjq2AJMMPp-0-b6eba0b31edfc2a3d84d2634d7174ea8)
步骤2:定义字符串模板。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P45_80223.jpg?sign=1739304069-q80wC49AXOi95ezlNvT5XyFXbVQVUKFr-0-0e547fa2da2d01c72140d1262ee5b8de)
步骤3:调用safe_substitute方法替换占位符。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P45_80224.jpg?sign=1739304069-IRHn1rNAXkH9ZvZRq7iwuntnqTzGXO14-0-93ff197d22e970bab5b10ce2229d806c)
上述调用中,只对名为“who”的占位符进行替换,但名为“football”的占位符没有被替换。尽管提供的方法参数与模板不完全匹配,但不会发生错误。
步骤4:模板替换后产生的字符串如下:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P45_80225.jpg?sign=1739304069-ZQmejDwx8xGRWXID4hSpY5D37HM2n2ij-0-62090af595768ff72947f33d6fbee625)
案例22 文本缩进
导语
textwrap模块提供了对字符串做换行、截断、缩进处理的API。本案例将使用到indent函数,它的原型如下:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P45_80226.jpg?sign=1739304069-9lSdJPPtYcA8LTWVDWZ83d00ZAliSDiM-0-36cafd1b10d2325e099f527918051266)
text参数指定等待处理的字符串案例(即原字符串)。prefix参数指定用作缩进的填充字符,例如空格。predicate参数是可选的,它可以引用一个函数,或者使用lambda表达式。predicate参数用于控制某一行是否允许缩进。当indent函数通过换行符(\n)分析出一行文本后,会将该行文本传递给predicate参数所引用的函数进行判断,如果允许缩进就返回True,否则返回False。
操作流程
步骤1:导入textwrap模块。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P45_80227.jpg?sign=1739304069-kcbW78Kwl52irc08oIGrK4Y7GltyjhFY-0-82379739613b9568be8ee863ccefb01f)
步骤2:声明变量并赋值,表示待处理的原字符串。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P46_80229.jpg?sign=1739304069-nLAIB4svNamK1LAiJ1yW4QXEqPogLZVe-0-04ccf1bf07f6abd79fbdd543f353f261)
文本中带有两个换行符,indent函数分析时会将它拆为三行。
步骤3:对文本进行缩进处理,缩进字符用加号填充。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P46_80230.jpg?sign=1739304069-5SnoR7LT7XCBJhQG5hlsh0qga54AUMhp-0-d2330a2a96e722892be8e26a9be81b23)
处理的结果如下:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P46_80231.jpg?sign=1739304069-iWqZjRfoP323yIRMgaotG90KZZCV01tb-0-bbb468883fb5f924395e9cc23e68b30f)
步骤4:有时候,会考虑跳过空行,即空白的行不缩进。例如这个字符串:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P46_80232.jpg?sign=1739304069-F3gOhjtOaLT7w9Td1EzEOnR747MkuW4q-0-3d20783e3f11dd1e5a925d84cf366dac)
上述文本中连用三个换行符,即产生了两个空白行。
步骤5:定义一个ignoreETLines函数,将空白行过滤掉。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P46_80233.jpg?sign=1739304069-Jqu5UAtfW3iH7pIWG2IGlUoifHmjYNHA-0-6b9613ccb7ef290e71bd45e79c7443e8)
如果一个行的文本中只有“\n”或“\r”字符,可以认为是空白的行,不应该进行缩进处理,于是返回False。
步骤6:对source2文本进行缩进处理,缩进填充字符为星号。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P46_80234.jpg?sign=1739304069-lkJxHAdoC1RFHvslK9X1ChGBCT9LbrNN-0-4dc2f9c235e6f7b0500aaa0a664b391a)
predicate参数引用刚刚定义的ignoreETLines函数,indent函数会自动调用它并把分解出来的每一行传给它。
处理结果如下:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P46_80235.jpg?sign=1739304069-MLWFE62fvN0ru70ISlFJL9dqFOwgj4aS-0-13af7d6e5c89a37de5e3970db3d9deda)
从运行结果可以看出,中间两个空白行没有做缩进处理。
案例23 嵌套使用格式化语法
导语
为了使字符串的格式化变得更灵活,可以嵌套使用格式化的表达语法。例如:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P47_80237.jpg?sign=1739304069-eFYhAXcthRNg70wZa8cFNO5n8CC6dXKe-0-e90590f1ac1e6d7b97530b71a3e19b00)
其中,str是要进行格式化处理的变量,width是另一个变量的值,可以指定格式化后字符串的宽度(长度),最后d表示显示为十进制数值。
字符串宽度引用另一个变量的值,可以动态控制字符串的格式化结果而无须重新编写格式化字符串。例如,假设width变量的值为55,那么,字符串格式化表达式就会变为:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P47_80238.jpg?sign=1739304069-SQzHDl7m2poKUgqSYE9XOEK4nppZtsQL-0-6d4cc3893da730cd7c33ca4b40b3d8dd)
要是width变量的值被修改为40,那么格式化表达式就会变为:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P47_80239.jpg?sign=1739304069-bF8NPYONLJ0tSm8rF4B1fDulHrtOTlXt-0-1df3328d7dfb8f1ffcef306d5f795a6d)
嵌套格式化语法同样可以用于str.format方法中。例如:
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P47_80240.jpg?sign=1739304069-blR7EreQup80RQwRJxvVjJWJF2QHLolK-0-79a88de80e8916ee9c178fd285785cab)
在调用format方法时,数值200替换字符串中序号为0的占位符,其中,外层大括号中嵌套了一层大括号,包括字段wd,width变量的值替换字符串中的wd字段。相当于
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P47_80241.jpg?sign=1739304069-ADYHOSNPC39rdkJMwnqdd9FIvfcMQ7TH-0-000acaedf878d01295bf759b12a68492)
操作流程
本案例需要用户进行两次输入:首先让用户输入一个整数值,然后再让用户输入格式化类型,即要以何种格式来显示该数值(如d表示十进制数值,b表示二进制数值)。最后,应用程序按照前面的两次输入向屏幕打印整数值的相应格式。
步骤1:调用input函数,获取用户输入的整数值。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P47_80242.jpg?sign=1739304069-RC2TRKNi9RXxcPPMqegrPxeVMPUmzXba-0-bb4b3c57271f4afdee3e03c841dbc1c6)
步骤2:判断所输入的内容是否有效,如果无效,给出错误提示。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P47_80243.jpg?sign=1739304069-0WyOK6GX1uLCcKXG6COL51LY9i7AmNUZ-0-d41998f65d690378f8661956b7e7a8f9)
步骤3:如果输入的整数值有效,就提示用户输入要处理的格式类型。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P48_80245.jpg?sign=1739304069-XJNxiLsju2rYFWub7QGvqDXBP9kxbW1X-0-1399f0a57bc59f4f9eb6dfcba3ca37ad)
步骤4:验证输入的类型是否有效,若有效,就对整数值格式化并打印到屏幕上。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P48_80246.jpg?sign=1739304069-pOvrWWPIzwFV1NPiomaJ7DTBHzQV35jW-0-e2fc5a58e566c84e3ae224db4521176a)
valtypes变量是一个元组案例,它包含b、x、o三个元素,如果用户输入的字符与这三个元素中的一个相同,则说明输入有效,否则是无效值。
由于b、x、o格式控制符不支持字符串类型的变量,因此在进行格式化之前需要写上这一行代码,将num变量的值转换为int类型。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P48_80247.jpg?sign=1739304069-AgOPOghlVUQwNOHtL75LfSHkaxMegbvg-0-639fb1bf3387a06efe734c75f999ee6c)
步骤5:运行案例,先输入一个十进制的整数值,例如160,然后输入“b”,就会打印出160对应的二进制值。
![](https://epubservercos.yuewen.com/1C5115/23721740309681106/epubprivate/OEBPS/Images/Figure-P48_80248.jpg?sign=1739304069-6RvHEMpyv5GxorwwDgC39Q3mqoYiXVT1-0-a27bd0a489be2abbe3fec7665db27bce)