为什么在 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'] + '''
'''
现在想象一下必须重新排列字段,添加一些额外的文本和一些新字段。您愿意在第一个还是第二个示例中这样做?
我觉得以前有人问过这个,但找不到任何东西。
在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'] + ''' '''
现在想象一下必须重新排列字段,添加一些额外的文本和一些新字段。您愿意在第一个还是第二个示例中这样做?