gpt4 book ai didi

python - 字符串格式选项 : pros and cons

转载 作者:IT老高 更新时间:2023-10-28 20:32:21 26 4
gpt4 key购买 nike

这是在 Python 中格式化字符串的两种非常流行的方法。一种是使用 dict:

>>> 'I will be %(years)i on %(month)s %(day)i' % {'years': 21, 'month': 'January', 'day': 23}
'I will be 21 on January 23'

另一个使用简单的tuple:

>>> 'I will be %i on %s %i' % (21, 'January', 23)
'I will be 21 on January 23'

第一个更易读,但第二个写起来更快。我实际上是模糊地使用它们。

各有什么优缺点?关于性能、可读性、代码优化(其中一个转换为另一个?)以及您认为有用的其他任何内容。

最佳答案

为什么 format()% 字符串操作更灵活

我认为你真的应该坚持strformat()方法,因为它是格式化字符串的首选方法,将来可能会取代字符串格式化操作.

此外,它还有一些非常好的功能,还可以将基于位置的格式与基于关键字的格式相结合:

>>> string = 'I will be {} years and {} months on {month} {day}'
>>> some_date = {'month': 'January', 'day': '1st'}
>>> diff = [3, 11] # years, months
>>> string.format(*diff, **some_date)
'I will be 3 years and 11 months on January 1st'

甚至以下方法也可以:

>>> string = 'On {month} {day} it will be {1} months, {0} years'
>>> string.format(*diff, **some_date)
'On January 1st it will be 11 months, 3 years'

还有另一个支持 format() 的原因。因为它是一个方法,所以它可以作为回调传递,如下例所示:

>>> data = [(1, 2), ('a', 'b'), (5, 'ABC')]
>>> formatter = 'First is "{0[0]}", then comes "{0[1]}"'.format
>>> for item in map(formatter, data):
print item


First is "1", then comes "2"
First is "a", then comes "b"
First is "5", then comes "ABC"

是不是比字符串格式化操作灵活很多?

documentation page 上查看更多示例% 操作和 .format() 方法之间的比较。

比较基于元组的%字符串格式与基于字典的

一般有三种调用%字符串操作的方式(是的,三个,不是两个),比如那:

base_string % values

它们的不同在于 values 的类型(这是 base_string 内容的结果):

  • 可以是tuple,然后按照出现在tuple中的顺序,一个一个替换,

    >>> 'Three first values are: %f, %f and %f' % (3.14, 2.71, 1)
    'Three first values are: 3.140000, 2.710000 and 1.000000'
  • 可以是dict(字典),然后根据关键字替换,

    >>> 'My name is %(name)s, I am %(age)s years old' % {'name':'John','age':98}
    'My name is John, I am 98 years old'
  • 它可以是单个值,如果 base_string 包含应该插入值的单个位置:

    >>> 'This is a string: %s' % 'abc'
    'This is a string: abc'

它们之间有明显的区别,这些方式不能组合(与上面提到的能够组合一些特性的format()方法相反)。

但是有一些东西只针对基于字典的字符串格式化操作,并且在其余三种格式化操作类型中是不可用的。这是能够以简单的方式用实际变量名替换说明符:

>>> name = 'John'
>>> surname = 'Smith'
>>> age = 87
# some code goes here
>>> 'My name is %(surname)s, %(name)s %(surname)s. I am %(age)i.' % locals()
'My name is Smith, John Smith. I am 87.'

仅作记录:当然可以通过像这样解包字典来使用 format() 轻松替换上述内容:

>>> 'My name is {surname}, {name} {surname}. I am {age}.'.format(**locals())
'My name is Smith, John Smith. I am 87.'

有没有人知道什么是特定于一种字符串格式化操作的功能,而不是另一种?听到它可能会很有趣。

关于python - 字符串格式选项 : pros and cons,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8395925/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com