Python基础(十五):Python的3种字符串格式化,做个超全对比!
有时候,为了更方便、灵活的运用字符串。在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种字符串格式化,做个超全对比!的更多相关文章
- 【笔记】Python基础二:数据类型之集合,字符串格式化,函数
一,新类型:集合 集合出现之前 python_l = ['lcg','szw','zjw'] linux_l = ['lcg','szw','sb'] #循环方法求交集 python_and_linu ...
- python基础十五之递归函数
递归函数,在函数中调用自身函数,就会形成一个递归函数.例如: def recursion(n): n += 1 print(n) recursion(n) 由于递归函数的结构,在函数调用时,它会一直调 ...
- python 基础(十五) socket编程
SOCKET TCP协议: 有请求 有响应 称之为 tcp协议 是面向连接的协议 就是在收发数据之前 必须先要建立一个可靠的链接 三次握手 如:网站 UDP协议: 是一个非链接的协议 传输之前不需要键 ...
- 二十五. Python基础(25)--模块和包
二十五. Python基础(25)--模块和包 ● 知识框架 ● 模块的属性__name__ # my_module.py def fun1(): print("Hello& ...
- 十五. Python基础(15)--内置函数-1
十五. Python基础(15)--内置函数-1 1 ● eval(), exec(), compile() 执行字符串数据类型的python代码 检测#import os 'import' in c ...
- Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fabric模块
Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fab ...
- 孤荷凌寒自学python第二十五天初识python的time模块
孤荷凌寒自学python第二十五天python的time模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 通过对time模块添加引用,就可以使用python的time模块来进行相关的时间操 ...
- 孤荷凌寒自学python第十五天python循环控制语句
孤荷凌寒自学python第十五天python循环控制语句 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) python中只有两种循环控制语句 一.while循环 while 条件判断式 1: ...
- Python进阶(十五)----面向对象之~继承(单继承,多继承MRO算法)
Python进阶(十五)----面向对象之~继承 一丶面向对象的三大特性:封装,继承,多态 二丶什么是继承 # 什么是继承 # b 继承 a ,b是a的子类 派生类 , a是b的超类 基类 父类 # ...
随机推荐
- 下一代币王花落谁家?是否是BGV更胜一筹呢?
BGV作为Baccarat的平台币横空出世,通过BGV来激励拥有NGK的用户.在共识算法上,Baccarat 在共识层采用了混合机制 DPOSS共识机制,这是维护 Baccarat 生态体系良性发展的 ...
- 开发Microsoft Teams选项卡应用安全注意事项
我们都知道,为了方便广大的开发人员快速开发Microsoft Teams选项卡应用,微软提供了一个JS SDK,你可以通过这里 https://docs.microsoft.com/en-us/jav ...
- 基本的DOS命令
基本的DOS命令 打开CMD的方法 菜单+系统+命令提示符 WIN+R后输入CMD 桌面或文件夹任意位置按住SHIFT后鼠标右键 常见的DOS命令 #盘符切换 直接输入要切换的盘符名称 如输入&quo ...
- Unity安卓apk打包过程
前言:对于Unity开发小白来说,Android打包无疑是个头痛的问题,所以我总结了 Unity安卓APK的打包过程 第一步:下载对应版本的Android Platform 第二步:安装JDK并配置J ...
- django学习-12.访问不同url/接口地址实现对指定数据的增删改查功能
1.前言 通过前面博客[django学习-10.django连接mysql数据库和创建数据表]里的操作,我们已经成功在数据库[hongjingsheng_project]里创建了一张数据表[hello ...
- pytorch中修改后的模型如何加载预训练模型
问题描述 简单来说,比如你要加载一个vgg16模型,但是你自己需要的网络结构并不是原本的vgg16网络,可能你删掉某些层,可能你改掉某些层,这时你去加载预训练模型,就会报错,错误原因就是你的模型和原本 ...
- 微信小程序:日期组件picker的使用
1.页面代码 <view class="right"> <picker mode="date" value="{{material. ...
- SpringCloud Stream
1.介绍 官网:https://www.springcloud.cc/spring-cloud-dalston.html#_spring_cloud_stream 1.1定义 是一个构建消息驱动微服务 ...
- Linux-基础命令学习
Linux终端 Linux存在两种终端模拟器,一种类MAC的Gnome和一种类Win的KDE 远程连接工具: xshell,putty,crt(网工) 如果在Linux下输入tty 1 wang@DE ...
- vue-axios插件、django-cors插件、及vue如何使用第三方前端样式库:element/jQuery/bootstrap
目录 一.vue的ajax插件:axios 1.安装axios 2.axios参数 二.CORS跨域问题(同源策略) 1.Django解决CORS跨域问题方法 三.前端请求携带参数及Django后台如 ...