0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

格式化字符串常量f-strings一些不常见的特性

Linux爱好者 来源:Python开发者 作者:风草木香 2022-08-15 12:00 次阅读

【导语】:本文介绍了“格式化字符串常量”f-strings一些不常见的特性,包括:格式化日期和时间、同时打印变量名和变量值等,嵌套使用f-strings等,此外与其他格式化字符串的方法相比,f-strings的速度更快,因此,学习这些新特性有助于开发者更好地处理字符串。

简介

f-strings,也称为格式化字符串常量(formatted string literals),是Python3.6引入的一种字符串格式化方法,它的使用方式为f'xxx',只需将要替换的字段放到{}中,就可以格式化字符串了。相信很多读者已经使用过f-strings了。然而许多好用的特性你可能还未使用过,我们来一起学习下。Python开发者之前还分享一篇包含73个f-string例子的文章,建议收藏一起阅读。

1. 格式化日期和时间

用f-strings格式化数字很常见,但你知道f-strings也可以用来格式化日期和时间戳字符串吗?

importdatetime
today=datetime.datetime.today()
print(f"{today:%Y-%m-%d}")
#2022-07-04
print(f"{today:%Y}")
#2022

f-strings可以格式化日期和时间,它与datetime.strftime的功能一样。同时,所有底层C实现所支持的格式,在Python的strftime中也可以使用。但在不同的平台上,使用方式可能有所不同。你可以在Linux manpages[1]上查阅相关信息,例如%F相当于%Y-%m-%d%T相当于%H:%M:%S,此外%x%X分别是设置地区首选的日期和时间格式。

2. 变量名和调试

f-strings最近新增的一个特性是可以同时打印变量名和变量值(Python 3.8及之后的版本均可使用):

x=10
y=25
print(f"x={x},y={y}")
#x=10,y=25
print(f"{x=},{y=}")#更方便!(3.8+)
#x=10,y=25

print(f"{x=:.3f}")
#x=10.000

该特性被称为“调试”,可以与其他修饰符结合使用。它还能检测到空格,因此f"[x =]和f"[x =]"会产生不同的结果。

3. __repr__ and __str__

当输出类的实例时,默认使用的是类的__str__方法。如果我们想将默认方法改为__repr__,可以使用!r进行转换。

classUser:
def__init__(self,first_name,last_name):
self.first_name=first_name
self.last_name=last_name

def__str__(self):
returnf"{self.first_name}{self.last_name}"

def__repr__(self):
returnf"User'snameis:{self.first_name}{self.last_name}"

user=User("John","Doe")
print(f"{user}")
#JohnDoe
print(f"{user!r}")
#User'snameis:JohnDoe

我们也可以调用f-string内部的repr(some_var)方法,但直接使用转化标志显然更加方便。

4. f-strings的性能更优

通常新特性和语法糖的提出都是以牺牲性能为代价的,但f-strings成功做到了两者兼顾:

#python-mtimeit-s'x,y="Hello","World"''f"{x}{y}"'
fromstringimportTemplate

x,y="Hello","World"

print(f"{x}{y}")#39.6纳秒-最快!
print(x+""+y)#43.5纳秒
print("".join((x,y)))#58.1纳秒
print("%s%s"%(x,y))#103纳秒
print("{}{}".format(x,y))#141纳秒
print(Template("$x$y").substitute(x=x,y=y))#1.24微秒-最慢!

以上所有示例的耗费时间均是用timeit模块测试的,例如我们想测试f-strings,就可以这样做:python -m timeit -s 'x, y = "Hello", "World"' 'f"{x} {y}"',由测试结果可知,f-strings是所有方法中最快的,因此非常推荐使用该方法。

5. 格式化标准

f-strings支持Python的格式化标准[2],所以我们可以在修饰符中进行多种格式化操作:

text="helloworld"

#文本居中:
print(f"{text:^15}")
#'helloworld'

number=1234567890
#加入分隔符
print(f"{number:,}")
#1,234,567,890

number=123
#在起始位置补0
print(f"{number:08}")
#00000123

通过使用Python的格式化功能,不仅可以格式化数字和日期,还可以对齐或居中文本,在字符串前面添加0或者空格,添加分隔符。这些特性也可以在其他格式化方法中使用。

6. f-strings的嵌套使用

如果f-strings的基本功能不能满足你的需求,你还可以将其嵌套使用,假如我们想在一个数字前加上$符号,可以这样做:

number=254.3463
print(f"{f'${number:.3f}':>10s}")
#'$254.346'

如果你需要在格式符中加入变量,也可以使用嵌套的f-strings。这样f-string的可读性也更强:

importdecimal
width=8
precision=3
value=decimal.Decimal("42.12345")
print(f"output:{value:{width}.{precision}}")
#'output:42.1'

7. 分情况格式化字符串

在嵌套使用f-strings的基础上,我们还可以在其内部使用三元条件操作符:

importdecimal
value=decimal.Decimal("42.12345")
print(f'Result:{value:{"4.3"ifvalue< 100 else "8.3"}}')
#Result:42.1
value=decimal.Decimal("142.12345")
print(f'Result:{value:{"4.2"ifvalue< 100 else "8.3"}}')
#Result:142

8. Lambda表达式

我们也可以在f-strings中使用lambda表达式,在如下的例子中,我们需要把lambda表达式放到括号中,否则:会被f-strings当作字符串:

print(f"{(lambdax:x**2)(3)}")
#9

结论

通过前面的使用,我们可以看到f-strings还有许多好用的特性,然而许多读者可能没有用过这些特性。因此在平时的学习中,我们还可以查看其他模块的官方文档,也许你会发现一些有趣的东西。

审核编辑:汤梓红


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 字符串
    +关注

    关注

    1

    文章

    552

    浏览量

    20135
  • python
    +关注

    关注

    51

    文章

    4677

    浏览量

    83473

原文标题:实用!f-strings 比你想象的还要强大

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    LABVIEW中的printf函数---格式化写入字符串函数

    `我们经常会遇到格式化字符串输出的问题,参见下面的程序框图。在C语言中,类似功能的函数是printf函数,该函数几乎是C语言经典课程的第节内容,可见其用途之广泛。C语言中实现上面程序框图的功能非常
    发表于 11-15 10:46

    Labview格式化写入字符串函数

    Labview格式化写入字符串函数
    发表于 12-26 12:42

    sprintf格式化字符串,数据被改变

    sprintf(a,"%.2f %.2f %.2f", 1.0 , 2.0 , 3.0);a是17个元素的字符数组。函数执行后,a的结果为“1.00 2.00 2.03”最后
    发表于 04-10 15:06

    字符串常量的接线端如何反向

    本帖最后由 209巨子 于 2016-7-23 21:35 编辑 我是新手,这几天才开始学习LabVIEW,求助各位大神,字符串常量的接线端是如何反向的?或者说,下图中真常量字符串
    发表于 07-23 21:34

    labview获取DateTime格式时间字符串

    数据库中时间的格式为DateTime格式但labview自带的时间获取函数格式与DateTime格式不对应转换方法为使用 格式化日期/时间
    发表于 08-29 14:43

    格式化写入字符串函数 求助

    格式化写入字符串函数格式字符串:%6f\n%s\n%d\n%s这个怎么理解?
    发表于 07-13 13:23

    labview 的格式化字符串,请问选项的参数是0x%02x是什么意思?

    labview 的格式化字符串 选项的参数是0x%02x 是什么意思?
    发表于 07-09 18:58

    C语言技巧 sprintf()函数:将格式化的数据写入字符串

    格式化字符串”上。printf()和sprintf()都使用格式化字符串来指定格式,在
    发表于 04-01 11:26

    怎样将stm32格式化打印字符串的函数进行封装呢

    怎样将stm32格式化打印字符串的函数进行封装呢?
    发表于 11-26 06:38

    嵌入式C语言的字符串字符指针的相关资料分享

    C语言的字符串字符指针  今天在写嵌入式代码时,遇到了个易错的,关于嵌入式CCC语言字符串字符指针的问题。!!!!  在嵌入式CCC语言中,有sprintf
    发表于 12-15 08:05

    2.6 python字符串格式化

    2.6 python字符串格式化格式化输出,主要有三种方式使用 % 进行格式化使用 format 函数进行格式化使用
    发表于 02-21 16:28

    AVR入门:怎么样使用AVR LibC's Stdio发送格式化字符串

    AVR入门:使用AVR LibC's Stdio发送格式化字符串 (#21)
    的头像 发表于 07-09 00:02 2787次阅读
    AVR入门:怎么样使用AVR LibC's Stdio发送<b class='flag-5'>格式化</b>的<b class='flag-5'>字符串</b>?

    剖析提升字符串格式化效率的小技巧

    一、前言 在嵌入式项目开发中,字符串格式化是很常见的操作,我们一般都会使用 C 库中的 sprintf 系列函数来完成格式化。 从功能上来说,这是没有问题的,但是在
    的头像 发表于 04-30 13:43 1364次阅读
    剖析提升<b class='flag-5'>字符串</b><b class='flag-5'>格式化</b>效率的小技巧

    python字符串格式化

    python字符串格式化 格式化输出,主要有三种方式 使用 % 进行格式化 使用 format 函数进行格式化 使用 f-string 进行
    的头像 发表于 02-21 16:28 1366次阅读
    python<b class='flag-5'>字符串</b><b class='flag-5'>格式化</b>

    如何把数字格式化字符串

    在嵌入式项目开发中,字符串格式化是很常见的操作,我们一般都会使用 C 库中的 sprintf 系列函数来完成格式化
    的头像 发表于 08-04 10:35 1533次阅读