首页 > 编程语言 >[转]Python格式化字符串的4种方式

[转]Python格式化字符串的4种方式

时间:2024-03-20 13:47:34浏览次数:32  
标签:格式化 name format Python 18 age egon print 字符串

 

文章目录

 

Python格式化字符串的4种方式

一:%号

%号格式化字符串的方式从Python诞生之初就已经存在时至今日,python官方也并未弃用%号,但也并不推荐这种格式化方式。

# 1、格式的字符串(即%s)与被格式化的字符串(即传入的值)必须按照位置一一对应
# ps:当需格式化的字符串过多时,位置极容易搞混
print('%s asked %s to do something' % ('egon', 'lili'))  # egon asked lili to do something
print('%s asked %s to do something' % ('lili', 'egon'))  # lili asked egon to do something

# 2、可以通过字典方式格式化,打破了位置带来的限制与困扰
print('我的名字是 %(name)s, 我的年龄是 %(age)s.' % {'name': 'egon', 'age': 18})

kwargs={'name': 'egon', 'age': 18}
print('我的名字是 %(name)s, 我的年龄是 %(age)s.' % kwargs)

二:str.format

format方法是在Python 2.6中引入的,是字符串类型的内置方法。因为str.format的方式在性能和使用的灵活性上都比%号更胜一筹,所以推荐使用

  1. 使用位置参数
# 按照位置一一对应
print('{} asked {} to do something'.format('egon', 'lili'))  # egon asked lili to do something
print('{} asked {} to do something'.format('lili', 'egon'))  # lili asked egon to do something
  1. 使用索引
# 使用索引取对应位置的值
print('{0}{0}{1}{0}'.format('x','y')) # xxyx
  1. 使用关键字参数or字典
# 可以通过关键字or字典方式的方式格式化,打破了位置带来的限制与困扰
print('我的名字是 {name}, 我的年龄是 {age}.'.format(age=18, name='egon'))

kwargs = {'name': 'egon', 'age': 18}
print('我的名字是 {name}, 我的年龄是 {age}.'.format(**kwargs)) # 使用**进行解包操作
  1. 填充与格式化
# 先取到值,然后在冒号后设定填充格式:[填充字符][对齐方式][宽度]

# *<10:左对齐,总共10个字符,不够的用*号填充
print('{0:*<10}'.format('开始执行')) # 开始执行******

# *>10:右对齐,总共10个字符,不够的用*号填充
print('{0:*>10}'.format('开始执行')) # ******开始执行

# *^10:居中显示,总共10个字符,不够的用*号填充
print('{0:*^10}'.format('开始执行')) # ***开始执行***
  1. 精度与进制
print('{salary:.3f}'.format(salary=1232132.12351))  #精确到小数点后3位,四舍五入,结果为:1232132.124
print('{0:b}'.format(123))  # 转成二进制,结果为:1111011
print('{0:o}'.format(9))  # 转成八进制,结果为:11
print('{0:x}'.format(15))  # 转成十六进制,结果为:f
print('{0:,}'.format(99812939393931))  # 千分位格式化,结果为:99,812,939,393,931

三:f-Strings

str.format()%格式化高级了一些,但是它还是有自己的缺陷。当需要传入的字符串过多时,仍然会显得非常冗长。与在Python 3.6中引入 了f-strings,不仅比str.format更简洁,性能上也更胜一筹

f-string是以f或F开头的字符串, 核心在于字符串中符号{}的使用

  1. {}中可以是变量名
name = 'egon'
age = 18
print(f'{name} {age}')  # egon 18
print(F'{age} {name}')  # 18 egon
  1. {}中可以是表达式
# 可以在{}中放置任意合法的Python表达式,会在运行时计算
# 比如:数学表达式
print(f'{3*3/2}') # 4.5

# 比如:函数的调用
def foo(n):
    print('foo say hello')
    return n

print(f'{foo(10)}') # 会调用foo(10),然后打印其返回值

# 比如:调用对象的方法
name='EGON'
print(f'{name.lower()}') # egon
  1. 在类中的使用
>>> class Person(object):
...     def __init__(self, name, age):
...         self.name = name
...         self.age = age
...     def __str__(self):
...         return f'{self.name}:{self.age}'
...     def __repr__(self):
...         return f'===>{self.name}:{self.age}<==='
... 
>>> 
>>> obj=Person('egon',18)
>>> print(obj) # 触发__str__
egon:18
>>> obj        # 触发__repr__
===>egon:18<===
>>> 
>>> 
>>> 
>>> # 在f-Strings中的使用
>>> f'{obj}'   # 触发__str__
'egon:18'
>>> f'{obj!r}' # 触发__repr__
'===>egon:18<==='
  1. 多行f-Stings
# 当格式化字符串过长时,如下列表info
name = 'Egon'
age = 18
gender = 'male'
hobbie1='play'
hobbie2='music'
hobbie3='read'
info = [f'名字:{name}年龄:{age}性别:{gender}',f'第一个爱好:{hobbie1}第二个爱好:{hobbie2}第三个爱好:{hobbie3}'] 

# 我们可以回车分隔到多行,注意每行前都有一个f
info = [
    # 第一个元素
    f'名字:{name}'
    f'年龄:{age}'
    f'性别:{gender}',

    # 第二个元素
    f'第一个爱好:{hobbie1}'
    f'第二个爱好:{hobbie2}'
    f'第三个爱好:{hobbie3}'
]
print(info)
# ['名字:Egon年龄:18性别:male', '第一个爱好:play第二个爱好:music第三个爱好:read']
  1. 引号的嵌套
# 当字符串嵌套发送冲突时,与正常的字符串处理方式是一样的
# 1、外层为单引号,内层嵌套也为单引号,并且想要输入的内容也为单引号,那么外层需要改用双引号
print("my name is 'egon'")

# 2、外层为单引号,内层嵌套也为单引号,并且想要输入的内容也为单引号,需要用到转义
print('my name is \'egon\'')
  1. 注意
#1、反斜杠可以用来进行字符转义,但不能用在{}的表达式中
f'{1\2}' # 语法错误

#2、注释#号也不能出现在{}的表达式中
f'{x#}' # 语法错误
  1. 括号的处理

基于3.5我们得知,不能在{}内出现反斜杠\,所以,当我们的输出的结果中需要包含{}时,下面的做法就是错误的

print(f'\{天王盖地虎\}')

类似于输出%号的做法

>>> print('%s%%' %30)
30%

若想输出{},那么需要在原有的基础上再套一层,如下

print(f'{{天王盖地虎}}') # {天王盖地虎}

print(f'{{{{天王盖地虎}}}}') # {{天王盖地虎}}

性能对比=>f_Stings性能最高

from timeit import timeit


def test_s():
    name = 'Egon'
    age = 18
    return '%s:%s.' % (name, age)


def test_format():
    name = 'Egon'
    age = 18
    return '{}:{}.'.format(name, age)


def test_f_strings():
    name = 'Egon'
    age = 18
    return f'{name}:{age}.'


res1 = timeit(test_s, number=1000000)
res2 = timeit(test_format, number=1000000)
res3 = timeit(test_f_strings, number=1000000)
print(res1) # 0.3709844550030539
print(res2) # 0.47834375899401493
print(res3) # 0.3111891380031011, 最快

四:标准库模板

从Python 2.4起,Python标准库string引入了Template也可以用来格式化字符串,所以说,与前三种方式的一个显著区别就是:Template并属于python语言的核心语法特征,使用方式如下

from string import Template

name='EGON'
t = Template('Hello $name!')
res=t.substitute(name=name)

print(res)  # Hello EGON!

另外一个不同的地方是这个模板字符串不支持类似str.format那样的进制转换,需要我们自己处理

from string import Template

name='EGON'
templ_string = 'Hello $name, there is a $error error!!!'
res=Template(templ_string).substitute(name=name, error=hex(12345))

print(res) # Hello EGON, there is a 0x3039 error!!!

使用模板字符串Template的最佳的时机就是当你的程序需要处理由用户提供的输入内容时。模板字符串是最保险的选择,因为可以降低复杂性。

其他一些复杂的字符串格式化技巧的可能会给你的程序带来安全漏洞

五:总结四种方式的应用场景

  1. 如果格式化的字符串是由用户输入的,那么基于安全性考虑,推荐使用Template

  2. 如果使用的python3.6+版本的解释器,推荐使用f-Stings

  3. 如果要兼容python2.x版本的python解释器,推荐使用str.format

  4. 如果不是测试的代码,不推荐使用

标签:格式化,name,format,Python,18,age,egon,print,字符串
From: https://www.cnblogs.com/castlewu/p/18085013

相关文章

  • Python APScheduler介绍及使用
    在许多应用程序中,需要定期执行某些任务,例如发送电子邮件、生成报告或清理临时文件等。为了管理和调度这些任务,Python中有许多优秀的调度器库,其中APScheduler是一个流行且功能强大的选择。本文将介绍APScheduler的基本概念,并展示如何使用它来实现定时任务调度。一、APScheduler简......
  • 07 - Debian如何分区、格式化与挂载磁盘
    作者:网络傅老师特别提示:未经作者允许,不得转载任何内容。违者必究!Debian如何分区、格式化与挂载磁盘《傅老师Debian小知识库系列之07》——原创==前言==傅老师Debian小知识库特点:1、最小化拆解Debian实用技能;2、所有操作在VM虚拟机实测完成;3、致力于最终形成Debian小......
  • python自动化——selenium——教程截图笔记复习
      需要现在和浏览器对应的驱动:               123 123......
  • AI回答:python中如何实现[异或]的?什么是异或?
    问题:python中如何实现[异或]的?什么是异或?AI:异或(ExclusiveOR,简称XOR)是一种二进制运算,符号通常为"^"。在这种运算中,如果两个比较的位(bit)相同,则结果为0;如果两个比较的位不同,则结果为1。异或运算在计算机科学中有着广泛的应用,比如在错误检测和校正、密码学以及某些算法中。在Pyt......
  • 如何自己写一个Python库
    一文搞懂如何自己写一个Python库你是否有过疑问,通过pip安装的库都是如何编写的?你是否曾想过为自己的Python项目编写一个库,以便在不同项目中重复使用代码?并且能在PyPI仓库中发布,并通过pipinstall库名来安装使用1.png 编写Python库可能看起来有些复杂,但实际上并非如此。本......
  • Ubuntu 上安装python2.7
    Ubuntu20.04LTS默认安装的是python3,如果需要使用python2.7,需要自己进行安装。一、启用Universe仓库一般情况下其实应该是已经启用了,但是还是记录一下手动添加的方法sudoapt-add-repositoryuniversesudoaptupdate二、安装python2.7使用以下命令安装python2.7sudoapt......
  • python parse time
    utils.py:importrefromdatetimeimportdatetimefromtypingimportUnion#pipinstallpython-dateutilfromdateutilimportparserdefparse_time(s:Union[int,float,str])->datetime:"""将字符串或数值转换为datetimeUsage::......
  • Python配置文件使用教程
    在Python应用程序开发过程中,配置文件扮演着重要的角色。配置文件可以用来存储应用程序的各种设置、选项和参数,使得程序更加灵活和可配置。本文将介绍Python中如何使用配置文件,并提供一些常见的配置文件处理方法。一、配置文件格式常见的配置文件格式有多种,包括INI格式、J......
  • Python打包成可执行文件(.exe)教程
    在Python开发中,将Python脚本打包成可执行文件(.exe)是一种常见的需求。将Python代码打包成可执行文件可以使得程序在没有安装Python解释器的环境下运行,也方便程序的发布和分发。本文将介绍几种常见的方法来将Python代码打包成可执行文件。一、pyinstallerpyinstaller是......
  • Python打包成可执行文件(.exe)教程
    在Python开发中,将Python脚本打包成可执行文件(.exe)是一种常见的需求。将Python代码打包成可执行文件可以使得程序在没有安装Python解释器的环境下运行,也方便程序的发布和分发。本文将介绍几种常见的方法来将Python代码打包成可执行文件。一、pyinstallerpyinstaller......