有时候,为了更方便、灵活的运用字符串。在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符号一起使用;

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

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

② %格式化

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

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

③ format()格式化

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

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

④ f-string格式化

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

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

填充功能对比

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

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

① %格式化

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

② format()格式化

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

③ f-string格式化

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

对齐功能对比

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

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

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

# 左填充
a = '%10s' % ('梁同学')
print(a, len(a))
# 梁同学 10 # 右填充
b = '%-10s' % ('梁同学')
print(b, len(b))
# 梁同学 10

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

a = '{:>10}'.format('梁同学')
print(a, len(a))
# 梁同学 10 # 右填充
b = '{:<10}'.format('梁同学')
print(b, len(b))
# 梁同学 10 # 居中填充
c = '{:^10}'.format('梁同学')
print(c, len(c))
# 梁同学 10

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

name = "梁同学"

a = f"{name:>10}"
print(a, len(a))
# 梁同学 10 b = f"{name:<10}"
print(b, len(b))
# 梁同学 10 c = f"{name:^10}"
print(c, len(c))
# 梁同学 10

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

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

① %格式化

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

② format()格式化

# 左填充
a = '{:_>10}'.format('梁同学')
print(a, len(a))
# _______梁同学 10 # 右填充
b = '{:_<10}'.format('梁同学')
print(b, len(b))
# 梁同学_______ 10 # 居中填充
c = '{:_^10}'.format('梁同学')
print(c, len(c))
# ___梁同学____ 10

③ f-string格式化

name = "梁同学"
a = f"{name:_>10}"
print(a, len(a))
# _______梁同学 10 b = f"{name:_<10}"
print(b, len(b))
# 梁同学_______ 10 c = f"{name:_^10}"
print(c, len(c))
# ___梁同学____ 10

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

① 你有必要了解的知识

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

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

② %格式化

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

③ format()格式化

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

④ f-string格式化

  • 完成整数的填充:
num1 = 3000
num2 = "3000" # 不指定d符号,既可以完成字符串的填充,又可以完成数字的填充
a = f'{num1}'
print(a)
# 3000 a1 = f'{num2}'
print(a1)
# 3000 # 当指定了d符号后,只可以填充数字,不能填充字符串,否则会报错
# 使用符号d填充整数,是推荐写法
b = f'{num1:d}'
print(b)
# 3000 b1 = f'{num2:d}'
print(b1)
# ValueError: Unknown format code 'd' for object of type 'str'
  • 完成浮点数的填充:
num = 3.14159268
a = f'{num:.2f}'
print(a)
# 3.14 b = f'{num:.3f}'
print(b)
# 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. NGK是公链吗?NGK为何会这么火?

    NGK号称区块链3.0的经典代表之作,公链底层技术开源发布,支撑百万级应用场景,集合了其他公链的优点,不仅拥有超高的TPS,军业级DPOSS共识机制,还有极高的网络确认速度和转账速度.更重要的是无需矿 ...

  2. AtCoder Beginner Contest 192 F - Potion

    题目链接 点我跳转 题目大意 给定 \(N\) 个物品和一个 \(X\) ,第 \(i\) 个物品的重量为 \(ai\),你可以从中选择任意个物品(不能不选) 假定选择了 \(S\) 个物品,物品的总 ...

  3. Linux文件/proc/net/tcp分析

    本文转载自Linux文件/proc/net/tcp分析 导语 /proc/net/tcp文件提供了tcp的连接信息,是由net/ipv4/tcp_ipv4.c中的tcp4_seq_show()实现信息 ...

  4. Why GraphQL? 6个问题

    Why GraphQL? 6个问题 GraphQL, 是一个API的标准: specification. 对于每个新技术, 要搞清楚的6个问题: 1.这个技术出现的背景, 初衷, 要达到什么样的目标或 ...

  5. Java线程池 ExecutorService了解一下

    本篇主要涉及到的是java.util.concurrent包中的ExecutorService.ExecutorService就是Java中对线程池的实现. 一.ExecutorService介绍 E ...

  6. Static Proxy

    0.静态代理 静态代理的实现比较简单,代理类通过实现与目标对象相同的接口,并在类中维护代理对象.通过构造器塞入目标对象,赋值给代理对象,进而执行代理对象实现的接口方法,并实现前拦截,后拦截等所需的业务 ...

  7. Gitlab与Sonarqube整合-代码提交自动检测

    目录 概述 准备工作 postgres sonarqube gitlab gitlab-runner Gitlab-runner容器 注册Gitlab-runner Sonarqube gitlab ...

  8. java帝国的诞生

    Java : 一个帝国的诞生 C语言帝国的统治 现在是公元1995年, C语言帝国已经统治了我们20多年, 实在是太久了. 1972年, 随着C语言的诞生和Unix的问世, 帝国迅速建立统治, 从北美 ...

  9. Linear Algebra From Data

    Linear Algebra Learning From Data 1.1 Multiplication Ax Using Columns of A 有关于矩阵乘法的理解深入 矩阵乘法理解为左侧有是一 ...

  10. 007-变量的作用域和LED点阵

    变量 一.局部变量和全局变量 局部变量:函数内申明的变量,只在函数内有效. 全局变量:函数外部申明的变量.一个源程序文件有一个或者多个函数,全局变量对他们都起作用. 备注:全局变量有副作用,降低了函数 ...