当前位置: 首页 > 面试题库 >

字符串格式选项:利弊

公羊晟
2023-03-14
问题内容

这是在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()%字符串操作更灵活

我认为您应该真正使用format()of的方法str,因为它是格式化字符串的首选方法,并且将来可能会替换字符串格式化操作。

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

>>> 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"

它比字符串格式化操作灵活得多吗?

有关操作和方法之间的比较,请参见文档页面上的更多示例。%``.format()

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

通常,有以下 三种调用%字符串操作的方式(是, 三个 ,不是 两个 ):

base_string % values

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

  • 它可以是一个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.'

还有其他人有什么想法可能是一种特定于字符串格式化操作的功能,而不是另一种吗?听到它可能会很有趣。



 类似资料:
  • 这篇文章解释了某种现象的本质,它已经在 2000 年的下半年震惊了整个安全社群。它就是 格式化字符串漏洞,是一种被发现的新型漏洞,并且会导致一系列的可利用 bug,它们在各种程序中都有发现,从小型工具到大型服务器应用。

  • 问题内容: 这个问题已经在这里有了答案 : Swift中的精确字符串格式说明符 (30个答案) 5年前关闭。 我似乎无法找到一种格式化Double的方法,从而在标签中显示精度时将精度限制为小数点后的几个位置。也许我缺少一些重要的东西,但是我在官方文档中找不到任何东西。 在此先感谢您的帮助! 问题答案: 没有办法使用插值来做到这一点。 您可以在此Apple Dev论坛帖子中找到有关此问题的精彩讨论。

  • 问题内容: 给定s的字典,我试图用每个数字格式化字符串,并对该项目进行复数处理。 样本输入: 样本输出: 它需要使用任意格式的字符串。 我想出的最好的解决方案是一个用于存储两个属性的类,(原始值)和(如果是复数则为字符串,如果不是则为空字符串)。为不同的多元方法分类 然后通过理解和映射制作一个新的: 最后,格式字符串和实现: 输出以下内容: 对于如此毫无疑问的普遍需求,我犹豫不决地使用如此复杂的解

  • 问题内容: 是否可以使用类似于字符串模板功能的高级字符串格式化方法进行部分字符串格式化? 例如: 问题答案: 您可以通过覆盖映射将其欺骗为部分格式: 印刷 当然,此基本实现仅在基本情况下正确运行。

  • 主要内容:指定最小输出宽度,指定对齐方式,指定小数精度我们在《 第一个Python程序——在屏幕上输出文本》中讲到过 print() 函数的用法,这只是最简单最初级的形式,print() 还有很多高级的玩法,比如格式化输出,这就是本节要讲解的内容。 熟悉C语言 printf() 函数的读者能够轻而易举学会 Python print() 函数,它们是非常类似的。 print() 函数使用以 开头的转换说明符对各种类型的数据进行格式化输出,具体请看下表。

  • 静态编程语言有一个很好的特性,称为字符串模板。 但是,是否可以在模板中包含任何格式?例如,我想在 kotlin 的字符串模板中设置 Double 的格式,至少在小数分隔符后设置一个数字: