专栏首页生信修炼手册python中的字符串格式化

python中的字符串格式化

字符串格式化,就是将字符常量和变量相结合,同时控制其显示格式。在python中,支持多种字符串格式化的语法

1. printf 风格

类似C语言中sprintf函数的代码风格,用%占位符来表示变量,基本用法示意如下

>>> 'name : %s, age: %d' % ('andy', 24)
'name : andy, age: 24'

%标识需要替换的变量位置,其中%s表示输出字符串,%d对应整数,后面为对应变量构成的元组。

百分号之后可以添加很多的修饰符号,按照顺序,列表如下

  1. mapping key,由圆括号包围的字符串,比如(some),此时,后面的变量用字典来表示,用法如下
  2. conversion flags, 转换标志,用来控制对应方式等
  3. minimum filed width, 字段宽度的最小值,如果待格式化的字符串长度小于该值,则进行填充
  4. precision, 精度,以小数点加数字的格式进行标记,比如保留小数点后4位.4
  5. conversion type, 需要转换的变量的类型,支持多种类型,常用的包括表示字符串的%s, 表示整数的%d, 表示浮点数的%f, 表示百分比号的%%

mapping key的用法如下

>>> 'name : %(name)s, age: %(age)d' % {'name' : 'andy', 'age' : 24}
'name : andy, age: 24'

conversion flag取值范围包括 0, -, ,,+ 等,常和minimum filed width连用来发挥作用,用法如下

# 5表示最小长度,默认空格填充,右对齐
>>> 'age: %5d' % (24)
'age:    24'
# 0表示用0填充,仅针数值
>>> 'age: %05d' % (24)
'age: 00024'
# 空格表示在输出字符串前添加一个空格
>>> 'age: % 05d' % (24)
'age:  0024'
# 负号将对齐方式变为左对齐
>>> 'age: %-5d' % (24)
'age: 24   '
# 加号表示在正数前添加正好,在负数前添加负号
>>> 'age: %+5d' % (24)
'age:   +24'
>>> 'age: %+5d' % -(24)
'age:   -24'

precision控制显示的精度,主要用于控制浮点数,用法如下

# 默认小数点后6位
>>> 'age: %f' % (3.1415)
'age: 3.141500'
# 通过精度修改为后两位
>>> 'age: %.2f' % (3.1415)
'age: 3.14'

2. format方法

format方法是字符串内置的方法,支持更加强大和灵活的格式化,用大括号{}作为占位符,基本用法如下

>>> "name:{}, age: {}".format('andy', 24)
'name:andy, age: 24'

默认情况下,根据每个大括号的索引,将后面元组中的值依次带入,上面的写法等价于

>>> "name:{0}, age: {1}".format('andy', 24)
'name:andy, age: 24'

除了位置索引,还可以用类似mapping key的方法,用法如下

>>> "name:{name}, age: {age}".format(name = 'andy', age = 24)
'name:andy, age: 24'
>>> "name:{name}, age: {age}".format(age = 24, name = 'andy')
'name:andy, age: 24'

该方法的好处就是元组中的元素可以乱序,除了简单替换,该方法也支持格式化,在大括号中添加各种修饰符来实现,修饰符放在冒号:后面,按照顺序,列表如下

  1. fill,指定填充用的字符,默认为空格
  2. align, 控制对齐方式,<表示左对齐,>表示右对齐,^表示居中,=表示在符号之后,数字之前进行填充,比如输出+00025这种形式
  3. sign, 只针对数值类型,在输出字段前添加负号,+表示添加正数前添加正号,负数前添加负号,-表示只有负数前添加负号,空格表示添加正数前添加空格,负数前添加负号
  4. width,字符串最小宽度,如果待格式化的字符串长度小于该值,则进行填充
  5. grouping_option, 只针对数值类型, 分组标识符,,表示
  6. precision,精度
  7. type, 类型很多,常用的整数对应d, 浮点数对应f, 字符串对应s, 百分号对应%

fill. align, width常连用来发挥作用,用法如下

# 字符串默认左对齐
>>> "name:{:6}".format('andy')
'name:andy  '
# 数值默认右对齐
>>> "age:{:6}".format(24)
'age:24'
# 指定填充字符,对齐方式
>>> "name:{:A<6}".format('andy')
'name:andyAA'

sign和grouping_option的用法如下

# sign
>>> "age:{:+}".format(24)
'age:+24'
>>> "age:{:+}".format(-24)
'age:-24'
>>> "age:{:-}".format(24)
'age:24'
>>> "age:{:-}".format(-24)
'age:-24'
>>> "age:{: }".format(-24)
'age:-24'
>>> "age:{: }".format(24)
'age:24'
# grouping_option
# 用逗号分隔千分位
>>> 'number:{:,}'.format(1000000)
'number:1,000,000'
# 用下换线分隔
>>> 'number:{:_}'.format(1000000)
'number:1_000_000'

除了冒号修饰符,还支持实现对参数进行转换,用感叹号!加修饰符表示,用法如下

# 相当于调用repr函数
>>> 'name:{!r}'.format('andy')
"name:'andy'"
# 相当于调用ascii函数
>>> 'name:{!a}'.format('andy')
"name:'andy'"
# 相当于调用str函数
>>> 'name:{!s}'.format('andy')
'name:andy'

感叹号修饰符仅支持上述三种转换,需要注意的是,感叹号和冒号修饰符不可连用。

3. f-string

在python3.6版本引入的新功能, 在字符串前面添加f前缀,同样用大括号作为占位符,与format方法不同的是,直接在大括号内书写需要格式化的变量,基本用法如下

>>> name = 'andy'
>>> age = 24
>>> f'name:{name}, age:{age}'
'name:andy, age:24'

在变量名之后,和format方法类似,也支持感叹号对应的转换操作,和冒号开头的格式说明符,而且语法完全相同,示意如下

>>> f'name:{name:A<6}'
'name:andyAA'

f-string把变量和对应的格式化操作同时绑定在了一个大括号中,而format方法则分隔成了前后两个部分。单就从格式化的效率来看,f-string的运行速度更快。 f-string更加强大的地方,可以直接将表达式写在大括号里,用法如下

# 调用简单函数
>>> f'name:{name.upper():a<6}'
'name:ANDYaa'
# 自定义函数
>>> f'name:{(lambda x: x.upper())(name):a<6}'
'name:ANDYaa'

这样,可以进一步减少代码量。如果你的python版本在3.6以上,建议使用f-string来格式化字符串。

本文分享自微信公众号 - 生信修炼手册(shengxinxiulian),作者:lzyg

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • miRNA命名规范

    miRNA的研究起步很早,最早发现的miRNA是线虫中的let-7 和lin-4,随着越来越多的miRNA被发现,为了方便学术交流,有科学家提出了一套统一的命名...

    生信修炼手册
  • Juicer:Hi-C数据处理分析的利器

    通过Hi-C数据可以分析TAD,chromatin loops等染色质空间结构的基本单元,加强我们对染色质三维结构的认知。面对海量的Hi-C数据,如何高效完成数...

    生信修炼手册
  • TWAS hub:使用TWAS识别疾病易感基因

    TWAS方法用于分析与疾病或者特定性状想关联的基因表达,TWAS hub利用该方法分析了数百个复杂性状,并将分析结果做成了数据库,方便检索和查看,数据库网址如下

    生信修炼手册
  • linux网络编程之共享内存简介和mmap 函数

    一、共享内存简介 共享内存区是最快的IPC形式,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。 ? 即每个...

    s1mba
  • JDK1.9-Set接口

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    cwl_java
  • CentOS配置iSCSI网络存储服务

    iSCSI:Internet 小型计算机系统接口 (iSCSI:Internet Small Computer System Interface)。

    yuanfan2012
  • 再论:关于 equals 和 hashCode

    上篇 关于 equals 和 hashCode 关于 equals 和 hashCode 的基本性质已经论述过了。

    shengjk1
  • 如何使用Hue上创建一个完整Oozie工作流

    在使用CDH集群中经常会有一些特定顺序的作业需要在集群中运行,对于需要多个作业顺序执行的情况下,如何能够方便的构建一个完整的工作流在CDH集群中执行,前面Fay...

    Fayson
  • 网络层绕过IDS/IPS的一些探索

    近两年兴起的大型网络攻防对抗比赛以实战的方式进行,这个举措非常好,以攻促防(“talk is cheap,show me the shell”),参赛大企业会更...

    腾讯安全应急响应中心
  • yii2 scenarios()如何理解?? [ 2.0 版本 ] 转

    最近在使用场景的时候碰到一些不解的问题,我简单模拟下: 我新建一张表info,有name和age2个字段 模型代码:

    双面人

扫码关注云+社区

领取腾讯云代金券