查看原文
其他

格式化字符串方法的比较

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:王碧琪

文字编辑:宁刘莹

技术总编:张   邯

重磅!!!爬虫俱乐部将于2019年10月2日至10月5日在湖北武汉举行Python编程技术培训,本次培训采用理论与案例相结合的方式,旨在帮助零基础学员轻松入门Python,由浅入深学习和掌握Python编程技术,尤其是爬虫技术和文本分析技术。该培训目前在火热招生中,点击《爬虫俱乐部2019十一Python编程技术培训报名啦!》,了解培训详细信息,抓紧时间报名吧!另外,2019年8月22日至28日在湖北武汉举行的Stata编程技术培训,高级班招生已经结束,初级班仅剩几个名额感兴趣的同学可打开爬虫俱乐部往期推文——《爬虫俱乐部2019暑假stata编程训练营报名啦!报名,不要错过机会哦! 

我们在使用Python处理字符串时,为了达到美观等特定目的,通常要对字符串的格式进行特定的设置。Python支持多种设置字符串的格式的方法,如“%-formatting”,“str.format()”,在3.6版本中,Python引入了一种新的设置字符串格式的方法:f-string。相比之前的方法,f-string更加简洁、好用。关于str.format()的使用方法可以参考我们之前的推文《Python常见内置函数用法(二)》,今天主要介绍如何使用f-string的方法来设置字符串的格式。

1. 定义

f-string全称Formatted string literals,是以“f”或者“F”开头的字符串格式定义方式,目的是简便格式化字符串的操作方式。f-string包含可替换字段,可替换字段以“{ }”标示,将要替换的变量名放在其中,而在“{ }”以外的部分按照其字面值处理。值得注意的是,f-string本质上不是一个字符串常量,而是在运行时对“{ }”引用的部分求值的表达式。f-string的结构如下:

f ' <text> { <expression> <optional !s, !r, or !a> <optional : format specifier> } <text>'

1.1 简单例子

In [1]: name = '喜小乐' ...: age = 8 ...: school = '人民路小学'   ...: f'我叫{name},今年{age}岁,明年{age+1}岁,在{school}上学'Out[1]: '我叫喜小乐,今年8岁,明年9岁,在人民路小学上学'

1.2 加入转换字段

转化字段是用来对字符串进行格式上的转换的符号,包括'!s','!r','!a'。转换符 '!s' 即对结果调用 str(),str() 函数将对象转化为适于人阅读的形式;'!r' 为调用 repr(),repr() 函数将对象转化为供解释器读取的形式;'!a' 为调用 ascii(),关于这三个字符串函数的具体含义,详见之前的推文《字符串的小帮手之ascii()、str()和repr()函数》

不加入转换字段时,f-string默认为'!s'。指定了转换字段之后,表达式的求值结果会先转换再进行格式化。

In [2]: f'我叫{name!s},今年{age!r}岁,在{school!a}上学' #对name调用str(),age调用repr(),school调用ascii()。Out[2]: "我叫喜小乐,今年8岁,在'\\u4eba\\u6c11\\u8def\\u5c0f\\u5b66'上学"

对比输出结果可知,在school变量后面加上'!a',会在求值之前先调用ascii()函数对“人民路小学”这个字符串进行转化,然后放回待格式化的字符串里。

1.3 对比%-formatting和str.format

%-formatting是Python较早的版本中使用的设置字符串格式的方法。使用%-formatting时,首先在字符串中需要使用“%”占位,“()”填充引用字段,再加字母指定格式;然后以“%”开头,“{}”列出引用字段的内容,加以替换。以下列出了常用的“%”占位符的格式。

我们使用字典来实现第一个简单例子。

In [5]: "我叫%(name)s,今年%(age)d岁,明年%(ageplus)d岁,在%(school)s上学" % {'name':'喜小乐','age':8,'ageplus':8+1,'school':'人民路小学'}Out[5]: '我叫喜小乐,今年8岁,明年9岁,在人民路小学上学'

相比f-string,首先,%-formatting和str.format无法对小括号内所引用的字段进行运算,即无法算出ageplus;其次,%-formatting和str.format需要在后面指出格式,这使得代码相对冗长、不易读,无法实现f-string的代码精简程度。


2. 自定义格式

f-string可以指定某种确定的字符串显示格式,结构为{content:format},句法中content即替换并填入字符串的内容,format是格式描述符,我们在推文《Python常见内置函数用法(二)》中进行过相关介绍,“:”后面依次说明用什么补齐(省略情况下为空格)、对齐方式(“^”表示居中对齐,“<”表示居左对齐,“>”表示居右对齐)、宽度、文本的显示格式。当然也可以不必指定{:format},如上述的简单例子只注明了{content}。

2.1 宽度与对齐

print(f'{"一年1班成绩表":*^30s}') # “一年1班成绩表”设置为用*补齐,居中对齐,宽度为30,s表示字符串形式。print(f'{"鸡小萌":<10s} {9:>10d} {89.734:>10.2f}') # “鸡小萌”设置为左对齐,宽度为10,字符串形式。“9”设置为右对齐,宽度为10,十进制整数形式,“89.734”设置为右对齐,宽度为10,小数点后保留两位小数,浮点数形式。print(f'{"石敢当":<10s} {7:>10d} {76.555:>10.2f}') print(f'{"喜小乐":<10s} {8:>10d} {92.433:>10.2f}')

输出结果为:

2.2 数字格式化输出

f-string句法,“{ }”内可以进行运算,例如插入列表中的某一个元素。我们给出三个列表存储三只股票的信息,列表内的元素依次代表股票的代码、价格、收益率、市值,为了实现其格式的简洁显示,我们使用f-string进行设置。

list1 = [2,31.48,0.43,1200000000]list2 = [1872,20.1,-0.87,234840000]list3 = [600606,7.83,-0.46,113000000]

先输出表头,即依次输出stkcd,price,rit,value,都是居中对齐,宽度分别为6、8、8、10。

然后输出内容,列表的每一个元素分别设置,第0个元素用0补齐、居右对齐、宽度为6,第1个元素居中对齐、宽度为8、小数点后保留2位有效数字、浮点数格式,第2个元素居中对齐、显示正负号、小数点后保留一位、显示为百分数形式,第3个元素居中对齐、宽度为15、小数点后保留2位有效数字、显示格式为科学计数法。

print(f'{"stkcd":^6} {"price":^8} {"rit":^8} {"value":^10}') print(f'{list1[0]:0>6} {list1[1]:^8.2f} {list1[2]:^+.1%} {list1[3]:^15.2e}') print(f'{list2[0]:0>6} {list2[1]:^8.2f} {list2[2]:^+.1%} {list2[3]:^15.2e}')print(f'{list3[0]:0>6} {list3[1]:^8.2f} {list3[2]:^+.1%} {list3[3]:^15.2e}')

输出结果为:


3. 多行f-string

如果要输出的字符串很长,我们可以分为多行输入,只需要在每行后面加上一个“\”表示换行。

In [6]: name = '喜小乐' ...: age = 8 ...: school = '人民路小学' ...: f'我叫{name},' \ ...: f'今年{age}岁, '\ ...: f'在{school}上学'Out[6]: '我叫喜小乐,今年8岁, 在人民路小学上学'

也可以只写一个f符号,输出结果与上面的相同,如下:

In [7]: f'我叫{name},\ ...: 今年{age}岁, \ ...: 在{school}上学'Out[7]: '我叫喜小乐,今年8岁, 在人民路小学上学'


4. 小结

f-string作为定义字符串格式的新方法,优于之前的定义字符串格式的方法。它拥有许多优点:代码简单易读,不易出错,不会冗长拖沓;“{ }”内可以运算任何有效的Python表达式;另外因为f-string是运行时渲染的表达式,而不是常量值,所以比%-formatting和str.format()的速度都快。看到这里,你还在使用旧方法定义字符串的格式吗?不妨尝试一下f-string吧!


对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫!

往期推文推荐

        字符串的小帮手之ascii()、str()和repr()函数

 朝花夕拾—— 如何输出内存中的矩阵与绘图

 朝花夕拾——putdocx批量输出变量观测值

        爬虫俱乐部2019十一Python编程技术培训报名啦!
        Stata16新功能——定义图形元素的绝对大小
        添加docx内容哪家强,Stata16新命令帮你忙
       将数值型计算“一网打尽”——(1)
       将数值型计算“一网打尽”——(2)
        Stata16新功能之“框架”——读入多个数据集(1)
 Stata16新功能——同一个文档,不一样的布局
 手持Python,斗图不输!

 万般进制千机变,Python一计乾坤定——利用Python来进行进制转换

        朝花夕拾——cnstock与cntrade强强联合


关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。


此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:statatraining@163.com

投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存