在Python中使用逗号、连接和字符串格式化的区别

29

我正在自学Python(2.7版本)。 我已经学会了以下在打印中将字符串和变量结合在一起的方法:

x = "Hello"
y = "World"

使用逗号:

print "I am printing" , x, y  # I know that using comma gives automatic space

通过使用串联:

print "I am printing" + " " + x + " " + y 
通过使用字符串格式化程序
print "I am printing %s %s" % (x, y) 
在这种情况下,它们都打印出相同的内容。
I am printing Hello World

这三者之间有什么区别,是否有特定情况下优先使用其中一种?

2个回答

47

首先回答一般性问题,您通常会使用打印功能在脚本中将信息输出到屏幕上,以确保您得到了预期的结果。

随着代码变得更加复杂,您可能会发现记录日志比打印更好,但这是另一个答案的信息。

打印和Python解释器中交互会话中回显的返回值表示之间有很大的区别。打印应该打印到标准输出。表达式的返回值的回显表示(如果不是None,则会在Python shell中显示),当在等效的脚本代码中运行时,将保持沉默。

1. 打印

在Python 2中,我们有打印语句。在Python 3中,我们得到了一个打印函数,我们也可以在Python 2中使用它。

逗号分隔的打印语句 (Python 2)

使用逗号分隔项的打印语句,使用空格将它们分开。尾部逗号将导致附加另一个空格。没有尾部逗号将导致一个换行符被附加到您要打印的项后面。

您可以将每个项放在单独的打印语句中,并在每个项后面使用逗号,它们将打印相同的内容,在同一行上。

例如(这仅适用于脚本,在交互式shell中,您会在每一行后面得到一个新提示符):

x = "Hello"
y = "World"

print "I am printing",
print x,
print y 

将输出:

I am printing Hello World

打印函数

Python 3中内置了print函数,也可以在Python 2.6和2.7中通过以下导入使用:

from __future__ import print_function

你可以声明分隔符和结束符,这使得我们拥有更多的灵活性:

>>> print('hello', 'world', sep='-', end='\n****\n')
hello-world
****
>>>
默认值为' '(用于分隔)和'\n'(用于结束):
>>> print('hello', 'world')
hello world
>>> 

2. 字符串拼接

拼接会在内存中创建每个字符串,然后将它们在其末尾合并成一个新的字符串(这可能不太友好),然后同时将它们打印到输出。当你需要将其他地方构造的字符串连接在一起时,这很有用。

print('hello' + '-' + 'world')

会打印出来

hello-world

在尝试将其他类型的文字直接加入字符串之前,请先将这些文字转换为字符串。

print('here is a number: ' + str(2))

打印

here is a number: 2

如果您尝试将整数连接起来而不先将其强制转换为字符串:

>>> print('here is a number: ' + 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects

这应该证明你只应该尝试连接已知为字符串的变量。下一个演示的新格式处理了此问题。

3. 字符串插值

你正在展示的格式化是从C中借鉴的旧式字符串插值方式。它采用旧字符串并一次创建新字符串。它的功能非常简单直接。当您需要构建相当大的模板时(在3行以上和3个以上的变量时,绝对应该使用此方法)时,您应该使用它。

现在的做法是这样的(使用参数的索引):

print('I am printing {0} and {1}'.format(x, y))

或者在Python 2.7或3中(使用隐含索引):

print('I am printing {} and {}'.format(x, y))

或者使用命名参数(这在语义上很容易理解,但代码看起来不太符合DRY原则(即不要重复自己))

print('I am printing {x} and {y}'.format(x=x, y=y))

相对于未在此处演示的%样式格式化,这种方法最大的好处是可以将位置和关键字参数组合在一起。

print('I am printing {0} and {y}'.format(x, y=y))

Python 3.6中的新特性:格式化字面量

Python 3.6将引入格式化字面量,具有更优雅的语法(减少了冗余)。简单的语法看起来像这样:

print(f'I am printing {x} and {y}')

格式化字面量实际上可以在原地执行代码:

>>> print(f'I am printing {"hello".capitalize()} and {"Wo" + "rld"}')
I am printing Hello and World

字符串插值是指它获取旧字符串,然后通过替换格式函数的参数来扩展它以生成新字符串吗?我的理解正确吗? - Pooja
@Pooja,是的,它会用迷你语言中指定的规则替换括号中的所有内容,并进行参数格式化。如果您要将其用于格式化表格数据、数字等,请查阅以下链接:http://docs.python.org/2/library/string.html#formatspec - Russia Must Remove Putin
你应该提到str.join(),并且它对于大量小字符串的连接比拼接更高效。 - Kevin

0

你应该建立一个列表,并使用分隔符进行连接,例如",".join(list_name)


8
为什么使用 join 构建字符串会更好?例如,是否存在性能优势? - Mike Zavarello

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接