Python学习笔记.md7.8 KBit/develop/Python学习笔记.md
## 安装python
- 到[python官网](https://www.python.org/)下载对应版本的python,一台电脑可以装多个python,甚至同版本的,每个python虚拟环境都要指定一个版本的python。
- 系统默认的python版本,就是命令行中直接python --version显示的python版本,是在系统环境变量的path变量中,最靠前的那个python.exe所在文件夹地址决定。
- conda下创建不同python环境,如果用到的版本相同,不会重复下载完整python,甚至包括很多库,都存在anaconda/pkgs文件夹下,不同的环境要安装都是引用。
- 可以不用conda,直接用命令行`python -m venv 环境名`在指定的目录下(通常是项目目录)创建一个轻量的python虚拟环境,这种方法一般是创建可随项目迁移的完全隔离的便携版环境,激活方式是到虚拟环境目录下,执行命令行`.\Scripts\Activate.ps1`。
## 激活python环境
- (在IDE中)打开终端,如果用conda安装的,可以用conda activate 环境名激活,如果用命令行venv安装的,到安装目录下,用.\Scripts\Activate.ps1命令激活。
-
## 小要点
- “kwargs” 是 “keyword arguments” 的缩写,在Python中常用于函数定义与调用。 ### 函数定义中的 `kwargs` 当在函数定义中使用 `**kwargs` 时,它允许函数接受任意数量的关键字参数(以键值对形式传递的参数)。这些参数会被收集到一个字典中。例如: ```python def print_info(**kwargs): for key, value in kwargs.items(): print(f"{key}: {value}") print_info(name="Alice", age=30, city="New York") ``` 在上述代码中,`print_info` 函数接受任意数量的关键字参数,`kwargs` 会将传入的 `name="Alice"`、`age=30` 和 `city="New York"` 等参数收集为一个字典。然后通过遍历这个字典,打印出每个键值对。 ### 函数调用中的 `kwargs` 在调用函数时,可以使用一个字典并通过 `**` 操作符将其解包为关键字参数传递给函数。例如: ```python def greet(name, message): print(f"{message}, {name}!") person = {"name": "Bob", "message": "Hello"} greet(**person) ``` 这里,`person` 字典通过 `**` 操作符被解包为 `name="Bob"` 和 `message="Hello"` 作为关键字参数传递给 `greet` 函数。 总之,`kwargs` 为Python函数提供了一种灵活处理可变数量关键字参数的方式,增强了函数的通用性和可扩展性。
- **占位符**:|格式化方式|占位符形式|示例(填充 question 变量)|
|---|---|---|
|str.format ()(你用的)|`{}` 或 `{变量名}`|`prompt_style = "问题:{} 回答:"` → `format(question)`|
|f-string(最常用)|`{变量名}`|`prompt_style = f"问题:{question} 回答:"`|
|% 格式化(老式)|`%s`(字符串)、`%d`(数字)等|`prompt_style = "问题:%s 回答:" % question`|
- **工厂方法**:
- **装饰器**:@符号,是一种特殊标记,把装饰器后的函数功能“贴”到下面的函数里去。
`@field_validator("input_variables")` 这个装饰器的核心作用是 **“告诉 Pydantic:下面这个方法是用来验证 `input_variables` 这个字段的”**。Pydantic 会自动把 **“装饰器绑定的字段的值”** 传给方法的 `value` 参数。比如 `@field_validator("input_variables")` 修饰的方法,`value` 就一定是 `input_variables` 字段的实际值(不用你手动传参)。
一些特殊的装饰器:`@property` 装饰器,作用:将方法「伪装」成属性,调用方式从 `llm._identifying_params()` → `llm._identifying_params`;
- **f - 字符串(f-string)**:在 Python 中,字符串前加 `f`(比如 `f"xxxxx"`)表示这是一个 **f - 字符串(f-string)**,是一种方便的字符串格式化方式,作用是**在字符串中直接嵌入变量或表达式的值**。
- **类型注释**:用于声明变量、函数参数或返回值的**预期**数据类型,运行时不强制检查类型,但能让代码更清晰,可读性更强。
例子:`List[Dict[str, str]]` 告诉你 “这个参数得是‘字符串字典组成的列表’”。
def add(a: int, b: int) -> int 是表明这个方法最后返回的是int类型
#### 定义类
class 类名(父类, 可选):
# 定义实例方法
def _ init _ (self, 参数1, 参数2, ...): # self 是必须的,表示实例本身
# 给实例属性赋值
self.属性1 = 参数1
self.属性2 = 参数2
# ... 其他初始化逻辑
def 方法名(self, 参数1: 类型)
- **实例方法**:实例方法是指需要通过类的实例(对象)调用的方法(比如 `__init__`、你自定义的业务方法)。`self` 代表当前实例本身,通过它可以访问实例的属性和其他实例方法。
- **类方法**:类方法是绑定到类本身的方法,用 `@classmethod` 装饰器定义。第一个参数通常命名为 `cls`,代表**类本身**(而非实例),用于访问类的属性或调用其他类方法。
- **静态方法**:静态方法是类中的 “普通函数”,用 `@staticmethod` 装饰器定义,它与类和实例都没有绑定关系,不需要接收 `self` 或 `cls` 参数。
- 构造方法:--init--方法是 Python 的 “构造方法”,作用是 “创建类的实例时,初始化实例的属性”
- `super()`是用来调用 “父类” 的方法。
#### 常用库:
- **Pydantic** :是一个 Python 库,核心功能是 **“数据验证”** 和 **“数据建模”**。简单说,它能帮你检查数据是否符合预期的格式 / 规则,还能自动处理数据转换(比如把字符串转成数字),让你写代码时少操心 “数据对不对” 的问题。
#### 语法:
- from a import b:
- `a` 通常是**模块(module)** 或**包(package)**:
- 模块:一个 `.py` 后缀的 Python 文件(比如 `my_module.py`);
- 包:一个包含多个模块的文件夹(比如 `langchain_core` 这样的框架包,里面有很多 `.py` 文件)。
- `b` 是 `a` 中定义的**可导入对象**,可能是:
- 类(class):比如 `from langchain_core.example_selectors import BaseExampleSelector`(`BaseExampleSelector` 是类);
- 函数(function):比如 `from math import sqrt`(`sqrt` 是求平方根的函数);
- 变量(variable):比如 `from config import API_KEY`(`API_KEY` 是一个字符串变量);
- 其他模块 / 子包:比如 `from langchain import prompts`(`prompts` 是 `langchain` 包下的一个子模块)。
- 变量赋值:default 是默认值,alias是别名
- `Field` 来自 Python 的 **Pydantic 库**(一个数据验证和解析库),它的作用是**给类的字段(属性)定义元数据**,比如默认值、别名、描述、验证规则等。
- 变量、方法前用下划线表示内部使用
- `Optional` 来自 Python 内置的 `typing` 模块(代码里也导入了 `from typing import ... Optional`),它的本质是一个「类型注解语法糖」:
```python
# 下面两行写法完全等价
Optional[int] # 官方推荐的简洁写法
Union[int, None] # 底层实际的类型(Union表示“二选一”)
```
翻译过来就是:`Optional[int]` = 这个变量可以是 `int` 类型,也可以是 `None`。
- `Field` 是 Pydantic 里**核心的参数配置工具**,专门用来给模型字段(比如你代码里的 `model_name`、`temp`)设置各种规则 —— 它就像给每个参数定制 “专属说明书”,告诉 Pydantic 这个参数的默认值、别名、校验规则、注释等,比单纯写 `x: str = None` 灵活得多。
示例: model_folder_path: Optional[str] = Field(default=None, alias="model_path")
** : 解包运算符,把一个字典里所有的键值对都给从“字典压缩包”解压出来成散对