我犯了这个错误:
key, value = 'K', 999
msg = (
f"key={key}, "
"value={value}" # needs to be prefixed with f as well
)
# key=K, value={value}
Run Code Online (Sandbox Code Playgroud)
并开始想知道 Python 如何处理复杂的文字连接情况。
我们假设一个字符串是 f 字符串(格式化字符串文字),另一个字符串是普通字符串文字,如上例所示。Python 会在编译时连接这两个字符串吗?如果是,结果是什么?
我遇到了一个我试图理解的奇怪错误。进行一些常规代码清理并将所有字符串格式转换为 f 字符串。这是在 Python 3.6.6 上
此代码不起作用:
from datetime import date
print(f'Updated {date.today().strftime('%m/%d/%Y')}')
File "<stdin>", line 1
print(f'Updated {date.today().strftime('%m/%d/%Y')}')
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
但是,这(功能相同)确实有效:
from datetime import date
d = date.today().strftime('%m/%d/%Y')
print(f'Updated {d}')
Updated 11/12/2018
Run Code Online (Sandbox Code Playgroud)
我觉得我可能遗漏了一些明显的东西,并且第二次迭代很好,但我想了解这里发生了什么。
我正在玩f字符串(请参阅PEP 498),因此我决定检查f字符串解析(例如f“ {1}”)的速度与通常的str解析(例如str(1) ))。但是令我惊讶的是,当我使用timeit函数检查两种方法的速度时,我发现
>>> from timeit import timeit
>>> timeit("f'{1}'")
0.1678762999999961
Run Code Online (Sandbox Code Playgroud)
而
>>> timeit("str(1)")
0.3216999999999999
Run Code Online (Sandbox Code Playgroud)
甚至是repr func,在大多数情况下,它们都比str转换快
>>> timeit("repr(1)")
0.2528296999999995
Run Code Online (Sandbox Code Playgroud)
我不知道为什么呢?我以为f弦在内部调用了str,但是现在,我有点困惑了,有什么想法吗?提前致谢!
PD:就像有人想知道的那样:
assert f"{1}" == str(1) == repr(1)
Run Code Online (Sandbox Code Playgroud) 假设我有两个变量:
>>> a = "hello"
>>> b = "world"
Run Code Online (Sandbox Code Playgroud)
我可以通过两种方式连接它们;使用+:
>>> a = "hello"
>>> b = "world"
Run Code Online (Sandbox Code Playgroud)
或者使用 f 字符串:
>>> a + b
"helloworld"
Run Code Online (Sandbox Code Playgroud)
哪种方式更好或更好的做法?有人告诉我 f-string 在性能和健壮性方面是更好的做法,我想详细了解原因。
我有这个代码
class = "maximum"
s = f"""The code for {class} is {3854-st56}"""
print(s)
Run Code Online (Sandbox Code Playgroud)
我想要这个输出:
>> The code for maximum is {3854-st56}
Run Code Online (Sandbox Code Playgroud)
但 f 字符串无法识别 3854-st56 周围的大括号,而是认为我正在尝试输入实际的 Python 代码。如何使 f 字符串识别大括号是字符串文字。
我需要使用 python 日志模块来记录熊猫数据帧。我需要同等缩进的整个数据框(所有行)。
以下是简单的所需输出:
Test Dataframe Output Below:
col1 col2
0 1 3
1 2 4
Run Code Online (Sandbox Code Playgroud)
但是,我得到以下输出,其中缩进仅应用于数据帧的第一行:
Test Dataframe Output Below:
col1 col2
0 1 3
1 2 4
Run Code Online (Sandbox Code Playgroud)
我正在运行的示例代码是:
import pandas as pd
import logging
# sample dataframe
test_df = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]})
# logging set up
logging.basicConfig(level=logging.INFO)
logging.getLogger().handlers.clear()
c_handler = logging.StreamHandler()
c_handler.setFormatter(logging.Formatter('%(message)s'))
logging.getLogger().addHandler(c_handler)
# log the pandas dataframe to console
logging.info(f'\tTest Dataframe Output Below:')
logging.info(f'\n\t\t{test_df}')
logging.info(f'{test_df}')
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激!
我希望有人已经回答了这个问题,但我已经搜索了这个主题,但找不到答案。
使用 Python3.6+,我想使用 f 字符串将布尔变量格式化为固定宽度。我有结果表,并希望 True 和 False 值的宽度固定,所以我想要一个宽度为五个字符的格式化字符串。以下是有意义的:
print(f"X = {True:5s}")
Run Code Online (Sandbox Code Playgroud)
但是得到:
ValueError: Unknown format code 's' for object of type 'bool'
Run Code Online (Sandbox Code Playgroud)
我知道我可以强制进行字符串转换:
print(f"X = {str(True):5}")
Run Code Online (Sandbox Code Playgroud)
但是,不能使用格式说明符代码似乎很奇怪。是否有一些我缺少的语法变体?我读过PEP498,但它甚至从未提到布尔值。
我对 python 3.7.2 中 f-strings 的这种默认行为感到震惊:
>> number = 0.0000001
>> string = f"Number: {number}"
>> print(string)
Number: 1e-07
Run Code Online (Sandbox Code Playgroud)
我的预期是: Number: 0.0000001
这非常烦人,尤其是对于文件名的创建。如何禁用这种自动转换为科学记数法的功能?为什么首先启用它?
基本上与这个问题相反。
编辑:我想避免为浮动通过设置固定长度,{number:.8f}因为我的数字有不同的长度,我不想有任何尾随零。我想使用 f-strings 自动生成文件名,如下所示:
filename = f"number_{number:.10f}_other_number_{other_number:.10f}.json"
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个简单的修饰符,它可以禁用自动科学记数法,同时保持浮点数的原始精度。
我需要通过他们的 API 将数据推送到网站,并且我正在尝试找到一种使用 F 字符串传递数据列表中的变量的方法,但找不到方法。
到目前为止,这是我尝试过的:
today = datetime.date.today()
tomorrow = today + datetime.timedelta(days = 1)
#trying to pass *tomorrow* value with f-string below
data = f'[{"date": "{tomorrow}", "price": {"amount": 15100}}]'
response = requests.put('https://api.platform.io/calendar/28528204', headers=headers, data=data)
Run Code Online (Sandbox Code Playgroud)
我怎样才能实现这个目标?
我真的很好奇为什么将这个“f”添加到我想要显示的数字的末尾时行为如此不同:
# CASE with f
float1 = 10.1444786
print(f"{float1:.4f}")
# print out: 10.1445
# CASE without f
print(f"{float1:.4}")
# print out: 10.14
Run Code Online (Sandbox Code Playgroud)
为什么在第二个例子中只显示了 2 个字符?
f-string ×10
python ×9
python-3.x ×7
json ×1
list ×1
logging ×1
pandas ×1
performance ×1
python-3.6 ×1
string ×1