Python f-string、str.format、%s 全方面对比

简介

根据PEP 498,Python从3.6开始支持f-string语法




初试

import datetime

name = 'XerCis'
age = 23
anniversary = datetime.date(1997, 6, 19)
print(f'My name is {name}, my age next year is {age + 1}, my anniversary is {anniversary:%A, %B %d, %Y}.')
print(f'He said his name is {name!r}.')
# My name is XerCis, my age next year is 24, my anniversary is Thursday, June 19, 1997.
# He said his name is 'XerCis'.




对比

便捷性

f-string > str.format() > %s

a = 2
b = 3
print('%d/%d=%f' % (a, b, a / b))  # 2/3=0.666667
print('{}/{}={}'.format(a, b, a / b))  # 2/3=0.6666666666666666
print(f'{a}/{b}={a / b}')  # 2/3=0.6666666666666666
print(f'{a}/{b}={(a / b):.2f}')  # 2/3=0.67

速度

f-string > str.format() > %s

import timeit

a = 1
print(timeit.timeit('%d' % a, number=10 ** 8))  # 1.171477
print(timeit.timeit('{}'.format(a), number=10 ** 8))  # 1.029289
print(timeit.timeit(f'{a}', number=10 ** 8))  # 0.926162

功能

f-string > str.format() > %s

兼容性

%s > str.format()(Python 2.6+) > f-string(Python 3.6+)




f-string格式符

f-string格式符

格式符功能
!s调用str()
!r调用repr()
!a调用ascii()
:.2f浮点数精度
:%百分数
:.2%保留两位的百分数
:,千位分隔数字
:.2e科学记数法

进制转换
在这里插入图片描述
字符串填充
在这里插入图片描述
打印时间
在这里插入图片描述

import datetime

now = datetime.datetime.now()
ten_days_ago = now - datetime.timedelta(days=10)
print(f'{ten_days_ago:%Y-%m-%d %H:%M:%S}')
print(f'{now:%Y-%m-%d %H:%M:%S}')
# 2020-11-01 12:00:00
# 2020-11-11 12:00:00

更多格式符查看对应数据结构的格式符。

注意:不允许有反斜杠!!!

# print(f"newline: {ord('\n')}")  # raises SyntaxError
newline = ord('\n')
print(f"newline: {newline}")




Python 3.8 更强大功能

=,自动记录表达式,便于调试

示例1

from datetime import date

user = 'eric_idle'
member_since = date(1975, 7, 31)
print(f'{user=} {member_since=}')
# user='eric_idle' member_since=datetime.date(1975, 7, 31)

示例2

from datetime import datetime

today = datetime(year=2017, month=1, day=27)
print(f'{today=:%B %d, %Y}')
# today=January 27, 2017

推荐使用:

Python3.8 在线工具




对齐输出

import random

for _ in range(10):
    a = ''.join(chr(random.randint(65, 122)) for _ in range(random.randint(1, 10)))
    b = ''.join(chr(random.randint(65, 122)) for _ in range(random.randint(1, 10)))
    print(f'{a.ljust(50)} : {b.rjust(50)}')
# HdsrEuCCc                                          :                                                 ]Q
# g^SYe_l                                            :                                                Ipn
# bX_HkmGL^                                          :                                                  L
# XZlO]                                              :                                            ryWmKmQ
# rDx                                                :                                                cuD
# cM^a[                                              :                                                 LV
# kNBm                                               :                                                  z
# H]MgL_usD                                          :                                             LMdFiK
# K                                                  :                                                mFJ
# NMFN                                               :                                              eeyR[




总结

f-string不允许用反斜杠,在需要换行、制表符时不适用,str.format()较为通用




参考文献

  1. PEP 498 – Literal String Interpolation
  2. 格式化字符串
  3. Python3.6中的字符串格式化
  4. Python 3.8 有什么新变化
  5. f-string格式说明符
  6. 这有 73 个例子,彻底掌握 f-string 用法!
  7. Python 3’s f-Strings: An Improved String Formatting Syntax
  8. Python f-string - formatting strings in Python
  9. python 输出对齐
  10. python中chr()与ord()用法,及Unicode编码常用十进制范围
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XerCis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值