标签: f-string

使用f-strings修正十进制后的数字

Python f字符串(PEP 498)有一个简单的方法来修复小数点后的位数吗?(特别是f-strings,而不是其他字符串格式化选项,如.format或%)

例如,假设我想在小数位后面显示2位数.

我怎么做?

a = 10.1234

f'{a:.2}'
Out[2]: '1e+01'

f'{a:.4}'
Out[3]: '10.12'

a = 100.1234

f'{a:.4}'
Out[5]: '100.1'
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,"精度"已经改变了"小数点后的位数"的含义,就像使用%格式时的情况一样,只是总数.无论我有多大的数字,我怎么能总是得到小数点后的2位数?

python python-3.x f-string

218
推荐指数
7
解决办法
7万
查看次数

为什么 f'{{{74}}}' 与 f'{{74}}' 与 f-Strings 相同?

f-Strings在 Python 3.6 中可用,对于格式化字符串非常有用:

>>> n='you'
>>> f'hello {n}, how are you?'
'hello you, how are you?'
Run Code Online (Sandbox Code Playgroud)

Python 3 的 f-Strings: An Improvement String Formatting Syntax (Guide) 中阅读更多关于它们的信息。我发现了一个有趣的模式:

请注意,使用三个大括号将导致您的字符串中只有一个大括号:

>>> f"{{{74}}}"
'{74}'
Run Code Online (Sandbox Code Playgroud)

但是,如果您使用三个以上的大括号,您可以获得更多的大括号来显示:

>>> f"{{{{74}}}}"
'{{74}}'
Run Code Online (Sandbox Code Playgroud)

情况正是如此:

>>> f'{74}'
'74'

>>> f'{{74}}'
'{74}'
Run Code Online (Sandbox Code Playgroud)

现在如果我们从二{传到三,结果是一样的:

>>> f'{{{74}}}'
'{74}'           # same as f'{{74}}' !
Run Code Online (Sandbox Code Playgroud)

所以我们最多需要4个!( {{{{) 得到两个大括号作为输出:

>>> f'{{{{74}}}}'
'{{74}}'
Run Code Online (Sandbox Code Playgroud)

为什么是这样?从那一刻起,用两个大括号让 Python 需要一个额外的大括号会发生什么?

python string formatting python-3.x f-string

111
推荐指数
1
解决办法
4089
查看次数

f 字符串表示与 str() 不同

我一直认为 f 字符串会调用该__str__方法。也就是说,f'{x}'始终与 相同str(x)。然而,有了这个班级

class Thing(enum.IntEnum):
    A = 0
Run Code Online (Sandbox Code Playgroud)

f'{Thing.A}''0'str(Thing.A)'Thing.A'enum.Enum如果我用作基类,此示例将不起作用。

f 字符串调用什么功能?

python enums f-string

73
推荐指数
2
解决办法
8846
查看次数

我可以推迟/推迟对f字符串的评估吗?

我正在使用模板字符串来生成一些文件,我喜欢为此目的的新f字符串的简洁性,以减少我之前的模板代码,如下所示:

template_a = "The current name is {name}"
names = ["foo", "bar"]
for name in names:
    print (template_a.format(**locals()))
Run Code Online (Sandbox Code Playgroud)

现在我可以这样做,直接替换变量:

names = ["foo", "bar"]
for name in names:
    print (f"The current name is {name}")
Run Code Online (Sandbox Code Playgroud)

但是,有时在其他地方定义模板是有意义的 - 在代码中更高,或从文件或其他东西导入.这意味着模板是一个带有格式标签的静态字符串.必须在字符串上发生一些事情,告诉解释器将字符串解释为新的f字符串,但我不知道是否有这样的事情.

有没有办法引入一个字符串并将其解释为f字符串以避免使用该.format(**locals())调用?

理想情况下,我希望能够像这样编码......(magic_fstring_function我不理解的部分在哪里进来):

template_a = f"The current name is {name}"
# OR [Ideal2] template_a = magic_fstring_function(open('template.txt').read())
names = ["foo", "bar"]
for name in names:
    print (template_a)
Run Code Online (Sandbox Code Playgroud)

...使用此期望的输出(不读取文件两次):

The current name is foo
The current name is bar
Run Code Online (Sandbox Code Playgroud)

...但我得到的实际输出是:

The current …
Run Code Online (Sandbox Code Playgroud)

python string-interpolation python-3.x python-3.6 f-string

59
推荐指数
10
解决办法
7256
查看次数

如何在f-string中使用换行符'\n'来格式化Python 3.6中的输出?

我想知道如何使用f-strings以Pythonic方式格式化这种情况:

names = ['Adam', 'Bob', 'Cyril']
text = f"Winners are:\n{'\n'.join(names)}"
print(text)
Run Code Online (Sandbox Code Playgroud)

问题是'\'不能在f-string中使用.预期产量:

Winners are:
Adam
Bob
Cyril
Run Code Online (Sandbox Code Playgroud)

python newline python-3.x python-3.6 f-string

57
推荐指数
5
解决办法
3万
查看次数

python-3.6中带有'f'前缀的字符串

我正在尝试使用Python 3.6.通过新代码,我偶然发现了这个新语法:

f"My formatting string!"
Run Code Online (Sandbox Code Playgroud)

看来我们可以这样做:

>>> name = "George"
>>> print(f"My cool string is called {name}.")
My cool string is called George.
Run Code Online (Sandbox Code Playgroud)

任何人都可以对这个内部运作有所了解吗?特别是f前缀字符串可以采用的变量范围是多少?

python scope string-formatting python-3.6 f-string

52
推荐指数
3
解决办法
2万
查看次数

嵌套的f字符串

感谢David Beazley的推文,我最近发现新的Python 3.6 f字符串也可以嵌套:

>>> price = 478.23
>>> f"{f'${price:0.2f}':*>20s}"
'*************$478.23'
Run Code Online (Sandbox Code Playgroud)

要么:

>>> x = 42
>>> f'''-{f"""*{f"+{f'.{x}.'}+"}*"""}-'''
'-*+.42.+*-'
Run Code Online (Sandbox Code Playgroud)

虽然我很惊讶这是可能的,但我很遗憾这是多么实际,何时嵌套f字符串是有用的?这可以涵盖哪些用例?

注意:PEP本身没有提到嵌套f字符串,但是有一个特定的测试用例.

python string-formatting python-3.x python-3.6 f-string

44
推荐指数
6
解决办法
8765
查看次数

结合 f 字符串和原始字符串文字

我想知道如何在使用 f-string 的同时r获取原始字符串文字。我目前有它如下但想要允许任何名称替换的选项Alex我正在考虑添加一个 f 字符串,然后用Alex花括号替换并将用户名放在里面,但这不适用于r.

username = input('Enter name')
download_folder = r'C:\Users\Alex\Downloads'
Run Code Online (Sandbox Code Playgroud)

python python-3.x f-string

44
推荐指数
3
解决办法
2万
查看次数

如何在python 3.6中转义f字符串?

我有一个字符串,我想要花括号,但也利用f字符串功能.是否有一些适用于此的语法?

这有两种方法不起作用.我想将文字文本" {bar}"包含在字符串中.

foo = "test"
fstring = f"{foo} {bar}"
Run Code Online (Sandbox Code Playgroud)

NameError:未定义名称"bar"

fstring = f"{foo} \{bar\}"
Run Code Online (Sandbox Code Playgroud)

SyntaxError:f-string表达式部分不能包含反斜杠

期望的结果:

'test {bar}'
Run Code Online (Sandbox Code Playgroud)

编辑:看起来这个问题有相同的答案如何在python字符串中打印文字大括号字符,并使用.format吗?,但你只能知道,如果你知道格式函数使用与f字符串相同的规则.所以希望这个问题对于将f-string搜索者与这个答案联系起来是有价值的.

python python-3.6 f-string

41
推荐指数
1
解决办法
2万
查看次数

我可以将Python的3.6格式的字符串文字(f字符串)导入旧的3.x,2.x Python吗?

新的Python 3.6 f-strings对我来说似乎是一个巨大的字符串可用性,我希望能够全心全意地采用它们,这些新项目可能会运行在旧的解释器上.2.7,3.3-3.5支持会很棒,但至少我想在Python 3.5代码库中使用它们.如何导入3.6的格式化字符串文字以供旧解释器使用?

我理解格式化的字符串文字f"Foo is {age} {units} old"不会破坏更改,因此不会包含在from __future__ import ...调用中.但是这个改变没有后端移植(AFAIK)我需要确保无论用f-strings写的任何新代码都是在Python 3.6+上运行的,这对许多项目都是一个破坏性的.

python string f-string

38
推荐指数
4
解决办法
2万
查看次数