print(f"格式化字符串")
f"" 是 Python 的 f-string(格式化字符串字面量),用来在字符串里直接嵌入变量,不用再用 + 拼接或者 .format() 方法,是 Python 3.6+ 引入的语法糖,写法简洁很多。
1
2
3
4
5
6
7
8
9
10
11
|
name = "张三"
age = 25
# 传统写法1: 字符串拼接
print("我叫" + name + ",今年" + str(age) + "岁")
# 传统写法2: .format()方法
print("我叫{},今年{}岁".format(name, age))
# f-string写法(推荐,最简洁)
print(f"我叫{name},今年{age}岁")
|
三种写法输出结果完全一样:我叫张三,今年25岁
1
2
3
4
5
6
|
x = 10
y = 20
print(f"x+y = {x + y}") # 支持直接写表达式,不只是变量名
print(f"结果: {x if x > y else y}") # 甚至支持三元表达式
print(f"函数调用: {len('hello')}") # 支持函数调用
|
1
2
3
|
@before_model
def log_before(state, runtime):
print(f"即将调用模型,当前消息数: {len(state['messages'])}")
|
这里的 {len(state['messages'])} 才是f-string真正有意义的用法,直接把 len(state['messages']) 这个函数调用的结果嵌入到字符串里,不用写成:
1
|
print("即将调用模型,当前消息数: " + str(len(state['messages'])))
|
1
2
3
4
5
6
7
8
9
10
11
|
price = 19.9999
print(f"价格: {price:.2f}") # 保留2位小数 -> 价格: 20.00
count = 5
print(f"数量: {count:03d}") # 补零到3位 -> 数量: 005
ratio = 0.856
print(f"占比: {ratio:.1%}") # 百分比格式 -> 占比: 85.6%
num = 1234567
print(f"数字: {num:,}") # 千分位分隔符 -> 数字: 1,234,567
|
总结一句:f"" 就是"格式化字符串"的标记,花括号里能放变量、表达式、函数调用,Python 运行时会自动把这些替换成实际的值。print(f"模型调用完成") 单纯 print("模型调用完成") 就够了。
tool_map = {t.name: t for t in tools}
这是 Python 的字典推导式(dict comprehension),作用是把一个列表快速转换成一个字典。拆解一下。
1
2
3
|
tool_map = {}
for t in tools:
tool_map[t.name] = t
|
这段 for 循环和你那一行代码效果完全一样——遍历 tools 列表里的每一个元素 t,把 t.name(工具的名字)作为字典的key,把 t 这个对象本身作为字典的value。
1
|
{key表达式: value表达式 for 变量 in 可迭代对象}
|
对应到你这行代码:
1
2
3
4
5
6
7
8
9
|
tool_map = {t.name: t for t in tools}
# ^^^^^^ ^ ^ ^^^^^
# key value 循环变量 被遍历的对象
# 示例
dict_list = [{"name": "luck", "age": 18}, {"name": "happy", "age": 20}]
dict_map = {t['name']: t for t in dict_list}
print(dict_list) # [{'name': 'luck', 'age': 18}, {'name': 'happy', 'age': 20}]
print(dict_map) # {'luck': {'name': 'luck', 'age': 18}, 'happy': {'name': 'happy', 'age': 20}}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# 列表推导式(最常见)
squares = [x**2 for x in range(5)]
# [0, 1, 4, 9, 16]
# 集合推导式
unique_lens = {len(w) for w in ["apple", "banana", "kiwi"]}
# {5, 6, 4}
# 字典推导式(你问的这种)
name_len = {w: len(w) for w in ["apple", "banana", "kiwi"]}
# {"apple": 5, "banana": 6, "kiwi": 4}
# 还可以加条件过滤(if放在最后)
long_names = {w: len(w) for w in ["apple", "banana", "kiwi"] if len(w) > 4}
# {"apple": 5, "banana": 6}
|
方括号里放 key,就能取出对应的 value。
1
2
|
user_map = {"name": "luck", "age": 18}
print(user_map['name']) # 输出: luck
|
user_map 这个字典里有两组键值对:
1
2
|
key: "name" → value: "luck"
key: "age" → value: 18
|
user_map['name'] 就是"去字典里查key为'name'对应的value",查到的结果是 'luck',所以打印出来就是 luck。
[-1] 是 Python 列表的负数索引语法,表示"从末尾往前数",是Python的一个内置特性,不是什么特殊技巧。
1
2
3
4
5
6
7
8
9
10
11
|
messages = ["消息1", "消息2", "消息3", "消息4"]
# 正数索引:从0开始,从左往右数
messages[0] # "消息1" (第1个)
messages[1] # "消息2" (第2个)
messages[3] # "消息4" (第4个,也是最后一个)
# 负数索引:从-1开始,从右往左数
messages[-1] # "消息4" (倒数第1个,也就是最后一个)
messages[-2] # "消息3" (倒数第2个)
messages[-4] # "消息1" (倒数第4个,也是第一个)
|
图示对照更直观
1
2
3
|
索引: 0 1 2 3
["消息1", "消息2", "消息3", "消息4"]
索引: -4 -3 -2 -1
|
同一个位置,从左边数是正数索引,从右边数就是负数索引,两套编号指向同一批元素。