news 2026/7/13 4:20:32

Python大模型基础

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python大模型基础

一. python

1.python概述

1.1 计算机的组成

计算机由运算器、控制器、存储器、输入设备和输出设备等五个逻辑部件组成

1.2 计算机语言的发展简史

机器语言(二进制代码)-->汇编语言(符号语言)-->高级语言(C、C++、Java、PHP、JavaScript、Python等)

1.3 python的特点

1.3.1 python优点
  • 简单易学

  • 广泛的标准库和大量的第三方模块

  • 可移植可扩展

  • 免费开源

1.3.2 python缺点
  • 解释语言,运行速度慢

  • 代码不能加密

1.4 python应用

  • Web应用开发(FastAPI、Django、Flask)

  • 网络爬虫

  • 系统网络运维

  • 数据分析与科学计算(Numpy、Scipy)

  • 人工智能与机器学习(TensorFlow、Keras)

1.5 Python解释器

  • CPython(Python 3.x后)

  • IPython

  • PyPy

  • Jython

  • IronPython

2. 基础知识

2.1 注释

  • 对代码解释说明

  • 提高代码可读性

  • 屏蔽掉暂时不需要的代码

  • 定位程序出错的位置

2.1.1 注释分类
  • 单行注释(行注释)

  • 多行注释(块注释)

2.2 变量

2.2.1 标识符命名规则
  • 只能包含字母、数字和下划线,且不能以数字开头

  • 区分大小写

  • 不要和关键字重复

2.3 进制及转换

  1. 二进制:以0b或0B开头表示 bin(dec)

  2. 八进制:以0o开头表示 oct(dec)

  3. 十六进制:以0x或0X开头表示,此处的A-F不区分大小写 hex(dec)

2.4 数据类型

  • 基本数据类型

  1. 数值(整数(int)、浮点数(float)、复数(complex)、布尔(bool))

  • 字符串(str)

  • 容器数据类型

  1. 列表(list)

  2. 元组(tuple)

  3. 集合(set)

  4. 字典(dict)

  • 特殊数据类型

  1. None

表示空值或缺失值,只有一个值 None。常用于函数没有返回值时,或者表示变量没有被赋值。

  • 不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组)

  • 可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)

2.4.1 int整型
num1 = True num2 = 10 print(type(num1)) # <class 'bool'> print(type(num2)) # <class 'int'> print(type(num1) == type(num2)) # False print(isinstance(num1, bool)) # True print(isinstance(num1, int)) # True,Python3中,bool是int的子类 print(isinstance(num2, int)) # True ​
2.4.2 float浮点型
2.4.3 bool布尔型
  • False

  • None

  • 0

  • 0.0

  • 所有的空容器(空列表、空元组、空字典、空集合、空字符串)

2.4.4 str 字符串

3. 流程控制语句

  • 顺序

  • 分支

  1. 单分支

  2. 多分支

  3. 嵌套分支

  4. match case语句

  5. 三目运算符(表达式1 if 判断条件 else 表达式2)

  • while 循环

  • for 循环(遍历可迭代对象,如列表或字符串)

  • continue(跳过当前循环块中的剩余语句,继续进行下一轮循环)

  • break(for 或while循环终止)

4.容器数据类型

4.1 序列(Sequence)

  • 一种基本且核心的数据结构,它允许我们以有序的方式存储和操作数据。序列可以包含不同类型的元素,并且支持通过索引来访问和修改这些元素。

  • 常见的序列类型包括:列表(List)、元组(Tuple)、字符串(String)

4.2 列表List

  1. 一个可变的、有序的元素集合

  2. 用 [] 定义,数据之间使用 , 分隔

  3. 索引或下标访问

  4. 元素可以是不同的类型

  • 访问列表

  1. 通过索引获取列表中元素

  2. 列表切片

  • 向列表中添加元素(append/insert/extend)

  • 修改列表中元素(下标/切片)

  • 列表推导式

squares = [x**2 for x in range(10) if x % 2 == 0]
  • zip() 函数可将多个可迭代对象中对应元素打包为一个个元组

4.3 字符串 str

  • 替换str.replace(old,new[,max])

  • 分割str.split(x)

  • 合并(x作为分隔符)x.join(seq)

4.4 元组 Tuple

  1. 不可变的、有序的元素集合,不能对元组中的元素进行修改操作

  2. 使用 () 定义,数据之间使用,分隔

  3. 索引或下标访问

  4. 元素可以是不同的类型

4.5 集合Set

  1. 无序的,且不包含重复元素

  2. 用 {} 定义,数据之间使用 , 分隔,也可以使用set()定义

  3. 没有索引,所以不能通过切片方式访问集合元素

  4. 元素可以是不同的类型

  5. 可以进行数学上的集合操作,如并集、交集和差集

  6. 适用于需要快速成员检查、消除重复项和集合运算的场景

  • 添加元素.add()

  • 删除元素.remove()

  • 遍历集合 in

4.6 字典Dictionary

  1. 无序的键值对集合,键是唯一的,而值可以重复,没有索引

  2. 用 {}或dict() 定义,键(key)和值(value)使用 : 连接,每个键值对之间使用 , 分隔

  3. 通过键来获取对应的值

  4. 值可以取任何数据类型,但键必须是不可变的,如字符串、数字、元组

5. 函数

  • 定义函数使用 def 关键字

  • 先定义再调用

  • 若函数的形参是定长参数,可以通过 * 和 ** 对列表、元组、字典等解包传参

  • / 前的参数必须使用位置传参,* 后的参数必须用关键字传参

  • global : 修改全局变量

  • nonlocal : 内部作用域修改外部作用域(函数中)的变量

  • 用 lambda 来定义匿名函数 (lambda 参数列表: 表达式)

    def operator(a, b): return a + b ​ def function(a, b, operator): return operator(a, b) ​ print(function(1, 2, lambda x, y: x + y))

6. 文件操作

  1. 纯文本文件

  2. 二进制文件(如图片文件(jpg、png),视频文件(avi)等)

r : 读 ; w : 写 ; a : 追加写 ; x : 创建文件写 ; b : 二进制 ; t : 文本模式 ; + : 读写

  • read([size]) 可以从文件中读取数据,size 表示要从文件中读取的数据的长度(编码模式b:单位是字节,编码模式t:单位是字符),如果没有传入 size 则读取文件中所有的数据

  • readline([size]) 可以从文件中读取整行数据,也可以通过 size 设置读取数据的长度

  • readlines([size]) 读取所有行并返回列表,若给定 size>0,返回总和大约为 size 字节的行, 实际读取值可能比 size 大

6.1 with上下文管理器

try: with open("test.txt", "w") as f: f.write(a) finally: print("文件是否关闭:", f.closed) # 文件是否关闭: True

7. 面向对象之类和对象

  • 类是创建对象的模板

  • 对象是类的实例(Instance)

  • 类名一般使用大驼峰命名法

  • 类方法在类中通过 @classmethod 定义,第一个参数为cls,代表类本身

  • 静态方法在类中通过 @staticmethod 定义 , 不访问实例属性或类属性,只依赖于传入的参数

  • 魔法方法 : 方法名中有两个前缀下划线和两个后缀下划线的方法

8. 面向对象之三大特性

8.1 封装

  • 将变量和函数写入类中的操作即为封装,即类中封装了属性和方法

  • 通过双下划线定义私有属性或私有方法

8.1.1 property
  • 方法转换为属性 : 可通过@property装饰器将一个方法转换为属性来调用。转换后可直接使用 .方法名 来使用,而无需使用 .方法名()

class Person: ​ def __init__(self, name): self.name = name ​ @property def eat(self): print(f"{self.name} is eating...") ​ p = Person("张三") p.eat # 张三 is eating...
  • 只读属性 : 将方法名设置为去掉双下划线的私有属性名,方法中返回私有属性

class Person: ​ def __init__(self, name): self.__name = name ​ @property def name(self): return self.__name ​ p = Person("张三") print(p.name) # 张三 p.name = "李四" # 报错
  • 读写属性:将方法名设置为去掉双下划线的私有属性名,方法中返回私有属性

class Person: ​ def __init__(self, name): self.__name = name ​ @property def name(self): return self.__name ​ @name.setter def name(self, name): self.__name = name ​ p = Person("张三") print(p.name) # 张三 ​ p.name = "李四" print(p.name) # 李四

8.2 继承

  • 子类继承父类中的属性和方法,实现代码重用。子类可以新增自己特有的方法,也可以重写父类的方法

  • 子类不能继承父类的私有属性和私有方法

  • 支持多继承

  • 子类可以在类中使用 super().方法名() 或 父类名.方法名() 来调用父类的方法

8.2.1 方法解析顺序(mro)
  • 类名.mro访问类的继承链来查看方法解析顺序

8.2.2 方法重写
  • 在子类中定义与父类方法重名的方法,调用时会调用子类中重写的方法

8.3 多态

9. 错误和异常

  1. 语法错误 : 程序解析时遇到的错误

  2. 异常 : 运行期检测到的错误

  • 用 try except 语句来捕获异常并处理

  • 用 raise 来抛出异常

  • assert用于判断一个表达式,在表达式条件为False的时候触发异常,常用于调试程序

def int_add(x, y): assert isinstance(x, int) and isinstance(y, int), "参数类型错误" return x + y ​ print(int_add(1, 2)) # 3 print(int_add("1", "2")) # AssertionError: 参数类型错误

10. 模块和包

  • 使用from import *导入模块时,在被导入的模块中使用all设置哪些内容可以被导入。all的设置只针对使用 from import * 导入模块时有效

__all__ = ["num","add"] # 内容必须要用引号引起来 ​ num = 100 num1 = 200 _str1="abc" def add(a, b): """求两个数的和""" return a + b

10.1 常见的标注库(包)

  • os : 多种操作系统接口

  • sys : 系统相关的形参和函数

  • time : 时间的访问和转换\

  • datetime : 操作日期和时间的类

  • math : 数学函数

  • random : 生成伪随机数

  • re : 正则表达式匹配操作

  • json

  • collections :

10.2 引入第三方库

  1. 阿里云:Simple Index

  2. 豆瓣:http://pypi.douban.com/simple/

  3. 清华大学:Simple Index

  • pip install 包名

  • 临时使用其他源 : pip install -i Simple Index 包名

  • 永久修改源 : pip config set global.index-url Simple Index

    打包自己的库并安装

    1. pip install setuptools

    2. 在包外创建一个 setup.py文件

    3. from distutils.core import setup ​ setup( name="graphic", # 需要打包的名字 version="1.0", # 版本 py_modules=["graphic.circle", "graphic.rectangle"], # 需要打包的模块 )
    4. pip install setuptools

11.Python高级语法

11.1 浅拷贝与深拷贝

  1. 直接赋值:对象的引用(别名),不产生拷贝

  2. 浅拷贝:拷贝父对象,不会拷贝对象的内部的子对象。拷贝后只有第一层是独立的

  3. 深拷贝:完全拷贝了父对象及其子对象。拷贝后所有层都是独立的

  • 使用 copy() 对其浅拷贝。使用 id() 查看列表地址和列表中各个元素的地址

  • 使用 copy 模块的 deepcopy() 函数

11.2 迭代器

  • 可迭代对象

可以直接作用于 for 循环的数据类型有以下几种:

  1. 容器,如 list 、 tuple 、 dict 、 set 、 str 等。

  2. generator ,包括生成器和带 yield 的generator function

  • 判断是否是可迭代对象(Iterable)

from collections.abc import Iterable ​ print(isinstance([], Iterable)) # True print(isinstance((), Iterable)) # True print(isinstance(set(), Iterable)) # True print(isinstance({}, Iterable)) # True print(isinstance("100", Iterable)) # True print(isinstance(100, Iterable)) # False
  • 判断是否是迭代器(Iterator)

from collections.abc import Iterator ​ print(isinstance([], Iterator)) # False print(isinstance((), Iterator)) # False print(isinstance(set(), Iterator)) # False print(isinstance({}, Iterator)) # False print(isinstance("100", Iterator)) # False print(isinstance((x for x in range(10)), Iterator)) # True
list = [1, 2, 3] it = iter(list) # 创建迭代器对象 print(next(it)) # 输出迭代器的下一个元素,1 print(next(it)) # 2 print(next(it)) # 3 print(next(it)) # StopIteration
list = [1, 2, 3] it = iter(list) # 创建迭代器对象 for i in it: print(i)

11.3 生成器

  • 一个用于创建迭代器的简单而强大的工具。它的写法类似于标准的函数,但当它要返回数据时会使用 yield 语句。当在生成器函数中使用 yield 语句时,函数的执行将会暂停,并将 yield 后的表达式作为当前迭代的值返回

  • 每次调用生成器的 next() 方法或使用 for 循环进行迭代时,函数会从上次暂停的地方继续执行(它会记住上次执行语句时的所有数据值),直到再次遇到 yield 语句。这样,生成器函数可以逐步产生值,而不需要一次性计算并返回所有结果

11.3.1 创建生成器
  1. 使用推导式创建生成器

generator = (x for x in range(5)) # 创建生成器 print(generator) # <generator object <genexpr> at 0x0000026C2066CB80> for x in generator: print(x)
  1. 使用函数创建生成器

def fibo(): # 斐波那契数列 a, b = 0, 1 while True: yield b a, b = b, a + b ​ f = fibo() print(next(f)) # 1 print(next(f)) # 1 print(next(f)) # 2 print(next(f)) # 3 print(next(f)) # 5

11.4 闭包

  • 构建闭包的条件 :

  1. 外部函数内定义一个内部函数

  2. 内部函数用到外部函数中的变量

  3. 外部函数将内部函数作为返回值

11.5 装饰器

  • 不修改原有函数代码的基础上,动态地增加或修改函数的功能

from math import sqrt ​ def func(x): """开根号""" return sqrt(x) ​ def decorator(f): def inner(x): x = abs(x) # 求x的绝对值 return f(x) ​ return inner ​ func = decorator(func) print(func(-4)) # 2.0 ​
from math import sqrt ​ def decorator(f): def inner(x): x = abs(x) # 求x的绝对值 return f(x) ​ return inner ​ @decorator def func(x): """开根号""" return sqrt(x) ​ print(func(-4)) # 2.0

12. 进程与线程

  • 并发 : 单个 CPU 处理多个任务。各个任务交替执行一段时间

  • 并行 : 多个 CPU 同时执行多个任务

12.1 多进程

  • 进程是操作系统进行资源分配的基本单位

  • 操作系统中一个正在运行的程序或软件就是一个进程

  • 每个进程都有自己独立的一块内存空间

12.1.1 创建进程
  1. 使用Process()创建进程

  2. 自定义Process子类创建进程,继承Process

  3. 当需要启动大量子进程时,可以使用进程池Pool()

12.2 多线程

  • 线程是处理器任务调度和执行的基本单位

  • 一个进程至少有一个线程,也可以运行多个线程

  • 多个线程之间可共享数据

  • 线程运行出错异常后,如果没有捕获,可能会导致整个进程崩溃

  • 多线程是指在同一进程中同时执行多个任务

12.2.1 创建进程
  1. 使用Thread创建线程

  2. 自定义Thread子类创建线程,继承Thread

  3. 线程池创建ThreadPoolExecutor()

13. 协程(Coroutine)

  • 协程(Coroutine)是Python中处理高并发场景的强大工具,尤其在 I/O 密集型任务中表现出色。协程是一种用户态的轻量级线程,它不像线程那样由操作系统调度,而是由程序自身控制,所以也叫微线程

13.1 协程的优势

  1. 调度者:协程由程序自身进行调用,主动让出CPU给其他协程(通过 await 关键字)

  2. 轻量级:创建成本极低,一个线程程可以轻松创建数万个协程

  3. 无锁机制:同一时间只有一个协程运行,无需锁保护共享资源

  4. 与线程相比,协程避免了操作系统级别的上下文切换开销,只有极小的函数调用开销,在处理大量 I/O 操作时效率更高

13.2 async和await

13.2.1 定义协程函数:async def
  • 使用async def关键字定义的函数就是协程函数,它返回一个协程对象

import asyncio ​ # 这是一个协程函数 async def hello(): print("Hello") # await 关键字只能在协程函数内部使用 await asyncio.sleep(1) # 模拟I/O操作 print("World") ​ # 调用 hello() 不会立即执行,只会返回一个协程对象 coro_obj = hello() print(type(coro_obj)) # 输出: <class 'coroutine'>

13.3 运行协程:事件循环

import asyncio import time ​ async def my_func(name, delay): print(f"任务 {name} 开始") # 遇到 await,协程让出控制权 await asyncio.sleep(delay) print(f"任务 {name} 完成") return f"任务 {name} 结果" ​ async def main_sync(): print("--- 串行执行(总耗时 1s + 2s = 3s)---") # await 串行执行:必须等待前一个 task 完成,才会开始下一个 await my_func("A", 1) await my_func("B", 2) ​ if __name__ == "__main__": start_time = time.time() asyncio.run(main_sync()) print(f"串行耗时: {time.time() - start_time:.2f}秒") ​ 输出: --- 串行执行(总耗时 1s + 2s = 3s)--- 任务 A 开始 任务 A 完成 任务 B 开始 任务 B 完成 串行耗时: 3.02秒

13.4 事件循环(Event Loop) 详述

  • 事件循环是协程并发模型的核心,它是负责调度、管理和执行所有协程的“心脏”

13.4.1 注册任务
  1. asyncio.run(main_coro)(顶级注册,启动程序)

  2. asyncio.create_task(coro)(最常用,实现并发)

  3. await coro(隐式注册,实现串行)

13.5 实现并发:Task与asyncio.gather()

import asyncio import time ​ async def my_func(name, delay): print(f"任务 {name} 开始...") await asyncio.sleep(delay) print(f"任务 {name} 完成.") return f"结果 of {name}" ​ async def main_concurrent(): print("--- 并发执行(总耗时 max(1s, 2s) = 2s)---") # 1. 创建 Task:协程被包装成任务,立即启动在后台运行 task1 = asyncio.create_task(my_func("C", 1)) task2 = asyncio.create_task(my_func("D", 2)) # 2. 等待 Task 完成:await asyncio.gather() 等待所有任务结束 # 注意:这里的 await 只是等待结果,任务本身早已开始并发运行。 results = await asyncio.gather(task1, task2) print(f"所有结果: {results}") ​ if __name__ == "__main__": start_time = time.time() asyncio.run(main_concurrent()) print(f"并发总耗时: {time.time() - start_time:.2f}秒") 输出: --- 并发执行(总耗时 max(1s, 2s) = 2s)--- 任务 C 开始... 任务 D 开始...

二、Linux

  • Linux系统中一切皆文件

  • APT常用命令:

list - 根据名称列出软件包

search -搜索软件包描述

show - 显示软件包细节

install - 安装软件包

reinstall - 重新安装软件包

remove - 移除软件包

update - 更新可用软件包列表

1.常用基本命令

帮助命令: man ls - 查看ls命令的帮助信息 help cd - 查看cd命令的帮助信息 常用快捷键: Ctrl + L - 清屏;彻底清屏是:clear Ctrl + U - 清除当前敲的命令 文件命令: pwd - 显示当前工作目录的绝对路径 touch test/a/note.txt - 创建空文件 cp -r test/b/ ./ - 递归复制 rm -r b/ - 递归删除 mv a.txt b.txt - 重命名 mv test/a.txt ./ - 移动文件 cat -n a.txt - 查看文件显示行号 tail - 输出文件尾部内容(默认10行; -n 5:尾部5行;-F:实时输出) echo - 输出内容到控制台 vim命令: yy - 复制光标当前一行 p - 箭头移动到目的行粘贴 u - 撤销上一步 dd - 删除光标当前行 :wq! - 强制保存退出 用户管理命令:  su 用户名称 - 切换用户,只能获得用户的执行权限,不能获得环境变量 用户管理命令:  su 用户名称 - 切换用户,只能获得用户的执行权限,不能获得环境变量  su - 用户名称 - 切换到用户并获得该用户的环境变量及执行权限  useradd [-g 组名] 用户名 - 添加新用户到某个组 passwd 用户名 - 设置用户密码 id 用户名 - 查看用户是否存在 cat /etc/passwd - 查看创建了哪些用户 userdel 用户名 - 删除用户但保存用户主目录  userdel -r 用户名 - 删除用户的同时,删除与用户相关的所有文件 文件权限: 0 123 456 789 类型(d:目录/l:链接文档) 属主(rwx:读写执行) 属组 其他用户权限 chmod 改变权限: u:所有者 g:所有组 o:其他人 a:所有人(u、g、o的总和)rwx=4+2+1=7 chmod u-x,o+x passwd - 修改文件属主用户执行权限,并使其他用户具有执行权限 chmod -R 777 test - 压缩c:tar -zcvf xxx.tar.gz 解压x:tar -zxvf xxx.tar.gz 查看磁盘空间:df -h

三.Docker

官网地址:Docker: Accelerated Container Application Development

  • 提供了一套标准化的环境打包与运行方案:把代码、依赖、配置、系统环境全部打包在一起,形成一个可移植的容器

添加国内镜像源 "registry-mirrors": [ "https://docker.xuanyuan.me", "https://docker.1ms.run", "https://docker.m.daocloud.io" ]

1.Docker优势

  1. 可移植性

  2. 可伸缩性

  3. 隔离性

2.Docker核心概念

2.1 镜像(Image)—类比「软件安装包」

  • 只读(不能直接修改),可作为模板,创建多个容器

  • 包含了运行某个应用程序所需的全部环境(比如操作系统、软件依赖、配置文件等)

2.2 容器(Container)—类比「已安装好的软件」

  • 镜像的运行实例,是一个可读写的独立环境,相当于“把安装包安装好后,能直接使用的软件”

  • 可启动、停止、删除,多个容器相互独立;容器删除后,里面的数据默认会丢失(可通过“数据卷”保留,后续会讲)

2.3 仓库(Repository)—类比「手机应用商店」

官方仓库地址:https://hub.docker.com/

  • 用于存放和下载镜像的平台

2.4 数据卷(Volume)—— 类比「电脑的D盘(专门存数据)」

  • 数据卷是Docker中用于持久化数据的工具,相当于“给容器挂一个独立的存储盘”,容器删除后,数据卷中的数据不会丢失

2.5 核心工具Dockerfile和Docker Compose

2.5.1 Dockerfile —自定义镜像的“构建脚本”
  • 一个纯文本文件(无后缀名),包含一系列简单的指令,用于告诉Docker“如何构建自定义镜像”

2.5.2 Docker Compose —多容器的“一键管理工具”
  • 一个用于管理多容器的工具,通过一个yaml格式的配置文件(固定命名为docker-compose.yml),定义多个关联容器的配置(比如镜像、端口、依赖关系),执行一条命令就能一键启动、停止所有容器

# 核心功能:一键启动MySQL容器+Python应用容器,实现容器间通信、数据持久化 ​ services: # 容器1:MySQL服务容器(命名为mysql-db,容器间可通过该名称访问) mysql-db: # 基础镜像:指定MySQL 8.0.45版本(稳定性高,适配Python连接) image: mysql:8.0.45 # 重启策略:容器意外关闭/服务器重启时,自动重启(保证服务可用性) restart: always # 环境变量:配置MySQL核心参数(无需手动进入容器修改) environment: MYSQL_ROOT_PASSWORD: "123456" # root用户密码(自定义,Python连接需一致) MYSQL_DATABASE: "test_db" # 自动创建初始数据库(无需手动建库) # 字符编码配置:适配MySQL 8.0+,避免中文乱码/连接报错 MYSQL_INITDB_ARGS: "--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci" # 端口映射:本地9999端口 → 容器内3306端口(避免与本地MySQL端口冲突) ports: - "9999:3306" # 数据卷挂载:Windows本地D盘mysql-data目录 → 容器内MySQL数据目录(持久化数据) volumes: - D:/mysql-data:/var/lib/mysql # 加入自定义网络:与Python容器互通(容器间通信的基础) networks: - app-network # 健康检查:判断MySQL服务是否真正就绪(而非仅容器启动),解决连接拒绝问题 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-p123456"] # 检测MySQL是否可ping通 interval: 3s # 每3秒检查一次 timeout: 3s # 单次检查超时时间3秒 retries: 10 # 最多重试10次(覆盖MySQL启动初始化时间) start_period: 5s # 容器启动后,延迟5秒再开始检查(避免过早检测) ​ # 容器2:Python应用容器(命名为python-app,业务代码运行载体) python-app: # 构建规则:基于当前目录下的Dockerfile,构建自定义Python镜像 build: . # 依赖条件:等待mysql-db容器的健康检查通过后,再启动本容器(核心修复:解决MySQL未就绪问题) depends_on: mysql-db: condition: service_healthy # 仅当MySQL服务就绪时,才启动Python容器 # 环境变量:传递MySQL连接信息(Python代码可通过os.getenv获取,无需硬编码) environment: MYSQL_HOST: "mysql-db" # 容器间通信地址:直接填MySQL容器名(无需IP) MYSQL_PORT: "3306" # MySQL容器内端口(非本地9999) MYSQL_USER: "root" # 与MySQL容器的用户名一致 MYSQL_PASSWORD: "123456" # 与MySQL容器的密码一致(修改需同步) MYSQL_DB: "test_db" # 与MySQL容器自动创建的数据库名一致 # 加入自定义网络:与MySQL容器在同一网络,才能通信 networks: - app-network ​ # 自定义网络:桥接模式(Docker默认),保证两个容器相互可见、可访问 networks: app-network: driver: bridge ​

3.基础命令

docker --version docker compose version ​ docker pull mysql:8.0.45 ​ 查看镜像 docker images ​ ocker run -d --name mysql-db -p 9999:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0.45 ​ 查看容器 docker ps ​

四.FastAPI

  • 一个现代、快速(高性能)的Web框架,用于构建API

  • 类型提示(type hints)和异步编程(asyncio)能力,使得代码易于编写、阅读和维护

  • 有自动交互式文档(基于 OpenAPI 规范和 JSON Schema)、数据验证、依赖注入(Dependency Injection)等功能

from fastapi import APIRouter ​ # 实例化一个 APIRouter,可指定前缀(所有路由自动加上 /users) router = APIRouter( prefix="/users", tags=["用户管理"] # 文档中归类为「用户管理」 ) ​ # 定义用户相关路由 @router.get("/") def get_all_users(): return {"message": "获取所有用户列表"} ​
from fastapi import APIRouter ​ router = APIRouter( prefix="/items", tags=["商品管理"] # 文档中归类为「商品管理」 ) ​ # 定义商品相关路由 @router.get("/") def get_all_items(): return {"message": "获取所有商品列表"} ​
from fastapi import FastAPI from routers import user, item # 导入子模块路由 import uvicorn ​ app = FastAPI(title="路由分发示例") ​ # 挂载用户路由:所有 /users 开头的请求由 user.router 处理 app.include_router(user.router) ​ # 挂载商品路由:所有 /items 开头的请求由 item.router 处理 app.include_router(item.router) ​ # 主应用自身也可以定义路由 @app.get("/") def root(): return {"message": "欢迎访问主页面"} ​ if __name__ == "__main__": # 直接在代码中启动uvicorn服务器 uvicorn.run( app="main:app", # 指定要运行的FastAPI应用实例 host="0.0.0.0", # 允许外部访问(本地可通过127.0.0.1或localhost访问) port=8000, # 端口号 reload=True # 开发模式:代码修改后自动重启(生产环境需去掉) ) ​

五. SQLAlchemy

1.ORM

  • ORM(Object-Relational Mapping,对象关系映射)是一种编程技术,它将数据库中的表结构映射为编程语言中的类,将表中的行映射为类中的对象,让开发者可以用面向对象的方式操作数据库,而无需直接编写 SQL 语句。

  1. 屏蔽数据库差异

    • 同一套代码可适配多种数据库(MySQL、PostgreSQL 等),无需修改核心逻辑

  2. 简化开发流程

    • 用类、对象、方法替代 SQL 语句,降低数据库操作的学习成本

  3. 提高代码可读性

    • 将数据库操作与业务逻辑融合,代码更符合面向对象思维

  4. 自动处理类型转换

    • 无需手动转换数据库字段与Python类型(如MySQL的INT与Python的int)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/13 4:16:57

《无人查收》:从心理博弈到精密复仇的人性暗黑解析

开头先别急着被“一口气看完”“神作”“极致暗黑”这些词唬住。这类标题背后&#xff0c;往往藏着一个更值得琢磨的问题&#xff1a;为什么一个看似简单的复仇故事&#xff0c;能让人产生“窒息感”&#xff1f;是因为暴力场面吗&#xff1f;是因为反转次数吗&#xff1f;还是…

作者头像 李华
网站建设 2026/7/13 4:15:45

轻载v1.1.0 | 抖音无水印下载,支持高清画质,简洁纯净无广告

软件介绍 轻载是一款专为 Android 设备设计的抖音无水印下载客户端。它采用纯原生技术实现&#xff0c;所有视频下载、图文下载、动图下载及视频合成逻辑均在设备端本地运行&#xff0c;无需依赖任何后端服务器&#xff0c;确保用户数据隐私安全。 下载地址&#xff1a;https…

作者头像 李华
网站建设 2026/7/13 4:14:07

基于LingBot-Depth的单目深度估计:为AR/VR应用注入空间感知能力

1. 项目概述&#xff1a;从“平面”到“空间”的AR/VR体验革命如果你正在开发AR或VR应用&#xff0c;肯定对“虚拟物体漂浮在空中”或者“角色穿墙而过”的尴尬场景不陌生。问题的核心在于&#xff0c;大多数应用缺乏对真实世界三维结构的精确理解。传统的解决方案&#xff0c;…

作者头像 李华
网站建设 2026/7/13 4:13:06

5大核心功能解锁GTA5线上模式的终极游戏体验

5大核心功能解锁GTA5线上模式的终极游戏体验 【免费下载链接】GTA5OnlineTools GTA5线上小助手 项目地址: https://gitcode.com/gh_mirrors/gt/GTA5OnlineTools 还在为GTA5线上模式中繁琐的操作、高昂的改装成本和有限的游戏自由度而烦恼吗&#xff1f;GTA5线上小助手为…

作者头像 李华
网站建设 2026/7/13 4:12:05

eNSP USG5500 防火墙 3 区域策略配置:基于 10 台主机的访问控制实验

eNSP USG5500 防火墙三区域策略实战&#xff1a;基于10台主机的精细化访问控制当第一次在eNSP中拖入USG5500防火墙时&#xff0c;很多初学者会对着密密麻麻的接口和策略选项发懵——为什么Trust区域的主机能访问某些资源却被另一些拒绝&#xff1f;为什么相同的安全设备在不同企…

作者头像 李华