
个人主页 for_ever_love__ 欢迎各位大佬莅临其他栏目: 我想学python了 其他栏目: iOS项目总结大全 其他栏目: iOS UI 文章目录变量与数据类型——动态类型、类型注解与 Python 的数字世界一、为什么大模型代码里全是变量和类型二、动态类型赋值即定义三、基本数据类型一览四、数字的世界int 不会溢出float 要小心4.1 int 任意精度4.2 float 的精度陷阱五、类型注解让大模型代码更好读、更稳六、常见坑与注意事项七、本篇小结变量与数据类型——动态类型、类型注解与 Python 的数字世界上一步我们把 Python 环境装好了写出了第一个能跑的脚本。这一篇继续打地基变量与数据类型。你可能会想这太基础了吧——但等你真正写大模型代码时会发现变量和类型无处不在模型的配置参数、一批 token 的 id 列表、张量的float32/float16精度全都是数据 类型的组合。把这一篇吃透后面读 PyTorch、Transformers 源码时才不会一头雾水。一、为什么大模型代码里全是变量和类型随便翻开一段训练脚本batch_size32learning_rate:float1e-4token_ids[101,2023,2003,1037]# 一句话的 tokenweightsmodel.float()# 转成 float32 张量batch_size是个整数决定一次喂多少数据learning_rate标了float类型注解说明它是浮点数token_ids是个列表里面是整数——模型吃进去的不是文字是这些 idweights是张量但底层数据类型是float32。你会发现大模型项目对数据是什么类型极其敏感。一个该是float32的张量被当成float16可能直接数值溢出一个该是列表的配置被传成字符串训练会莫名其妙报错。所以这一篇我们把 Python 的类型系统讲清楚。二、动态类型赋值即定义Python 是动态类型语言——变量不需要提前声明类型第一次赋值就决定了它此刻的类型而且类型还能随时变x10# x 现在是 intprint(type(x))# class intxhello# x 变成了 str完全合法print(type(x))# class strx[1,2,3]# x 又变成了 listprint(type(x))# class list注意一个关键点Python 的变量更像贴在某个对象上的标签而不是装数据的盒子。同一个对象可以贴多个标签a b []一个标签也能随时撕下来贴到别的对象上。理解这一点后面才不会在可变对象共享的坑里栽跟头。三、基本数据类型一览类型字面量例子说明int10、-3、0b1010任意精度整数不会溢出float3.14、1e-4双精度浮点64 位boolTrue、False整数 1 和 0 的子类strhello、你好不可变Unicode 文本NoneTypeNone表示空/无常作默认值bool其实是int的子类True 1、False 0成立但不要拿来做算术容易把人看晕。四、数字的世界int 不会溢出float 要小心4.1 int 任意精度C/Java 里的int有固定位数32 位最大约 21 亿超了就溢出。Python 的int是任意精度——只要内存够多大都行big2**1000print(big)# 一个 302 位的巨大整数不会溢出print(big.bit_length())# 1001这对大模型有意义吗有。比如你处理超长文档的字符偏移、大语料的行号不用担心溢出。4.2 float 的精度陷阱浮点数遵循 IEEE 754存在二进制无法精确表示小数的问题print(0.10.2)# 0.30000000000000004不是 0.3print(0.10.20.3)# False这正是大模型要用float32/float16而不是无限精度的原因——硬件只能用有限位存小数。所以比较浮点数要用容差而不是直接defapprox_equal(a,b,tol1e-9):returnabs(a-b)tolprint(approx_equal(0.10.2,0.3))# True当你日后看到 loss 从2.3456变成2.3457就认为没变化或者做if loss 0.0的判断记住这个坑。五、类型注解让大模型代码更好读、更稳Python 是动态类型但现代大模型库PyTorch、Transformers、vLLM大量使用类型注解。为什么因为项目太大没有类型提示人和 IDE 都看不懂函数该传什么。fromtypingimportList,Optionaldefbuild_prompt(question:str,context:List[str])-str:拼接一个问题 若干上下文返回完整 promptparts:List[str][f问题{question}]fori,cinenumerate(context,1):parts.append(f参考{i}{c})return\n.join(parts)config:Optional[dict]None# 可能是 dict也可能是 Nonequestion: str表示参数应是字符串- str表示返回值类型是字符串List[str]表示字符串组成的列表来自typing模块Optional[dict]表示可能是 dict也可能是 None。类型注解运行时不做强制检查写错了不会报错但配合mypy这类静态检查工具能在运行前抓出一大类 bug。强烈建议从一开始就养成写注解的习惯。六、常见坑与注意事项坑现象解决办法可变默认参数def f(x[]): x.append(1)多次调用共享同一个列表默认用None函数内再x x or []与is混淆a b比值a is b比是不是同一个对象比值得用比 None 用is None浮点直接0.10.2 0.3为 False用容差比较见第四节动态类型运行时才报错x 5; x 3报 TypeError写注解 mypy提前发现None 当默认值踩坑把None当 0 或空串参与运算报错显式判断if x is None两个高频错误重点说可变默认参数这是 Python 头号经典坑。函数的默认参数在函数定义时就创建好了之后所有调用共享它。正确写法永远是用None占位。is不是is判断两个变量指向内存里同一个对象判断值相等。比如两个内容相同的列表a b为 True但a is b为 False。只有和单例如None、True比较时才用is。七、本篇小结这一篇我们搞清了Python 是动态类型语言变量是贴在对象上的标签类型可随时变。五种基本类型int / float / bool / str / NoneType其中int任意精度不会溢出float有精度陷阱。浮点数比较要用容差不能直接。类型注解str、List[str]、Optional让大模型项目可读、可静态检查强烈推荐用起来。避开可变默认参数、is/混淆等经典坑。下一篇我们聊字符串处理——f-string 格式化、切片、以及用正则清洗文本。毕竟大模型吃的粮食就是文本学会干净利落地处理字符串是后面做分词、做 prompt 工程的前提。本篇是《大模型开发从 0 到 1》专栏第 2 篇。专栏文章按「分类专栏」归类顺序学习体验最佳。