为什么在 Python 中将变量插入字符串时使用元组?

Why use tuples when inserting vars into strings in Python?

我觉得以前有人问过这个,但找不到任何东西。

在python中,如果你想在字符串中插入一个变量,有(至少)两种方法。

使用 + 运算符

place = "Alaska"
adjective = "cold"
sentence = "I live in "+place+"! It's very "+adjective+"!"
# "I live in Alaska! It's very cold!"

并使用元组

place = "Houston"
adjective = "humid"
sentence = "I live in %s! It's very %s!" % (place, adjective)
# "I live in Houston! It's very humid!"

为什么要使用元组方法而不是使用 +?元组格式似乎更加混乱。它在某些情况下是否提供优势?

我能想到的唯一优点是你不必用后一种方法进行类型转换,你可以使用%s来引用a,其中a = 42,它只会将其打印为字符串,而不是使用 str(a)。但这似乎并不是牺牲可读性的重要原因。

出于很多原因。一个很好的理由是,您并不总是能够或想要使用分隔的字符串,因为它们已经整齐地排列在列表或元组中:

strings = ["one", "two", "three"]

print "{}, {} and {}".format(*strings)

> one, two and three

string % (value, value, ..) 语法称为 string formatting operation, and you can also apply a dictionary, it is not limited to just tuples. These days you'd actually want to use the newer str.format() method,因为它扩展了所提供的功能。

字符串格式化不仅仅是在其他字符串之间插入字符串。您会使用它,因为

  • 您可以根据要插入字符串的对象类型配置每个插值。您可以配置浮点数的格式、日期的格式(使用str.format())等

  • 您可以调整值的填充或对齐方式;例如,您可以在固定宽度的列中创建所有值都整齐右对齐的列。

  • 尤其是 str.format(),您可以控制的各个方面可以在字符串模板中进行硬编码,或者从其他变量中获取(旧的 % 字符串格式化操作允许字段宽度和数字精度可以动态设置)。

  • 您可以独立定义和存储字符串模板,分别应用您想要插入的值:

    template = 'Hello {name}! How do you find {country} today?'
    result = template.format(**user_information)
    

    可用的字段可能比您在模板中实际使用的字段大。

  • 可以更快;每个 + 字符串连接都必须创建一个新的字符串对象。添加足够多的 + 连接,你最终会创建很多新的字符串对象,然后再次丢弃。字符串格式化只需要创建一个最终输出字符串。

  • 字符串格式实际上比使用连接更易读,也更易于维护。尝试在 多行 字符串上使用 + 或字符串格式,并插入六个不同的值。比较:

    result = '''\
    Hello {firstname}!
    
    I wanted to send you a brief message to inform you of your updated
    scores:
    
        Enemies engaged: {enemies.count:>{width}d}
        Enemies killed:  {enemies.killed:>{width}d}
        Kill ratio:      {enemies.ratio:>{width}.2%}
        Monthly score:   {scores.month_to_date:0{width}d}
    
    Hope you are having a great time!
    
    {additional_promotion}
    '''.format(width=10, **email_info)
    

    result = '''\
    Hello ''' + firstname + '''!
    
    I wanted to send you a brief message to inform you of your updated
    scores:
    
        Enemies engaged: ''' + str(email_info['enemies'].count).rjust(width) + '''
        Enemies killed:  ''' + str(email_info['enemies'].killed).rjust(width) + '''
        Kill ratio:      ''' + str(round(email_info['enemies'].ratio * 100, 2)).rjust(width - 1) + '''%
        Monthly score:   ''' + str(email_info['scores'].month_to_date).zfill(width) + '''
    
    Hope you are having a great time!
    
    ''' + email_info['additional_promotion'] + '''
    '''
    

    现在想象一下必须重新排列字段,添加一些额外的文本和一些新字段。您愿意在第一个还是第二个示例中这样做?