Python之格式化字符串(格式化字符串python)
off999 2024-09-18 22:35 35 浏览 0 评论
格式化字符串
还记得前面学过的,计算税后薪资 的程序的例子吗?
让用户输入薪资,乘以75% 得到税后薪资,打印到屏幕上。
代码如下
salary = input('请输入薪资:')
# 计算出税后薪资
aftertax = int(salary)*75/100
# 再转化为字符串,方便下面的字符串拼接
aftertaxStr = str(aftertax)
print('税后薪资是:' + aftertaxStr)
如果我们要显示的不仅是税后薪资,还有税前薪资,缴税额。像下面这样
税前薪资是 10000元, 缴税:2500元, 税后薪资是:7500元
代码又该怎么写呢?
我想肯定难不倒聪明的你。
对了, 加号可以连接多个字符串,可以这样
salary = input('请输入薪资:')
# 计算出缴税额,存入变量tax
tax = int(salary) *25/100
# 转化为字符串,方便下面的字符串拼接
taxStr = str(tax)
# 计算出税后工资,存入变量aftertax
aftertax = int(salary) *75/100
# 转化为字符串,方便下面的字符串拼接
aftertaxStr = str(aftertax)
print('税前薪资是:' + salary + '元, 缴税:' + taxStr + '元, 税后薪资是:' + aftertaxStr + '元')
运行一下,是不是确实实现了我们的需求。
但是这里面有问题吗?
对了最后一句代码,写的是不是有点。。。。。烧脑?
字符串的多次拼接比较麻烦,一不小心就可能 漏掉了 一个加号或者引号。
如果我们能够这样写
税前薪资是 x 元, 缴税:y 元, 税后薪资是:z 元
然后,直接将我们计算好的 税前薪资, 缴税额,税后薪资 分别作为 x, y, z 填入进去。
这样就不需要麻烦的字符串拼接了。Python 支持这样的操作,这样的操作称之为字符串的格式化。
可以点击文章末尾【了解更多】,或者百度搜索白月黑羽教Python,一起来学Python吧
python3 中字符串格式化有如下几种方法
printf 风格
这种方式 和 传统的C语言printf函数使用一样的格式化语法。
比如上面的例子里面,我们使用这种方法可以这样格式化字符串
salary = input('请输入薪资:')
# 计算出缴税额,存入变量tax
tax = int(salary) *25/100
# 计算出税后工资,存入变量aftertax
aftertax = int(salary) *75/100
print('税前薪资是:%s 元, 缴税:%s 元, 税后薪资是:%s 元' %
(salary,tax,aftertax))
大家运行一下看看,可以发现也能正确的输出结果。
大家可以发现,和前面的字符串拼接不同, 我们使用了下面这样模板一样的字符串
税前薪资是:%s 元, 缴税:%s 元, 税后薪资是:%s 元
其中 %s 就是模板中的占位符,表示这个位置先占着,待会儿要有数据填入到这里。
然后再提供一个元组,里面依次存放需要填入到 %s 占位位置 数据。
这里是使用变量 (salary,tax,aftertax) 。
%s 是一种格式化符号, Python 解释器 看到 %s , 就会调用内置函数 str(),并将对应的格式化对象作为的参数传入 , 返回的结果字符串填入对应占位符。
简单说 %s 位置填入的结果,就是调用str函数的返回值。
str()内置函数,它的参数几乎所有内置类型的对象,字符串、 整数、 浮点数 、list 等等都可以
所以 我们可以用 %s 为占位符, 对应的格式化对象, 不仅仅是字符串,可以是整数、 浮点数 、list 等等。
格式化字符串里面占位符的个数 必须 和 后面对应的格式化对象个数相同,
比如
'税前薪资:%s 元, 缴税:%s 元, 税后薪资:%s 元' % (salary,tax,aftertax)
占位符是3个,那么后面的元组里面的格式化对象就是3个。
如果占位符是2个,后面的元组里面的格式化对象就应该是2个。像这样
'税前薪资:%s 元, 缴税:%s 元' % (salary,tax)
如果占位符是1个,后面的元组里面的格式化对象就应该是1个。像这样
'税前薪资:%s 元' % (salary,)
还记得,我们说过, 元组里面只有1个元素,后面别忘了加个逗号。
像这种只有一个格式化对象的情况下,可以直接就用格式化对象,不需要放到元组里面,像这样
'税前薪资:%s 元' % salary
指定宽度和对齐
如果我们需要将下面这样的3个字符串进行格式化
'税前薪资:%s 元' % 100000 '税前薪资:%s 元' % 10000 '税前薪资:%s 元' % 1000
得到的结果如下
税前薪资:100000 元 税前薪资:10000 元 税前薪资:1000 元
会发现,由于被格式化的数字对应的字符串长度不同,导致结果不对齐。
这样的输出结果显得不够美观。
我们可以指定格式化结果的字符串长度,比如我想要格式化结果至少10个字符,不足10个字符补空格,就可以这样
'税前薪资:%10s 元' % 100000 '税前薪资:%10s 元' % 10000 '税前薪资:%10s 元' % 1000
%10s 中的 10 就是指定了格式化结果至少10个字符。
得到的结果就是
税前薪资: 100000 元 税前薪资: 10000 元 税前薪资: 1000 元
如果我们希望是左边对齐,而不是右边对齐,就可以加一个 - 好,像这样
'税前薪资:%-10s 元' % 100000 '税前薪资:%-10s 元' % 10000 '税前薪资:%-10s 元' % 1000
可以得到如下结果
税前薪资:100000 元 税前薪资:10000 元 税前薪资:1000 元
%d 和 %f
占位符除了 %s ,还有其它的一些。
常见的是 %d 和 %f 。
%d 用在 格式化对象 是 整数的情况 ,比如
'税前薪资:%d 元' % 10000
%f 用在 格式化对象 是 浮点数的情况,比如
'税前薪资:%f 元' % 10000.32
前面我们说过了 %s 也可以用来格式化 整数和 浮点数,但是有些情况下, %d %f 有特别的用处。
比如,打印数字的时候,我们指定宽度,而且不足宽度,希望补零,而不是补空格,就可以这样
'税前薪资:%010d 元' % 100000 '税前薪资:%010d 元' % 10000 '税前薪资:%010d 元' % 1000
可以得到如下结果
税前薪资:0000100000 元 税前薪资:0000010000 元 税前薪资:0000001000 元
对于小数的格式化,通常使用 %f,如下
'税前薪资:%010f 元' % 1000.4522 '税前薪资:%010f 元' % 1008.6621 '税前薪资:%010f 元' % 1009.3351
可以得到如下结果
税前薪资:1000.452200 元 税前薪资:1008.662100 元 税前薪资:1009.335100 元
如果我们想保留小数点后面2位数字,就可以加上 .2 像这样
'税前薪资:%010.2f 元' % 1000.4522 '税前薪资:%010.2f 元' % 1008.6621 '税前薪资:%010.2f 元' % 1009.3351
可以得到如下结果
税前薪资:0001000.45 元 税前薪资:0001008.66 元 税前薪资:0001009.34 元
参考文档
详细的 printf风格的格式化,可以参考如下官方文档
https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting
我们这里不打算介绍更多了,因为到了Python3.6 ,有另外一种更方便的方式: f-string 格式化
f-string 格式化
f-string 格式化 就是在字符串模板前面加上f,然后占位符使用{} ,里面直接放入对应的数据对象。
如下所示
f'税前薪资是:{salary}元, 缴税:{tax}元, 税后薪资是:{aftertax}元'
完整的代码如下
salary = input('请输入薪资:')
# 计算出缴税额,存入变量tax
tax = int(salary) *25/100
# 计算出税后工资,存入变量aftertax
aftertax = int(salary) *75/100
print(f'税前薪资是:{salary}元, 缴税:{tax}元, 税后薪资是:{aftertax}元')
运行一下,可以发现输出结果一样。
这种方式是不是更加的直观明了呢?
要注意的是,这种写法必须要Python解释器是3.6 以后的版本才支持哦。
指定宽度
同样,为了输出对齐,我们需要指定填入的字符串的宽度。
方法是,在括号里面的变量后面加上 :宽度值
比如
salary = 10000
print(f'{salary:10}')
f'{salary:10}' 就指定了 宽度为10 个字符, 如果填入的字符串不足10个字符,就在前面加上空格
比如上面的输出结果就是
>>> salary = 10000
>>> print(f'{salary:10}')
10000
完整的一个示例程序如下
# 员工 1
salary = 8000
tax = int(salary) *25/100
aftertax = int(salary) *75/100
print(f'税前薪资是:{salary:8}元, 缴税:{tax:8}元, 税后薪资是:{aftertax:8}元')
# 员工 2
salary = 15000
tax = int(salary) *25/100
aftertax = int(salary) *75/100
print(f'税前薪资是:{salary:8}元, 缴税:{tax:8}元, 税后薪资是:{aftertax:8}元')
# 员工 3
salary = 100000
tax = int(salary) *25/100
aftertax = int(salary) *75/100
print(f'税前薪资是:{salary:8}元, 缴税:{tax:8}元, 税后薪资是:{aftertax:8}元')
运行一下结果如下:
税前薪资是: 8000元, 缴税: 2000.0元, 税后薪资是: 6000.0元 税前薪资是: 15000元, 缴税: 3750.0元, 税后薪资是: 11250.0元 税前薪资是: 100000元, 缴税: 25000.0元, 税后薪资是: 75000.0元
这样,整体就显得很清爽。
当然上面的代码 有很多重复的部分。聪明的你想到怎么优化一下了吗?
对了,用函数。像这样
def calcTax(salary):
tax = int(salary) *25/100
aftertax = int(salary) *75/100
print(f'税前薪资是:{salary:8}元, 缴税:{tax:8}元, 税后薪资是:{aftertax:8}元')
# 员工 1
calcTax(8000)
# 员工 2
calcTax(15000)
# 员工 3
calcTax(100000)
左对齐
上面的输出结果是不足在前面补空格,最终的结果就是右边对齐。 如果我们想左对齐,可以在括号里使用 < 符号
像这样 {salary:<8}
def calcTax(salary):
tax = int(salary) *25/100
aftertax = int(salary) *75/100
print(f'税前薪资是:{salary:<8}元, 缴税:{tax:<8}元, 税后薪资是:{aftertax:<8}元')
calcTax(8320)
calcTax(15023)
calcTax(100030)
运行结果如下:
税前薪资是:8320 元, 缴税:2080.0 元, 税后薪资是:6240.0 元 税前薪资是:15023 元, 缴税:3755.75 元, 税后薪资是:11267.25元 税前薪资是:100030 元, 缴税:25007.5 元, 税后薪资是:75022.5 元
小数点后位数
如果我们想指定小数点后保留几位,可以像这样 {salary:<8.1f}
后面的.1f就表示小数点后面保留1位
def calcTax(salary):
tax = int(salary) *25/100
aftertax = int(salary) *75/100
print(f'税前薪资是:{salary:8.1f}元, 缴税:{tax:8.1f}元, 税后薪资是:{aftertax:8.1f}元')
calcTax(8320)
calcTax(15023)
calcTax(100030)
运行结果如下:
税前薪资是: 8320.0元, 缴税: 2080.0元, 税后薪资是: 6240.0元 税前薪资是: 15023.0元, 缴税: 3755.8元, 税后薪资是: 11267.2元 税前薪资是:100030.0元, 缴税: 25007.5元, 税后薪资是: 75022.5元
不足补零
如果我们想在不足指定宽度的时候不是补空格,而是补数字0,可以像这样 {salary:08}
def calcTax(salary):
tax = int(salary) *25/100
aftertax = int(salary) *75/100
print(f'税前薪资是:{salary:08}元, 缴税:{tax:08.1f}元, 税后薪资是:{aftertax:08.1f}元')
calcTax(8320)
calcTax(15023)
calcTax(100030)
运行结果如下:
税前薪资是:00008320元, 缴税:002080.0元, 税后薪资是:006240.0元 税前薪资是:00015023元, 缴税:003755.8元, 税后薪资是:011267.2元 税前薪资是:00100030元, 缴税:025007.5元, 税后薪资是:075022.5元
转义符
我们在代码中定义一个字符串的时候,有些字符不太方便用键盘直接敲出来,或者敲出来看起来也不知道那是一个字符。
比如 换行符, 我们可以用回车键,敲出来。
a = '''abcd efg'''
其中abcd 和efg之间其实就是有一个换行字符。
有时候像这样的字符出现在字符串中,可以使用转义写法来表示,比如上的字符串就等价于
a = 'abcd\nefg'
‘\n’就是一个转义字符,表示一个换行字符。
处理’\n’ 之外,还有一些其他的字符可以用转义符表示,比如我们还可以用 ‘\t’表示tab字符。
Python字符串中 转义字符都是用反斜杠 \ 开头 。
如果字符串中本身需要有反斜杠,并非转义,比如Windows下面的路径
path = 'c:\windows\temp'
其中的 \t 会被当做一个tab字符,而不是 \ 和 t 两个字符。
这时,可以在在前面再加一个反斜杠, 像下面这样
path = 'c:\\windows\\temp'
也可以在字符前面加上一个 r ,表示字符串内容是raw string, 无需转义,像这样
path = r'c:\windows\temp'
相关推荐
- 阿里云国际站ECS:阿里云ECS如何提高网站的访问速度?
-
TG:@yunlaoda360引言:速度即体验,速度即业务在当今数字化的世界中,网站的访问速度已成为决定用户体验、用户留存乃至业务转化率的关键因素。页面加载每延迟一秒,都可能导致用户流失和收入损失。对...
- 高流量大并发Linux TCP性能调优_linux 高并发网络编程
-
其实主要是手里面的跑openvpn服务器。因为并没有明文禁p2p(哎……想想那么多流量好像不跑点p2p也跑不完),所以造成有的时候如果有比较多人跑BT的话,会造成VPN速度急剧下降。本文所面对的情况为...
- 性能测试100集(12)性能指标资源使用率
-
在性能测试中,资源使用率是评估系统硬件效率的关键指标,主要包括以下四类:#性能测试##性能压测策略##软件测试#1.CPU使用率定义:CPU处理任务的时间占比,计算公式为1-空闲时间/总...
- Linux 服务器常见的性能调优_linux高性能服务端编程
-
一、Linux服务器性能调优第一步——先搞懂“看什么”很多人刚接触Linux性能调优时,总想着直接改配置,其实第一步该是“看清楚问题”。就像医生看病要先听诊,调优前得先知道服务器“哪里...
- Nginx性能优化实战:手把手教你提升10倍性能!
-
关注△mikechen△,十余年BAT架构经验倾囊相授!Nginx是大型架构而核心,下面我重点详解Nginx性能@mikechen文章来源:mikechen.cc1.worker_processe...
- 高并发场景下,Spring Cloud Gateway如何抗住百万QPS?
-
关注△mikechen△,十余年BAT架构经验倾囊相授!大家好,我是mikechen。高并发场景下网关作为流量的入口非常重要,下面我重点详解SpringCloudGateway如何抗住百万性能@m...
- Kubernetes 高并发处理实战(可落地案例 + 源码)
-
目标场景:对外提供HTTPAPI的微服务在短时间内收到大量请求(例如每秒数千至数万RPS),要求系统可弹性扩容、限流降级、缓存减压、稳定运行并能自动恢复。总体思路(多层防护):边缘层:云LB...
- 高并发场景下,Nginx如何扛住千万级请求?
-
Nginx是大型架构的必备中间件,下面我重点详解Nginx如何实现高并发@mikechen文章来源:mikechen.cc事件驱动模型Nginx采用事件驱动模型,这是Nginx高并发性能的基石。传统...
- Spring Boot+Vue全栈开发实战,中文版高清PDF资源
-
SpringBoot+Vue全栈开发实战,中文高清PDF资源,需要的可以私我:)SpringBoot致力于简化开发配置并为企业级开发提供一系列非业务性功能,而Vue则采用数据驱动视图的方式将程序...
- Docker-基础操作_docker基础实战教程二
-
一、镜像1、从仓库获取镜像搜索镜像:dockersearchimage_name搜索结果过滤:是否官方:dockersearch--filter="is-offical=true...
- 你有空吗?跟我一起搭个服务器好不好?
-
来人人都是产品经理【起点学院】,BAT实战派产品总监手把手系统带你学产品、学运营。昨天闲的没事的时候,随手翻了翻写过的文章,发现一个很严重的问题。就是大多数时间我都在滔滔不绝的讲理论,却很少有涉及动手...
- 部署你自己的 SaaS_saas如何部署
-
部署你自己的VPNOpenVPN——功能齐全的开源VPN解决方案。(DigitalOcean教程)dockovpn.io—无状态OpenVPNdockerized服务器,不需要持久存储。...
- Docker Compose_dockercompose安装
-
DockerCompose概述DockerCompose是一个用来定义和管理多容器应用的工具,通过一个docker-compose.yml文件,用YAML格式描述服务、网络、卷等内容,...
- 京东T7架构师推出的电子版SpringBoot,从构建小系统到架构大系统
-
前言:Java的各种开发框架发展了很多年,影响了一代又一代的程序员,现在无论是程序员,还是架构师,使用这些开发框架都面临着两方面的挑战。一方面是要快速开发出系统,这就要求使用的开发框架尽量简单,无论...
- Kubernetes (k8s) 入门学习指南_k8s kubeproxy
-
Kubernetes(k8s)入门学习指南一、什么是Kubernetes?为什么需要它?Kubernetes(k8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。它...
欢迎 你 发表评论:
- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
