开发者

Python中格式化字符串的方法总结

开发者 https://www.devze.com 2024-11-01 09:19 出处:网络 作者: 仙草哥哥
目录字符串格式化当前推荐做法:f-string历史做法%格式化format格式化Template格式化字符串不常用做法字符串拼接str.join()连接自定义字符串格式化总结字符串格式化
目录
  • 字符串格式化
  • 当前推荐做法:f-string
  • 历史做法
    • %格式化
    • format格式化
    • Template格式化字符串
  • 不常用做法
    • 字符串拼接
    • str.join()连接
    • 自定义字符串格式化
  • 总结

    字符串格式化

    字符串格式化是一项常见且重要的操作,用于动态生成包含变量内容的字符串。关于字符串的格式化,在python的历史上,曾经存在多种格式化字符串的方式,因此,这可能带来困扰,一些人可能不清楚应该使用哪一种格式化方法,下面,我就进行一下详细的介绍。

    当前推荐做法:f-string

    毫无疑问,f-string是现在最适合的字符串格式化的方法,因此首先进行介绍。f-string最早引入自3.6,因此需要3.6以后版本的python可以使用。

    使用方法: 在字符串前加上 f 或 F,并在花括号 {} 内填入变量或者表达式。

    name = "sagegrass"
    age = 18
    greeti编程客栈ng = f"你好,我的名字是{name},我今年{age}岁,我去年{age - 1}岁"
     
    print(greeting)
    

    在python3.8以后,加入了f-string调试支持,使用方法为在变量或者表达式以后添加=,从而同时输出名称和结果。

    name = "sagegrass"
    print(f"{name=}") # 此时输出结果为name=sagegrass
    

    历史做法

    %格式化

    历史做法是在以前版本的python中非常常见的做法,你可以在很多较早期的代码中看见,并且,时至今日也并非完全没有使用价值,一些人可能现在仍然这样做(但最好应该改为使用f-string)。

    %格式化是python中最早的字符串格式化方法,已经有几十年的历史了,最早从C语言中继承过来的。

    使用方法: "格式字符串" % 值

    name = "sagegrass"
    age = 18
    greeting = "你好,我的名字是%s,我今年%d岁,我去年%d岁" % (name, age, age - 1)
     
    print(greeting)
    

    其中,%s用于字符串,%d用于整型,另外还有一个常用的是%f,用于浮点数的格式化。但是由于其较为古老,既不好用,也容易出现问题,因此现在已经不建议使用了。

    format格式化

    format格式化是在python2.6以及3.0时期引入的,format提供了更强大和灵活的字符串格式化功能。

    使用方法:"格式字符串".format(值1, 值2, ...)

    p1 = "锄禾"
    p2 = "当午"
    p3 = "汗滴"
    p4 = "下土"
    poem = "{}日{},{}禾{}".format(p1, p2, p3, p4)
     
    print(poem)
    

    format格式化还允许提供位置参数,多次使用同一个变量。

    p1 = "一寸"
    p2 = "光阴"
    p3 = "金"
    poem = "{0}{1}{0}{2},寸{2}难买寸{1}".format(p1, p2, p3)
     
    prijsnt(poem)
    

    format格式化还允许提供关键字参数,根据指定参数名使用。

    name = "sagegrass"
    age = 18
    greeting = "你好,我的名字是{name},我今年{age}岁,我去年{age_of_last_year}岁".format(name=name, age=age, age_of_last_yearhttp://www.devze.com=age - 1)
     
    print(greeting)
    

    与%格式化字符串不同,format至今仍然是一个非常不错的选择,甚至在某些语言中,最新引入的格式化字符串的方式,就是类似format的方式。

    Template格式化字符串

    这是一个好的格式化字符串的方式,但是较少使用,这可能与其来自于string模块,而不可以直接使用有一些关系。

    from string import Template
     
    name = "sagegrass"
    age = 18
    template = Template("你好,我的名字是$name,我今年$age岁,我去年$age_of_last_year岁")
    greeting = template.substitute(name=name, age=age, age_of_last_year=age - 1)
     
    print(greeting)
    

    如果使用safe_substitute,那么在缺少变量的时候,也不会抛出异常,此时将保留原文

    from string import Template
     
    name = "sagegrass"
    age = 18
    template = Template("你好,我的名字是$name,我今年$age岁,我去年$age_of_last_year岁")
    greeting = template.safe_substitute(name=name)
     
    print(greeting) # 你好,我的名字是sagegrass,我今年$age岁,我去年$age_of_last_year岁
    

    不常用做法

    字符串拼接

    还有一些做法,不是很好,如非特殊情况,不应该作为一个字符串格式化的方法,下面简单的介绍,但是实际使用中应该小心谨慎。

    字符串拼接是通过例如+运算符,将多个字符串拼接为一个,它确实可以动态的生成字符串,不过其实不算是一个格式化字符串的方式。

    name = "sagegrass"
    age = 18
    greetin编程客栈g = "你好,我的名字是" + name + ",我今年" + str(age) +"岁,我去年" + str(age - 1) + "岁"
     
    print(greeting)
    

    这种方式确实简单易懂,但是缺点在于性能低下,且难以读懂(尤其是在拼接字符串的数量变多的情况下)

    str.join()连接

    join()其实也不是用于进行字符串格式化的,它通常用于一些其他的功能。它起到了和字符串拼接相似的功能,但是性能通常却更好一点,理论上是字符串拼接的上位替代,但是仍然QoSmSU不建议这样做。

    name = "sagegrass"
    age = 18
    greeting = "".join(("你好,我的名字是", name, ",我今年", str(age), "岁,我去年", str(age - 1), "岁"))
     
    print(greeting)
    

    自定义字符串格式化

    只有非常特殊的需求才可能这样做,一般情况下,这其实比较奇怪。

    import re
     
    def my_format(template, **kwargs):
        return re.sub(r'\{(\w+)\}', lambda match: str(kwargs.get(match.group(1), match.group(0))), template)
     
    name = "sagegrass"
    age = 18
    greeting = my_format("你好,我的名字是{name},我今年{age}岁,我去年{age_of_last_year}岁", name=name, age=age, age_of_last_year=age - 1)
    print(greeting)
    

    缺点包括自定义可能产生一些错误,或者是性能问题,好处在于可以按照自己的想法自定义格式化字符串的方法,并且添加一些需要的额外功能。

    总结

    2024年都快过完了,再有几个月就是2025年了,对于新的代码,目前(截止python3.12)应该尽可能使用f-string,这在过去可能是一个问题,因为前几年,可能还有非常多的人在使用python3.5,这个版本没有f-string功能,但是时至今日,3.7都已经很罕见了,f-string的使用也不再是一个“版本”问题了。

    以上就是Python中格式化字符串的方法总结的详细内容,更多关于Python格式化字符串的资料请关注编程客栈(www.devze.com)其它相关文章!

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消