有时候,为了更方便、灵活的运用字符串。在Python中,正好有3种方式,支持格式化字符串的输出 。

3种字符串格式化工具的简单介绍

python2.5版本之前,我们使用的是老式字符串格式化输出%s

python3.0版本开始起(python2.6同期发布),Python中同时支持两个版本的格式化,多出来的一个新版本就是利用format()函数,进行格式化输出。

但是python3.6版本后,又引入了一种新的字符串格式化方式f-string。从%s格式化到format格式化再到f-string格式化,格式化的方式越来越直观,f-string的效率也较前两个高一些,使用起来也比前两个更简单一些。

3种字符串格式化工具的应用对比

基本用法

这里首先先介绍这3个工具的基本用法,基本格式如下。

  • %格式化:占位符%,搭配%符号一起使用;
  • format()格式化:占位符{},搭配format()函数一起使用;
  • f-string格式化:占位符{},搭配f符号一起使用;

① 对比使用,观察各自的特点

  1. a = "%s张飞、%s关羽、%s刘备、%s赵云" % (1, 2, 3, 4)
  2. print(a)
  3. # 1张飞、2关羽、3刘备、4赵云
  4. b = "{}张飞、{}关羽、{}刘备、{}赵云".format(1, 2, 3, 4)
  5. print(b)
  6. # 1张飞、2关羽、3刘备、4赵云
  7. c = f"{1}张飞、{2}关羽、{3}刘备、{4}赵云"
  8. print(c)
  9. # 1张飞、2关羽、3刘备、4赵云

② %格式化

此种方式只支持固定形式的格式化填充,给的顺序和填充顺序完全一致。

  1. a = "四大天王:%s、%s、%s、%s" % ("刘德华","郭富城","张学友","黎明")
  2. print(a)
  3. # 四大天王:刘德华、郭富城、张学友、黎明

③ format()格式化

此种方式不仅支持固定形式的格式化填充,还支持位置格式化填充,即共有三种形式。

  • 第一种方式:固定形式的格式化填充,给的顺序和填充顺序完全一致。
  1. b1 = "四大天王:{}、{}、{}、{}".format("刘德华","郭富城","张学友","黎明")
  2. print(b1)
  3. # 四大天王:刘德华、郭富城、张学友、黎明
  • 第二种方式:大括号{ }中写的是format()传入值所对应的下标。
  1. b2 = "四大天王:{2}、{0}、{3}、{1}".format("刘德华","郭富城","张学友","黎明")
  2. print(b2)
  3. # 四大天王:张学友、刘德华、黎明、郭富城
  • 第三种方式:大括号{ }中的变量,和format()传入值是一一对应的。
  1. x1 = "刘德华"
  2. x2 = "郭富城"
  3. x3 = "张学友"
  4. x4 = "黎明"
  5. b3 = "四大天王:{p}、{q}、{r}、{s}".format(p=x4,q=x2,r=x1,s=x3)
  6. print(b3)
  7. # 四大天王:黎明、郭富城、刘德华、张学友

④ f-string格式化

此种方式的填充,用起来更加随意,直接在{}中输入变量即可,极其方便,我们用一个简单的案例看看。

  1. # 直接在{}中输入变量即可,位置随意放
  2. x1 = "刘德华"
  3. x2 = "郭富城"
  4. x3 = "张学友"
  5. x4 = "黎明"
  6. c = f"四大天王:{x1}、{x3}、{x2}、{x4}"
  7. print(c)
  8. # 四大天王:刘德华、张学友、郭富城、黎明

填充功能对比

首先我们要知道填充的概念是什么,只有知道了它的概念,才能够灵活运用。

  • 概念:当指定了字符串最终的长度,但是现有的字符串没有那么长,那么我们就用某种字符(填充字符)来填满至这个长度,这就是“填充”

① %格式化

  • 格式:"%10s" % ("字符串"),使用前仔细观察书写格式
  • 含义:上述10代表字符串的填充长度。如果字符串的长度,大于填充长度,填充长度无效;如果字符串的长度,小于填充长度,则会将字符串长度填充至指定的填充长度;
  • 注意:此种填充,默认是在字符串左侧填充;
  1. a = "%s" % ("梁同学")
  2. print(a,len(a))
  3. # 梁同学 3
  4. b = "%10s" % ("梁同学")
  5. print(b,len(b))
  6. # 梁同学 10
  7. c = "%10s" % ("梁同学,我早上吃了一碗热干面")
  8. print(c,len(c))
  9. # 梁同学,我早上吃了一碗热干面 14

② format()格式化

  • 格式:"{:10}".format("字符串"),使用前仔细观察书写格式
  • 含义:上述10代表字符串的填充长度。如果字符串的长度,大于填充长度,填充长度无效;如果字符串的长度,小于填充长度,则会将字符串长度填充至指定的填充长度;
  • 注意:此种填充,默认是在字符串右侧填充;
  1. a = "{:10}".format("梁同学")
  2. print(a, len(a))
  3. # 梁同学 10
  4. b = "{:10}".format("梁同学,我早上吃了一碗热干面")
  5. print(b, len(b))
  6. # 梁同学,我早上吃了一碗热干面 14

③ f-string格式化

  • 格式:f"{name1:10}",使用前仔细观察书写格式
  • 含义:上述10代表字符串的填充长度,name1代表某个字符串变量。如果字符串的长度,大于填充长度,填充长度无效;如果字符串的长度,小于填充长度,则会将字符串长度填充至指定的填充长度;
  • 注意:此种填充,默认是在字符串右侧填充;
  1. name1 = "梁同学"
  2. name2 = "梁同学,我早上吃了一碗热干面"
  3. a = f"{name1:10}"
  4. print(a, len(a))
  5. # 梁同学 10
  6. b = f"{name2:10}"
  7. print(b, len(b))
  8. 梁同学,我早上吃了一碗热干面 14

对齐功能对比

首先我们要知道填充的概念是什么,只有知道了它的概念,才能够灵活运用。

  • 概念:"对齐"要与"填充"一起使用,才会显得有意义。当我们进行填充的时候,我们可以选择只在字符串左侧填充,也可以选择只在字符串右侧填充,还可以选择在字符串两侧填充(字符串居中显示的填充方式);

① %s:实现对齐功能,只有左对齐和右对齐;

  1. # 左填充
  2. a = '%10s' % ('梁同学')
  3. print(a, len(a))
  4. # 梁同学 10
  5. # 右填充
  6. b = '%-10s' % ('梁同学')
  7. print(b, len(b))
  8. # 梁同学 10

② format():实现对齐功能,不仅有左对齐和右对齐,还有居中对齐;

  1. a = '{:>10}'.format('梁同学')
  2. print(a, len(a))
  3. # 梁同学 10
  4. # 右填充
  5. b = '{:<10}'.format('梁同学')
  6. print(b, len(b))
  7. # 梁同学 10
  8. # 居中填充
  9. c = '{:^10}'.format('梁同学')
  10. print(c, len(c))
  11. # 梁同学 10

③ f-string:实现对齐功能,不仅有左对齐和右对齐,还有居中对齐;

  1. name = "梁同学"
  2. a = f"{name:>10}"
  3. print(a, len(a))
  4. # 梁同学 10
  5. b = f"{name:<10}"
  6. print(b, len(b))
  7. # 梁同学 10
  8. c = f"{name:^10}"
  9. print(c, len(c))
  10. # 梁同学 10

使用“任意符号”完成填充功能

这个知识点必须在讲完填充和对齐后,才能为大家演示。其实没有为什么,就是语法是这样的,我们就必须这样做。

① %格式化

旧版语法的%格式化,使用"特定符号"填充,很麻烦,不直接,你也不用去管。这里主要看新版语法中format()格式化和f-string格式化,进行"特定符号"填充。

② format()格式化

  1. # 左填充
  2. a = '{:_>10}'.format('梁同学')
  3. print(a, len(a))
  4. # _______梁同学 10
  5. # 右填充
  6. b = '{:_<10}'.format('梁同学')
  7. print(b, len(b))
  8. # 梁同学_______ 10
  9. # 居中填充
  10. c = '{:_^10}'.format('梁同学')
  11. print(c, len(c))
  12. # ___梁同学____ 10

③ f-string格式化

  1. name = "梁同学"
  2. a = f"{name:_>10}"
  3. print(a, len(a))
  4. # _______梁同学 10
  5. b = f"{name:_<10}"
  6. print(b, len(b))
  7. # 梁同学_______ 10
  8. c = f"{name:_^10}"
  9. print(c, len(c))
  10. # ___梁同学____ 10

与“数字”相关的格式化填充技巧

① 你有必要了解的知识

经过前面的学习和叙述,我们已经知道这3种方法,都是完成字符串格式化的操作的,但是为何它们又可以填充数字呢?

原因:Python自动帮我们做了一次隐式转换,但是这种隐式转换是需要付出代价的,它会消耗额外的性能,牺牲速度。因此我们有特定的语法去解决这个问题。

② %格式化

  • %s表示填充字符串;%d表示填充整数;%f表示填充小数;
  • 完成整数的填充:
  1. # 仅仅使用%s,既可以完成字符串的填充,又可以完成数字的填充
  2. a = '%s' % (3000)
  3. print(a)
  4. # 3000
  5. a1 = '%s' % ("3000")
  6. print(a1)
  7. # 3000
  8. # 当使用了%d后,只可以填充数字,不能填充字符串,否则会报错# 使用%d填充整数,是推荐写法
  9. b = '%d' % (3000)
  10. print(b)
  11. # 3000
  12. b1 = '%d' % ("3000")
  13. print(b1)
  14. # TypeError: %d format: a number is required, not str
  • 完成浮点数的填充:
  1. a = '%.2f' % (3.1415926)
  2. print(a)
  3. # 3.14
  4. b = '%.3f' % (3.1415926)
  5. print(b)
  6. # 3.142

③ format()格式化

  • 完成整数的填充:
  1. # 不指定d符号,既可以完成字符串的填充,又可以完成数字的填充
  2. a = '{:$>5}'.format(3000)
  3. print(a)
  4. # $3000
  5. a1 = '{:$>5}'.format("3000")
  6. print(a1)
  7. # $3000
  8. # 当指定了d符号后,只可以填充数字,不能填充字符串,否则会报错
  9. # 使用符号d填充整数,是推荐写法
  10. b = '{:¥>5d}'.format(3000)
  11. print(b)
  12. # ¥3000
  13. b1 = '{:¥>5d}'.format("3000")
  14. print(b1)
  15. # ValueError: Unknown format code 'd' for object of type 'str'
  • 完成浮点数的填充:
  1. a = '{:.2f}'.format(3.14159268)
  2. print(a)
  3. # 3.14
  4. b = '{:.3f}'.format(3.14159268)
  5. print(b)
  6. # 3.142

④ f-string格式化

  • 完成整数的填充:
  1. num1 = 3000
  2. num2 = "3000"
  3. # 不指定d符号,既可以完成字符串的填充,又可以完成数字的填充
  4. a = f'{num1}'
  5. print(a)
  6. # 3000
  7. a1 = f'{num2}'
  8. print(a1)
  9. # 3000
  10. # 当指定了d符号后,只可以填充数字,不能填充字符串,否则会报错
  11. # 使用符号d填充整数,是推荐写法
  12. b = f'{num1:d}'
  13. print(b)
  14. # 3000
  15. b1 = f'{num2:d}'
  16. print(b1)
  17. # ValueError: Unknown format code 'd' for object of type 'str'
  • 完成浮点数的填充:
  1. num = 3.14159268
  2. a = f'{num:.2f}'
  3. print(a)
  4. # 3.14
  5. b = f'{num:.3f}'
  6. print(b)
  7. # 3.142

Python基础(十五):Python的3种字符串格式化,做个超全对比!的更多相关文章

  1. 【笔记】Python基础二:数据类型之集合,字符串格式化,函数

    一,新类型:集合 集合出现之前 python_l = ['lcg','szw','zjw'] linux_l = ['lcg','szw','sb'] #循环方法求交集 python_and_linu ...

  2. python基础十五之递归函数

    递归函数,在函数中调用自身函数,就会形成一个递归函数.例如: def recursion(n): n += 1 print(n) recursion(n) 由于递归函数的结构,在函数调用时,它会一直调 ...

  3. python 基础(十五) socket编程

    SOCKET TCP协议: 有请求 有响应 称之为 tcp协议 是面向连接的协议 就是在收发数据之前 必须先要建立一个可靠的链接 三次握手 如:网站 UDP协议: 是一个非链接的协议 传输之前不需要键 ...

  4. 二十五. Python基础(25)--模块和包

    二十五. Python基础(25)--模块和包 ● 知识框架   ● 模块的属性__name__ # my_module.py   def fun1():     print("Hello& ...

  5. 十五. Python基础(15)--内置函数-1

    十五. Python基础(15)--内置函数-1 1 ● eval(), exec(), compile() 执行字符串数据类型的python代码 检测#import os 'import' in c ...

  6. Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fabric模块

    Python第十五天  datetime模块 time模块   thread模块  threading模块  Queue队列模块  multiprocessing模块  paramiko模块  fab ...

  7. 孤荷凌寒自学python第二十五天初识python的time模块

    孤荷凌寒自学python第二十五天python的time模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 通过对time模块添加引用,就可以使用python的time模块来进行相关的时间操 ...

  8. 孤荷凌寒自学python第十五天python循环控制语句

    孤荷凌寒自学python第十五天python循环控制语句 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) python中只有两种循环控制语句 一.while循环 while 条件判断式 1: ...

  9. Python进阶(十五)----面向对象之~继承(单继承,多继承MRO算法)

    Python进阶(十五)----面向对象之~继承 一丶面向对象的三大特性:封装,继承,多态 二丶什么是继承 # 什么是继承 # b 继承 a ,b是a的子类 派生类 , a是b的超类 基类 父类 # ...

随机推荐

  1. linux move file / folder bash command

    linux move file / folder bash command mv $ which mv $ man mv # mv [-f] source target/ target folder ...

  2. HTML marquee

    HTML marquee 跑马灯 https://developer.mozilla.org/en-US/docs/Web/HTML/Element/marquee https://developer ...

  3. how to overwrite css !important style

    how to overwrite css !important style css !important bug how to override css !important style https: ...

  4. NGK Global首尔站:内存是未来获取数字财富的新模式

    近日,NGK路演在NGK韩国社区的积极举办下顺利落下帷幕.此次路演在首尔举行,在活动当天,NGK的核心团队成员.行业专家.投资银行精英.生态产业代表和数百名NGK韩国社区粉丝一起参加NGK Globa ...

  5. Git 学习相关笔记

    Git Bash 相关命令学 基础概念 参考: https://www.cnblogs.com/gaoht/p/9087070.html https://www.runoob.com/git/git- ...

  6. Vue学习笔记-vue-element-admin 按装报错再按装

    一  使用环境 开发系统: windows 后端IDE: PyCharm 前端IDE: VSCode 数据库: msyql,navicat 编程语言: python3.7  (Windows x86- ...

  7. 🤔 移动端 JS 引擎哪家强?美国硅谷找......

    如果你喜欢我写的文章,可以把我的公众号设为星标 ,这样每次有更新就可以及时推送给你啦 在一般的移动端开发场景中,每次更新应用功能都是通过 Native 语言开发并通过应用市场版本分发来实现的.但是市场 ...

  8. Python中的sklearn--KFold与StratifiedKFold

    KFold划分数据集的原理:根据n_split直接进行划分 StratifiedKFold划分数据集的原理:划分后的训练集和验证集中类别分布尽量和原数据集一样 #导入相关packages from s ...

  9. Docker 搭建nexus私服

    一.概述 有三种专门的Maven仓库管理软件可以用来帮助大家建立私服:Apache基金会的Archiva.JFrog的Artifactory和Sonatype的Nexus.而Nexus是当前最流行的M ...

  10. PAT-1154(Vertex Coloring )+map使用+vector建图+set的使用

    Vertex Coloring PAT-1154 #include<iostream> #include<cstring> #include<string> #in ...