在 Python 中生成字符串有 3 种方式,现在比较建议的是使用 f-str 的方式,官方说性能更加好。本文主要
介绍在格式化时有哪些格式可以选择。
String
%
a = 42
b = "%d" % a
c = "answer to everything"
d = "%s %s" % (b, c)
format
a = "{} {}"
b = 1
c = 2
d = a.format(b, c)
a = "{bb} {cc}"
d = a.format(bb=b, cc=c)
person = {"first": "zhang", "last": "san"}
d = "{p[first]}-{p[last]}".format(p=person)
a = "{1} {0}"
d = a.format(b, c) # 交换位置
f-str
基本上所有的 format 支持得做法 f-str 都是支持的。这里展开介绍下具体的格式。
进制转化
a = 13
print(f"{a:o}")
print(f"{a:b}")
print(f"{a:x}")
print(f"{a:d}")
b = 88.3998128733
print(f"{b:.4f}")
print(f"{b:.4e}") # 科学技术法
对齐
a = 13
print(f"{a:04}") # 默认填充左边
# 自定义填充字符
print(f"{a:_>04}") # 填充左边
print(f"{a:_<04}") # 填充右边
print(f"{a:_^04}") # 填充左右
benchmark
python -m timeit "a=1;b=f'{a}'"
# 2000000 loops, best of 5: 102 nsec per loop
python -m timeit "a=1;b='{a}'.format(a=a)"
# 1000000 loops, best of 5: 336 nsec per loop
可以看出 f-str 比 format 的性能还是高不少。
time format
from datetime import datetime as dt
now = dt.now()
format = "%Y-%m-%d %H:%M:%S %a"
print(now.strftime(format))
| Code | Example | Description | |
|---|---|---|---|
| %a | Sun | Weekday as locale’s abbreviated name. | |
| %A | Sunday | Weekday as locale’s full name. | |
| %w | 0 | Weekday as a decimal number, where 0 is Sunday and 6 is Saturday. | |
| %d | 08 | Day of the month as a zero-padded decimal number. | |
| %- | 8 | Day of the month as a decimal number. (Platform specific) | |
| %b | Sep | Month as locale’s abbreviated name. | |
| %B | September | Month as locale’s full name. | |
| %m | 09 | Month as a zero-padded decimal number. | |
| %- | 9 | Month as a decimal number. (Platform specific) | |
| %y | 13 | Year without century as a zero-padded decimal number. | |
| %Y | 2013 | Year with century as a decimal number. | |
| %H | 07 | Hour (24-hour clock) as a zero-padded decimal number. | |
| %-H | 7 | Hour (24-hour clock) as a decimal number. (Platform specific) | |
| %I | 07 | Hour (12-hour clock) as a zero-padded decimal number. | |
| %- | 7 | Hour (12-hour clock) as a decimal number. (Platform specific) | |
| %p | AM | Locale’s equivalent of either AM or PM. | |
| %M | 06 | Minute as a zero-padded decimal number. | |
| %-M | 6 | Minute as a decimal number. (Platform specific) | |
| %S | 05 | Second as a zero-padded decimal number. | |
| %-S | 5 | Second as a decimal number. (Platform specific) | |
| %f | 000000 | Microsecond as a decimal number, zero-padded on the left. | |
| %z | +0000 | UTC offset in the form ±HHMM[SS[.ffffff]] (empty string if the object is naive). | |
| %Z | UTC | Time zone name (empty string if the object is naive). | |
| %j | 251 | Day of the year as a zero-padded decimal number. | |
| %-j | 251 | Day of the year as a decimal number. (Platform specific) | |
| %U | 36 | Week number of the year (Sunday as the first day of the week) as a zero padded decimal number. All days in a new year preceding the first Sunday are considered to be in week 0. | |
| %W | 35 | Week number of the year (Monday as the first day of the week) as a decimal number. All days in a new year preceding the first Monday are considered to be in week 0. | |
| %c | Sun Sep 8 07:06:05 2013 Locale’s appropriate date and time representation. | ||
| %x | 09/08/13 | Locale’s appropriate date representation. | |
| %X | 07:06:05 | Locale’s appropriate time representation. | |
| %% | % | A literal ‘%’ character. |