Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 格式化字符串与连接_Python_String Formatting - Fatal编程技术网

Python 格式化字符串与连接

Python 格式化字符串与连接,python,string-formatting,Python,String Formatting,我看到许多人使用如下格式字符串: root = "sample" output = "output" path = "{}/{}".format(root, output) path = root + '/' + output 而不是像这样简单地连接字符串: root = "sample" output = "output" path = "{}/{}".format(root, output) path = root + '/' + output 格式字符串是否有更好的性能,或者这只是

我看到许多人使用如下格式字符串:

root = "sample"
output = "output"
path = "{}/{}".format(root, output)
path = root + '/' + output
而不是像这样简单地连接字符串:

root = "sample"
output = "output"
path = "{}/{}".format(root, output)
path = root + '/' + output

格式字符串是否有更好的性能,或者这只是为了外观?

它只是为了外观。你一眼就能看出格式是什么。与微优化相比,我们许多人更喜欢可读性

让我们看看IPython的
%timeit
是怎么说的:

Python 3.7.2(默认值,2019年1月3日02:55:40)
IPython 5.8.0
英特尔(R)核心(TM)i5-4590T CPU@2.00GHz
在[1]中:%timeit root=“sample”;output=“output”;path=“{}/{}”。格式(根,输出)
最慢的跑步比最快的跑长12.44倍。这可能意味着正在缓存中间结果。
1000000个循环,最好为5个:每个循环223纳秒
在[2]中:%timeit root=“sample”;output=“output”;路径=根+'/'+输出
最慢的跑步比最快的跑长13.82倍。这可能意味着正在缓存中间结果。
10000000个循环,最好为5个:每个循环101纳秒
在[3]中:%timeit root=“sample”;output=“output”;path=“%s/%s”%(根,输出)
最慢的跑步比最快的跑长27.97倍。这可能意味着正在缓存中间结果。
10000000个循环,最好为5个:每个循环155纳秒
在[4]中:%timeit root=“sample”;output=“output”;path=f“{root}/{output}”
最慢的跑步比最快的跑长19.52倍。这可能意味着正在缓存中间结果。
10000000个循环,最佳5个:每个循环77.8纳秒

与大多数事情一样,性能会有所不同,但请自问“这是否真的很重要,如果速度更快?”。
root+'/'输出
方法快速且易于键入。但是,当您有多个变量要打印时,很难快速读取

foo = "X = " + myX + " | Y = " + someY + " Z = " + Z.toString()
vs


哪个更容易理解发生了什么?除非您真的需要说出性能,否则请选择最容易让人们阅读和理解的方式

字符串格式在绑定数据时不受数据类型的限制。在连接时,我们必须相应地输入cast或转换数据

例如:

a = 10
b = "foo"
c = str(a) + " " + b
print c
> 10 foo
可以通过以下字符串格式完成:

a = 10
b = "foo"
c = "{} {}".format(a, b)
print c
> 10 foo

因此,对于占位符
{}{}
,我们进一步假设两件事,即,在本例中,是
a
b

,用于外观和代码维护。如果使用格式,编辑代码就更容易了。此外,当您使用+时,可能会错过空格等细节。为您和可能的维护人员的利益使用格式。

它不仅仅用于“外观”或强大的词法类型转换;这也是国际化的必要条件

您可以根据选择的语言交换格式字符串


由于源代码中有一长串字符串连接,这实际上是不可能正确完成的。

我同意格式主要用于可读性,但自从3.6中f-strings发布以来,表的性能发生了变化。我还认为f字符串更易于阅读/维护,因为1)它们可以像大多数常规文本一样从左到右读取;2)由于变量在字符串中,因此避免了与间距相关的串联缺点

运行此代码:

from timeit import timeit

runs = 1000000


def print_results(time, start_string):
    print(f'{start_string}\n'
          f'Total: {time:.4f}s\n'
          f'Avg: {(time/runs)*1000000000:.4f}ns\n')


t1 = timeit('"%s, %s" % (greeting, loc)',
            setup='greeting="hello";loc="world"',
            number=runs)
t2 = timeit('f"{greeting}, {loc}"',
            setup='greeting="hello";loc="world"',
            number=runs)
t3 = timeit('greeting + ", " + loc',
            setup='greeting="hello";loc="world"',
            number=runs)
t4 = timeit('"{}, {}".format(greeting, loc)',
            setup='greeting="hello";loc="world"',
            number=runs)

print_results(t1, '% replacement')
print_results(t2, 'f strings')
print_results(t3, 'concatenation')
print_results(t4, '.format method')
在我的计算机上生成此结果:

% replacement
Total: 0.3044s
Avg: 304.3638ns

f strings
Total: 0.0991s
Avg: 99.0777ns

concatenation
Total: 0.1252s
Avg: 125.2442ns

.format method
Total: 0.3483s
Avg: 348.2690ns

上给出了不同问题的类似答案。

从Python 3.6开始,您可以通过在字符串前面加上
f
来完成:

foo = "foo"
bar = "bar"
path = f"{foo}/{bar}"

我猜他们的表现更差。但是我仍然喜欢在非性能关键的地方使用格式字符串。可能重复的注意事项是,自从Python 3.6以来,您可以使用path=“{root}/{output}”,这非常简单…@comte您需要在它前面加一个f,但是是的。这就是我使用
.format
,它避免了诸如
无法连接'str'和'int'对象之类的错误
@Bert有时这是一个缺点-您可能希望从连接中传播
类型错误
。因此,如果改用
.format
,则必须事先添加一些额外的类型检查。所以我认为最好是逐一考虑。我认为f字符串有三个优点:可读性、简洁性(或易于编写)和最优化。我很好奇其他开发者是怎么想的。