天我们学习 Day 7:f-string 格式化技巧。这是 Python 3.6+ 中最现代、最强劲的字符串格式化方法。
f-string 是在字符串前加 f 或 F,在字符串中直接嵌入表达式:
name = "Alice"
age = 25
# 传统方法
message1 = "姓名: " + name + ", 年龄: " + str(age)
message2 = "姓名: {}, 年龄: {}".format(name, age)
# f-string (推荐)
message = f"姓名: {name}, 年龄: {age}"
print(message) # 输出: 姓名: Alice, 年龄: 25f-string 中可以执行任何有效的 Python 表达式:
a, b = 5, 3
print(f"{a} + {b} = {a + b}") # 输出: 5 + 3 = 8
print(f"{a} * {b} = {a * b}") # 输出: 5 * 3 = 15
print(f"{a}的平方是 {a**2}") # 输出: 5的平方是 25
# 调用函数和方法
name = "alice"
print(f"大写: {name.upper()}") # 输出: 大写: ALICE
print(f"长度: {len(name)}") # 输出: 长度: 5数字格式化:
pi = 3.1415926535
number = 1234.5678
print(f"Pi: {pi:.2f}") # 输出: Pi: 3.14
print(f"数字: {number:,.2f}") # 输出: 数字: 1,234.57
print(f"百分比: {0.256:.1%}") # 输出: 百分比: 25.6%
print(f"十六进制: {255:#x}") # 输出: 十六进制: 0xff对齐和填充:
text = "Python"
number = 42
print(f"左对齐: |{text:<10}|") # 输出: 左对齐: |Python |
print(f"右对齐: |{text:>10}|") # 输出: 右对齐: | Python|
print(f"居中对齐: |{text:^10}|") # 输出: 居中对齐: | Python |
print(f"填充0: {number:05d}") # 输出: 填充0: 00042使用 = 操作符可以同时显示表达式和其值:
name = "Alice"
age = 25
score = 95.5
print(f"{name=}") # 输出: name='Alice'
print(f"{age=}") # 输出: age=25
print(f"{score=:.1f}") # 输出: score=95.5
print(f"{len(name)=}") # 输出: len(name)=5
# 复杂表达式调试
x, y = 3, 4
print(f"{x + y=}") # 输出: x + y=7name = "Alice"
age = 25
city = "New York"
# 多行f-string
profile = f"""
个人信息:
---------
姓名: {name}
年龄: {age}
城市: {city}
得分: {age * 4:.1f}
"""
print(profile)width = 10
precision = 2
value = 12.34567
# 嵌套格式化
print(f"结果: {value:{width}.{precision}f}") # 输出: 结果: 12.35
# 更复杂的嵌套
format_spec = ">10.2f"
print(f"值: {value:{format_spec}}") # 输出: 值: 12.35from datetime import datetime
now = datetime.now()
print(f"当前时间: {now:%Y-%m-%d %H:%M:%S}") # 输出: 当前时间: 2023-12-07 14:30:25
print(f"今天日期: {now:%Y年%m月%d日}") # 输出: 今天日期: 2023年12月07日
print(f"星期: {now:%A}") # 输出: 星期: Thursday# 字典访问
person = {"name": "Bob", "age": 30, "city": "London"}
print(f"姓名: {person['name']}, 年龄: {person['age']}")
# 对象属性访问
class User:
def __init__(self, name, level):
self.name = name
self.level = level
user = User("Charlie", "VIP")
print(f"用户: {user.name}, 等级: {user.level}")技巧1:条件表达式
score = 85
result = f"成绩: {score} - {'及格' if score >= 60 else '不及格'}"
print(result) # 输出: 成绩: 85 - 及格
# 复杂的条件格式化
temperature = 22
status = f"温度: {temperature}°C - {'炎热' if temperature > 30 else '舒服' if temperature > 15 else '寒冷'}"
print(status) # 输出: 温度: 22°C - 舒服技巧2:循环和生成器表达式
numbers = [1, 2, 3, 4, 5]
print(f"平方数: {[x**2 for x in numbers]}") # 输出: 平方数: [1, 4, 9, 16, 25]
# 连接字符串
names = ["Alice", "Bob", "Charlie"]
print(f"所有名字: {', '.join(names)}") # 输出: 所有名字: Alice, Bob, Charlie技巧3:转义大括号
# 显示字面量的大括号
value = 42
print(f"值: {{{value}}}") # 输出: 值: {42}
print(f"{{这是大括号}}") # 输出: {这是大括号}案例1:报表生成
def generate_report(data):
"""生成数据报表"""
total = sum(data)
average = total / len(data)
maximum = max(data)
minimum = min(data)
return f"""
数据报表
========
数据点: {len(data)}
总和: {total:,.2f}
平均值: {average:.2f}
最大值: {maximum}
最小值: {minimum}
范围: {maximum - minimum}
"""案例2:配置信息显示
def show_config(config):
"""显示配置信息"""
return f"""
系统配置
=======
{'设置':<15} {'值':<20} {'状态':<10}
{'-' * 50}
{'主机':<15} {config.get('host', 'N/A'):<20} {'✅' if config.get('host') else '❌'}
{'端口':<15} {config.get('port', 'N/A'):<20} {'✅' if config.get('port') else '❌'}
{'调试模式':<15} {config.get('debug', False):<20} {'✅' if config.get('debug') else '❌'}
"""练习1:基础格式化
name = "张三"
age = 28
salary = 15000.50
# 生成字符串: "张三(28岁)的月薪是¥15,000.50"
# 你的代码 here练习2:调试输出
items = ["apple", "banana", "cherry"]
count = len(items)
total_length = sum(len(item) for item in items)
# 使用调试格式输出变量信息
# 你的代码 here练习3:实战应用
def format_product_info(products):
"""
格式化商品信息表格
列: 名称(左对齐10) | 价格(右对齐8, 2位小数) | 库存(居中6)
"""
# 你的代码 here
pass
# 测试数据
products = [
{"name": "Apple", "price": 5.99, "stock": 120},
{"name": "Banana", "price": 3.50, "stock": 80},
{"name": "Orange", "price": 4.25, "stock": 65}
]练习答案:
# 练习1答案:
result = f"{name}({age}岁)的月薪是¥{salary:,.2f}"
# 练习2答案:
print(f"{items=}")
print(f"{count=}")
print(f"{total_length=}")
# 练习3答案:
def format_product_info(products):
header = f"{'名称':<10} | {'价格':>8} | {'库存':^6}"
separator = "-" * 30
rows = []
for product in products:
row = f"{product['name']:<10} | {product['price']:>8.2f} | {product['stock']:^6}"
rows.append(row)
return "
".join([header, separator] + rows)优点:
记住:在 Python 3.6+ 中,f-string 应该是字符串格式化的首选方法!
明天我们将学习 collections 模块中的实用工具,如 defaultdict, Counter, namedtuple 等。