当前位置: 代码网 > it编程>前端脚本>Python > Python字符串格式化之f-string高效用法详解

Python字符串格式化之f-string高效用法详解

2026年09月16日 Python 我要评论
一、开篇:python字符串格式化的终极形态前面两篇文章我们分别学习了百分号 % 格式化和 str.format() 方法。今天终于迎来了python字符串格式化的"终极形态"&m

一、开篇:python字符串格式化的终极形态

前面两篇文章我们分别学习了百分号 % 格式化和 str.format() 方法。今天终于迎来了python字符串格式化的"终极形态"——f-string

f-string(格式化字符串字面量,formatted string literals)是python 3.6引入的特性,它在字符串前加一个 ff,让你直接在花括号中嵌入表达式。f-string不仅是三种方式中最好写的,也是运行速度最快的。

如果说百分号是老黄牛,format()是可靠的工作马,那f-string就是一匹骏马——快、优雅、让人愉悦。

二、f-string 基础

2.1 基本语法

# 在字符串前加 f 或 f
name = '小明'
age = 25
print(f'我叫{name},今年{age}岁')
# 我叫小明,今年25岁

# 花括号内可以是任意表达式
print(f'1 + 1 = {1 + 1}')
print(f'明年我就{age + 1}岁了')
print(f'我的名字有{len(name)}个字')
print(f'是否成年:{"是" if age >= 18 else "否"}')

2.2 花括号内的内容

# 花括号内可以是:变量、表达式、函数调用、方法调用

# 函数调用
print(f'绝对值:{abs(-42)}')
print(f'最大值:{max(1, 5, 3, 9, 2)}')

# 方法调用
text = 'hello world'
print(f'大写:{text.upper()}')
print(f'单词数:{len(text.split())}')

# 列表操作
fruits = ['苹果', '香蕉', '橘子']
print(f'第一个:{fruits[0]}')
print(f'总共{fruits.count("苹果")}个苹果')

# 字典操作
person = {'name': '小明', 'age': 25}
print(f'{person["name"]}今年{person["age"]}岁')

# 三目表达式
score = 85
print(f'等级:{"优秀" if score >= 90 else "良好" if score >= 80 else "及格"}')

2.3 多行f-string

name = '小明'
age = 25
city = '北京'

# 多行f-string(使用三引号)
info = f"""
个人信息:
  姓名:{name}
  年龄:{age}
  城市:{city}
  简介:{name}是一个{age}岁的年轻人,来自{city}。
"""
print(info)

# 或者用括号拼接多行
message = (
    f'姓名:{name},'
    f'年龄:{age},'
    f'城市:{city}'
)
print(message)

三、f-string 中的格式化

3.1 数字格式化

f-string直接继承了format()的格式化语法:

pi = 3.141592653589793
big_number = 1234567890
percent = 0.8567

# 小数位数
print(f'{pi:.2f}')          # 3.14
print(f'{pi:.4f}')          # 3.1416

# 宽度和对齐
print(f'{"标题":*^20}')      # ********标题********
print(f'{"左对齐":<10}')     # 左对齐
print(f'{"右对齐":>10}')     # 右对齐

# 千分位
print(f'{big_number:,}')     # 1,234,567,890

# 百分比
print(f'{percent:.1%}')      # 85.7%
print(f'{percent:.2%}')      # 85.67%

# 进制转换
value = 255
print(f'{value:b}')          # 11111111(二进制)
print(f'{value:#x}')         # 0xff(十六进制带前缀)
print(f'{value:#06x}')       # 0x00ff(带前缀和补零)
print(f'{value:x}')          # ff(大写)

# 科学计数法
print(f'{pi:.2e}')           # 3.14e+00

# 补零
print(f'{42:05d}')           # 00042
print(f'{42:0>8d}')          # 00000042

3.2 日期时间格式化

from datetime import datetime

now = datetime.now()

# 直接在f-string中格式化
print(f'{now:%y-%m-%d %h:%m:%s}')
print(f'{now:%y年%m月%d日}')
print(f'{now:%a}')

# 常用日期格式
print(f'日期:{now:%y-%m-%d}')
print(f'时间:{now:%h:%m:%s}')
print(f'完整:{now:%y-%m-%d %h:%m:%s}')
print(f'文件名友好:{now:%y%m%d_%h%m%s}')

3.3 对象字符串表示

class person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return f'{self.name}({self.age}岁)'

    def __repr__(self):
        return f'person(name="{self.name}", age={self.age})'

p = person('小明', 25)

# f-string中调用str和repr
print(f'{p}')        # 小明(25岁) —— 调用__str__
print(f'{p!r}')      # person(name="小明", age=25) —— 调用__repr__
print(f'{p!s}')      # 小明(25岁) —— 显式调用__str__

# !r 在调试时非常有用
value = 'hello\nworld'
print(f'str: {value}')
print(f'repr: {value!r}')

四、f-string调试利器:{变量=}

4.1 python 3.8+ 的宝藏功能

这是我最喜欢的f-string特性之一。在花括号中变量名后加 =,能同时输出变量名和值:

name = '小明'
age = 25
score = 95.5

# 加 = 号自动显示变量名和值
print(f'{name=}')       # name='小明'
print(f'{age=}')        # age=25
print(f'{score=}')      # score=95.5

# 多个变量一起输出
print(f'{name=} {age=} {score=}')
# name='小明' age=25 score=95.5

# 配合表达式
print(f'{age + 10=}')   # age + 10=35
print(f'{name.upper()=}')  # name.upper()='小明'

# 配合格式化
print(f'{score=:.1f}')  # score=95.5
print(f'{name=:>10}')   # name=        小明

💡 {x=} 在调试时非常好用——一行代码就能输出变量值和表达式计算结果,不用写 f'x={x}' 这样的重复代码。

4.2 调试实战

def calculate_discount(price, user_level, coupon_rate=0):
    """计算商品折扣价"""
    if user_level == 'vip':
        discount = 0.2
    elif user_level == 'normal':
        discount = 0.1
    else:
        discount = 0

    discount += coupon_rate
    final_price = price * (1 - discount)

    # 一行搞定所有调试输出
    print(f'{price=} {user_level=} {coupon_rate=} {discount=} {final_price=}')

    return final_price


calculate_discount(100, 'vip', 0.05)
# price=100 user_level='vip' coupon_rate=0.05 discount=0.25 final_price=75.0

五、花括号内的表达式限制

5.1 不能包含反斜杠

# ❌ f-string花括号内不能有反斜杠
# print(f'{"hello\nworld"}')  # syntaxerror

# ✅ 解决方法:用变量
text = 'hello\nworld'
print(f'{text}')

# ❌ 不能有注释
# print(f'{x # 这是x的值}')  # syntaxerror

5.2 引号冲突

# f-string使用双引号,花括号内可以用单引号
print(f"我叫{'小明'}")

# f-string使用单引号,花括号内可以用双引号
print(f'他叫{"小红"}')

# ❌ 引号冲突
# print(f'我是{'小明'}')  # syntaxerror

# ✅ 或使用三引号
print(f'''{'多种引号混合' "没有问题"}''')

5.3 花括号嵌套

# 在某些复杂格式场景中可能需要嵌套花括号
# 这在format()中容易实现,但在f-string中比较复杂

# 如果需要动态指定格式宽度
width = 10
precision = 3
value = 3.14159

# f-string中可以用嵌套表达式
print(f'{value:{width}.{precision}f}')  # '     3.142'

# 但这在f-string中不够直观,复杂场景可以考虑format()

六、f-string 的性能

import time

name = '小明'
age = 25

# f-string —— 最快(编译时完成)
start = time.perf_counter()
for _ in range(1000000):
    result = f'{name}今年{age}岁'
elapsed_f = time.perf_counter() - start
print(f'f-string: {elapsed_f:.3f}秒')

# format() —— 最慢(运行时解析)
start = time.perf_counter()
for _ in range(1000000):
    result = '{}今年{}岁'.format(name, age)
elapsed_format = time.perf_counter() - start
print(f'format(): {elapsed_format:.3f}秒')

# % 格式化 —— 中等
start = time.perf_counter()
for _ in range(1000000):
    result = '%s今年%d岁' % (name, age)
elapsed_pct = time.perf_counter() - start
print(f'% 格式化: {elapsed_pct:.3f}秒')

💡 f-string之所以最快,是因为它在编译时就将字符串"组装"好了。而format()和%格式化需要在运行时解析。

七、三种格式化方式的对比总结

name = '小明'
age = 25
score = 95.5
item = {'name': 'python书', 'price': 59.9}

# ===== 基本使用 =====
# 百分号 %
s1 = '我是%s,今年%d岁,成绩%.1f分' % (name, age, score)

# format()
s2 = '我是{},今年{}岁,成绩{:.1f}分'.format(name, age, score)

# f-string(推荐,最简洁)
s3 = f'我是{name},今年{age}岁,成绩{score:.1f}分'

# ===== 字典访问 =====
# 百分号 %
s4 = '%(name)s的价格是%(price).2f元' % item

# format()
s5 = '{name}的价格是{price:.2f}元'.format(**item)

# f-string
s6 = f'{item["name"]}的价格是{item["price"]:.2f}元'

# ===== 模板复用 =====
# 百分号 % ✓
# format() ✓
# f-string ✗(需要 lambda 或函数包装)
template = '你好,{name}!'
greet = lambda name: f'你好,{name}!'
维度% 格式化format()f-string
python版本所有2.6+3.6+
简洁度⭐⭐⭐⭐⭐⭐⭐⭐⭐
速度⭐⭐⭐⭐⭐⭐⭐⭐⭐
表达式支持
模板复用❌(需lambda)
调试友好⭐⭐⭐⭐⭐⭐⭐⭐

八、实战:用f-string高效生成各种格式

from datetime import datetime
from decimal import decimal

# 生成json
def to_json_like(name, age, skills):
    """用f-string生成json格式(生产环境请用json模块!)"""
    skills_str = ', '.join(f'"{skill}"' for skill in skills)
    return f'{{"name": "{name}", "age": {age}, "skills": [{skills_str}]}}'

print(to_json_like('小明', 25, ['python', 'java', 'go']))

# 生成html列表
def to_html_list(items, ordered=false):
    tag = 'ol' if ordered else 'ul'
    items_html = '\n'.join(f'  <li>{item}</li>' for item in items)
    return f'<{tag}>\n{items_html}\n</{tag}>'

print(to_html_list(['苹果', '香蕉', '橘子']))

# 生成sql insert
def build_insert(table, **fields):
    columns = ', '.join(fields.keys())
    values = ', '.join(
        f"'{v}'" if isinstance(v, str) else str(v)
        for v in fields.values()
    )
    return f'insert into {table} ({columns}) values ({values});'

print(build_insert('users', name='小明', age=25, city='北京'))

# 格式化金额
def format_money(amount):
    """格式化金额显示"""
    return f'¥{amount:,.2f}'

print(format_money(1234567.89))  # ¥1,234,567.89
print(format_money(99.9))       # ¥99.90

# 格式化文件大小
def format_file_size(bytes_size):
    """将字节数转为人类可读的格式"""
    for unit in ['b', 'kb', 'mb', 'gb', 'tb']:
        if bytes_size < 1024:
            return f'{bytes_size:.1f} {unit}'
        bytes_size /= 1024
    return f'{bytes_size:.1f} pb'

print(format_file_size(1234567))  # 1.2 mb

九、f-string常见错误

9.1 忘了写 f 前缀

name = '小明'
# print('{name}')         # 输出:{name}(当作普通字符串了)
print(f'{name}')          # 输出:小明

# 这在定义日志模板时特别容易忘
# logging.info('{name} logged in')   # 错误:原样输出
# logging.info(f'{name} logged in')  # 正确

9.2 花括号不配对

# ❌ 花括号不配对
# print(f'{name')        # syntaxerror

# 需要用单个花括号时(如json模板)
# print(f'{"key": "value"}')  # syntaxerror
print(f'{{"key": "value"}}')  # 双花括号转义

9.3 在f-string中使用lambda

# ❌ lambda中的冒号会混淆f-string解析器
# print(f'{(lambda x: x * 2)(5)}')  # syntaxerror

# ✅ 先将lambda赋给变量
double = lambda x: x * 2
print(f'{double(5)}')  # 10

十、本篇小结

f-string是现代python开发者的首选字符串格式化方式:

  1. 语法f'模板{表达式}',花括号内可放任意python表达式
  2. 格式化{value:.2f}{value:>10},语法和format()兼容
  3. 调试神器{变量=}输出变量名和值(python 3.8+)
  4. 三个修饰符!s(str())、!r(repr())、!a(ascii())
  5. 速度最快:编译时处理,比format()快约30-50%
  6. 不可模板复用:需要重复使用的模板,用format()或lambda包装

 f-string、format()和%格式化三者各有适用的场景。新项目默认用f-string,需要模板复用时用format(),维护老项目时兼容%格式化。三种都掌握在手,你的字符串格式化就没有死角了。

到此这篇关于python字符串格式化之f-string高效用法详解的文章就介绍到这了,更多相关python字符串格式化内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com