社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

python中的字符串格式化

生信修炼手册 • 5 年前 • 585 次点击  

欢迎关注”生信修炼手册”!

字符串格式化,就是将字符常量和变量相结合,同时控制其显示格式。在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来格式化字符串。


·end·

—如果喜欢,快分享给你的朋友们吧—



原创不易,欢迎收藏,点赞,转发!生信知识浩瀚如海,在生信学习的道路上,让我们一起并肩作战!
本公众号深耕耘生信领域多年,具有丰富的数据分析经验,致力于提供真正有价值的数据分析服务,擅长个性化分析,欢迎有需要的老师和同学前来咨询。
  更多精彩





  写在最后



转发本文至朋友圈,后台私信截图即可加入生信交流群,和小伙伴一起学习交流。


扫描下方二维码,关注我们,解锁更多精彩内容!



一个只分享干货的

生信公众号



Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/62595
 
585 次点击