Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.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 f字符串与字符串格式()_Python_Python 3.x_String Formatting_String Interpolation_F String - Fatal编程技术网

Python f字符串与字符串格式()

Python f字符串与字符串格式(),python,python-3.x,string-formatting,string-interpolation,f-string,Python,Python 3.x,String Formatting,String Interpolation,F String,在我的Python 3.5项目中,我经常使用.format(),但是我担心在下一个Python版本中它会被弃用,因为f-strings是一种新的字符串文字 >>> name = "Test" >>> f"My app name is {name}." 'My app name is Test.' 格式化字符串功能是否完全取代了旧的.format()?从现在起,在所有情况下使用新样式会更好吗 我知道这是基于“简单胜于复杂

在我的Python 3.5项目中,我经常使用
.format()
,但是我担心在下一个Python版本中它会被弃用,因为f-strings是一种新的字符串文字

>>> name = "Test"
>>> f"My app name is {name}."
'My app name is Test.'
格式化字符串功能是否完全取代了旧的
.format()
?从现在起,在所有情况下使用新样式会更好吗

我知道这是基于“简单胜于复杂”的理念。但是,性能问题又如何呢;他们之间有什么区别吗?或者它只是相同功能的简单外观

我担心在下一个Python版本中它会被弃用

不要担心,
str.format
不会马上离开(也没有理由),引入
f
前缀字符串的政治公众人物甚至:

此PEP不建议删除或弃用任何现有的字符串格式设置机制

引入格式化字符串是为了解决其他格式化字符串方法的一些缺点;不要抛弃旧的方法,如果他们想让自己的代码为Python3.6+工作,就强迫有多少项目使用f-string


至于这些字符串的性能,我最初的猜测似乎是错误的,因为f字符串似乎很容易比它们的

➜ cpython git:(master) ./python -m timeit -s "a = 'test'" "f'formatting a string {a}'"
500000 loops, best of 5: 628 nsec per loop
➜ cpython git:(master) ./python -m timeit "'formatting a string {a}'.format(a='test')"
100000 loops, best of 5: 2.03 usec per loop
在撰写本文时,这些都是针对CPython存储库的主分支进行的;它们肯定会发生变化:

  • f-strings
    ,作为一项新功能,可能有可能进行优化
  • 对CPython的优化可能会使
    .format
    更快(例如)
但实际上,不要太担心速度,要担心什么对你和其他人来说更容易阅读


在许多情况下,这将是
f-strings
,但是
格式
更好

为了基于Jim的答案并解决您的性能问题,我使用python的
dis
模块来比较两个语法不同但功能相同的函数的字节码指令

import dis

def f1():
    a = "test"
    return f"{a}"

def f2():
    return "{a}".format(a='test')

print(dis.dis(f1))
print(dis.dis(f2))
其结果是:

11 0 LOAD_CONST 1 ('test') 2 STORE_FAST 0 (a) 12 4 LOAD_FAST 0 (a) 6 FORMAT_VALUE 0 8 RETURN_VALUE None 15 0 LOAD_CONST 1 ('{a}') 2 LOAD_ATTR 0 (format) 4 LOAD_CONST 2 ('test') 6 LOAD_CONST 3 (('a',)) 8 CALL_FUNCTION_KW 1 10 RETURN_VALUE None
有一件事并没有提到,这使得对旧技术的反对变得不可能,那个就是插值只适用于字符串文本。也就是说,字符串在运行时呈现一次,模板不能与更新的变量一起再次使用。例如,您可以:

>>> str_template = '{i} squared: {n}'
>>> for i in range(2, 5):
...     print(str_template.format(i=i, n=i**2))
... 
2 squared: 4
3 squared: 9
4 squared: 16

另一种情况是,在何处使用。如果没有旧的技术,许多用例将是不可能的。喜欢字符串插值,但它并不适用于所有用例,即需要可重用模板的地方。

如果您想继续支持python 3.5,可以使用
fstring

from fstring import fstring

x = 1

y = 2.0

plus_result = "3.0"

print fstring("{x}+{y}={plus_result}")

# Prints: 1+2.0=3.0
pip安装fstring

from fstring import fstring

x = 1

y = 2.0

plus_result = "3.0"

print fstring("{x}+{y}={plus_result}")

# Prints: 1+2.0=3.0
我怀疑str.format()会被弃用,因为这将是现有项目的噩梦。话虽如此

string = f'This is a {object}'
阅读比阅读容易

string = 'This is a {}'.format(object)

所以我建议尽可能使用f字符串。

等一下,谁说
.format()
会贬值?我怀疑没有人,我同意。我想知道的一件事。。在Python3首次发布后,社区从中学到了在新版本中引入破坏兼容性的更改是多么痛苦,我不认为他们会轻易地再次重复这一决定。也许1983年Python 4问世时…@凯文,谢谢。我希望如此。如果你想了解该功能背后的原因的完整版本,可能值得一读。那么性能改进呢?内部实现有什么不同吗?@nivhanin和Jim,我做了一个简短的速度调查,但是仔细研究一下源代码会很有趣,我敢打赌他们之间实际上共享了很多代码,即使
dis
产生的字节码相对不同。如果让我猜猜,随着字符串变长,格式规则变得更加复杂,两者之间的差异将会缩小,这是一个很好的观点。我想看看这里公布的结果;)我发现您的速度比较很有趣,因为在我的机器(Anaconda的Python 3.6.2)上有很大的不同:fstring版本需要0.0845usec,而format版本需要0.555usec。所以当你看到因子3时,我看到因子6。奇怪。使用
.format
不是更好吗?此
fstring
不是python 3.6 f-strings的直接端口,不支持formatting@Aaron这个dis到底是做什么的?也;你是如何从印刷文本中获得这些信息的?@Vicrobot
dis
是反汇编的缩写。它接受编译函数的字节码,并将python虚拟机指令(二进制数据)解码为人类可读的字。python虚拟机是一个虚拟机,所以所有的“LOAD”和“STORE”命令都是指从堆栈中推拉数据。有关
dis
库的更多信息,请参见