前置准备
1.环境配置 py中管理包工具:pip (python中的npm)
2.必备依赖:
- pip install openai:安装openai工具库SDK(这个库里面有给openai提供方法定义,网络请求逻辑和数据模型定义,但是没有ai模型本身,所以还需要联网调用远端模型的计算能力!)
3.虚拟环境的理解
python的虚拟环境是什么?为什么需要虚拟环境 因为不同的python项目需要的python版本不同,对应的项目框架django2/3也不同,如果没有虚拟环境就需要来回卸载,这个时候如果有虚拟环境,就起到了【隔离】的作用。例如我们安装openai这个依赖,如果没有使用虚拟环境,那么就是安装到全局,导致所有项目都用一个版本,当一个项目版本不是适配的时候就出现“版本冲突”问题。4. 怎么保证项目是处在虚拟环境中 且 项目依赖也安装虚拟环境中:【激活虚拟环境】
和npm不同,我们在给项目安装依赖的时候,决定这个依赖安装的地址,并不是安装命定在哪个项目目录下执行,pip安装的依赖地址取决于项目是否激活了虚拟环境。虚拟环境的激活意味着:从现在开始使用的是虚拟环境的python解释器和依赖工具。5. 虚拟环境的激活步骤:
# 1. 进入项目目录 cd my-project # 2. 创建虚拟环境(只需做一次) python -m venv venv # 也可以执行:python -m venv my_env,表示创建一个叫my_env的虚拟环境 # 3. 激活虚拟环境 source venv/bin/activate # Mac/Linux # 或 .\venv\Scripts\activate # Windows #如果虚拟环境名叫my_env,那么激活命令就是: source my_env/bin/activate # 激活后,终端提示符前面会出现 (venv) (venv) $4. 依赖包
当你激活虚拟环境后,使用pip install下载的包只会安装到当前虚拟环境的目录中,不会影响到系统全局的 Python 环境或其他虚拟环境。注意点:
- 每次进入项目都要激活虚拟环境:source venv/bin/active
- pip安装不用每次进入都执行:安装地址虚拟环境文件夹下的 /lib/site-packages
1.python语法
-
- 变量声明:变量不需要声明就可以直接赋值;
-
- 类型转换:变量初始化时候不需要类型定义 & 后续赋值可以动态类型转换
// java语言
int x = 10; // 1.变量需要声明 && 2.类型定义 int
x = "hello"; // 编译错误:类型不匹配
// JavaScript
let x = 10; // 1.变量需要声明 2.不需要类型定义x。 是数字
x = "hello"; // 现在 x 是字符串,允许
# Python
x = 10 # 1.变量不需要声明 2.不需要类型定义x。 x 是整数
x = "hello" # 现在 x 是字符串,允许
1.1 类型注解
类型注解 就是类似于在变量的定义、函数参数、返回值位置后面加上":数据类型",表明你期望的数据类型。例如:
def bar(x: int) -> int: # 这里期望入参x的类型是int,返回值类型是int
但是类型注解如果不符合类型规定,python解释器是不会抛出type-error类型错误的,因为python是动态类型语言,不会像java那样进行类型检查。 但是虽然解释器不会进行类型检查,但是运行的时候可能会导致程序本身出现错误。
1.2 类型隐式转化
类型的隐式转化通常发生不同数据类型之间的【加减运算】或者【比较运算】中,例如:1+‘2’,1 == true。 在python中加减运算中类型转换不像js中,只针对int和float之间,不存在于跨类型,因此在执行1+‘2’的时候会报错
1.3 class类
类中定义的普通方法,在调用的时候python会自动将类创建的实例传入到这个第一个默认参数中。
1.4 数据结构
- 简单数据类型(3个)
- num: int / float
- bool: True / False
- str
- 复杂数据类型:
- list 列表(中括号格式):[3, 2, 1, 4, 3, 2, 1]
- tuple 元祖(圆括号式的结构,不可变序列): (1, 'string ', [1 ,2])
- dict 字典(花括号格式,key不允许重复):内部元素 {"a": 1, "b": 2} key-value
- set 集合(花括号格式,value不允许重复):内部元素:{ 'a', 'b', 1, 2, False } 只存value
列表推导式
在 Python 列表推导式 [表达式 for 变量 in 可迭代对象] 中,表达式必须写在最前面(即 for 关键字之前)。
[
f"[{i+1}] {res.get('title', '')}\n{res.get('snippet', '')}"
for i, res in enumerate(results["organic_results"][:3])
]
# 正确:表达式 x**2 在前面
squares = [x**2 for x in range(5)] # [0,1,4,9,16]
# 错误:把循环写前面
squares = [for x in range(5) x**2] # SyntaxError