# python-lampol-1 **Repository Path**: lvzhenchao/python-lampol-1 ## Basic Information - **Project Name**: python-lampol-1 - **Description**: No description available - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-12-10 - **Last Updated**: 2026-02-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 1、环境安装 ## 1-1、venv(虚拟环境)作用 - 隔离项目依赖:每个项目可以有自己的独立环境,不影响其他项目 - 管理python版本:可以使用不同的python版本,适应项目需求 - 保证项目可复现:venv 允许你使用 requirements.txt 记录依赖,使团队成员或部署环境可以安装相同的包版本,保证一致性。 ``` 示例: 1、安装依赖 pip install requests 2、生成依赖文档 pip freeze > requirements.txt 3、按照文档安装依赖 pip install -r requirements.txt ``` ## 1-2、print输出函数 ## 1-3、缩进 - 采用缩进和冒号来区分代码块的层次 - 使用空格或者Tab键实现,采用4个空格长度作为一个缩进量 - 同一个级别代码块的缩进量必须一样 - 缩进有一个不规则,就会报错 # 2、变量 ## 2-1、常量 - 含义:不变的变量 - 特点:python没有严格的常量 - 要求:通常放在代码的顶部,作为全局使用 ## 2-2、内置常量 - False、True - None:代表空值的对象,例如未向某个函数传入默认参数时 ## 2-3、判断某个变量是否是什么类型 - isinstance方法 ## 2-4、字符串相关 - bytes是新增的一种数据类型 - 含义:字节串由多个字节构成,由字节为单位进行操作; - 特点:是不可变对象,用法和字符串一样,除了操作单元不同 - 字符串和bytes相互转换:encode、decode ## 2-5、数据类型转换 - bool(x):x是"0"或None,返回false,其他都返回true - str(x) - int(x) - float(x) ## 2-6、input()方法 - 内置函数,用于从用户接受输入 # 3、数据容器:可以容纳多个复杂数据的数据类型【列表、元组、集合、字典】 ## 3-1、列表 - 含义:没有数组,但是列表更强大,有序可修改可重复的序列 - 创建:[]、list() - 常用新增方法:append:末尾新增、insert:指定位置插入、extend:将另一个序列的元素追加到列表的末尾 - 常用删除方法:remove、pop、del、clear ## 3-2、元组 - 含义:有序且不可被修改可以重复的数据集合,小括号()进行定义 - 定义:()、tuple() - 特点:只有一个元素,也要写一个逗号; 表示为元组的定义形式,也可以作为括号表示算数运算时的优先级; 分别打印即可 ## 3-3、集合 - 含义:无序且没有重复元素的序列 - 定义:{}、set ## 3-4、字典 - 含义:无序的可变的序列,以k-v形式存储 - 定义:{} - 遍历 # 4、运算符和流程控制 ## 4-1、成员运算符 - in:判断元素是否在序列中【循环遍历用到了】 - not in:判断元素是否不在序列中 ## 4-2、逻辑运算符 - and - or - not ## 4-3、三元运算 - if else实现 ## 4-4、if - pass:空语句,不执行任何操作,就是个占位符;比使用注释更加优雅,暂时不实现细节,先占好位置 - pass可以在任何需要语句的地方使用 - assert:断言语句;缩小版的if语句;为真则程序继续往下执行,否则会报AssertionError错误 - assert通常用于检查用户的输入是否符合规定,经常用作程序初期测试和调试的辅助工具 ## 4-5、循环 - zip():是内置函数,将多个序列(列表、元组、字典、集合、字符串以及range()区间构成的列表)压缩成一个zip对象 # 5、函数 ## 5-1、定义写法 - 返回值:None - None是特殊的常量,表示空值;对于所有没有return语句的函数定义,都是在末尾加上 return None - 使用不带值return语句【只有return关键字本身】,那么就返回None - 如果返回的是多个值:则数据类型就是元组的形式 ## 5-2、形参和实参 - 获取内存地址: id() - 值传递:适用于实参类型不可变的 - 引用传递:适用于实参类型为可变 ### 5-2-1、不可变数据类型 - 定义:是指数据一旦创建,【内容就不能修改】。对不可变类型进行操作,会返回一个新对象,而原对象保持不变。 - 不可变数据类型【变量值发生变化,内存地址改变】:数字、布尔、字符串、元组 ### 5-2-2、可变数据类型 - 定义:是指数据创建后,可以直接修改其内容,而不会改变其引用(内存地址) - 可变数据类型【变量值发生变化,内存地址不变】:列表、字典、集合 ### 5-2-3、注意事项 - 可变类型作为默认参数的陷阱 - 解决办法:用不可变类型代替 ## 5-3、函数类型和lambda表达式 - lambda表达式:又称匿名函数,常用来表示内部仅包含1行的函数 - 注意:创建的函数没有名字,只能使用一次;会自动返回结果,无需return - 优势:代码更简洁、不需多次复用的,提高程序性能 ### 5-3-1、函数式编程 - 定义:代码中的每一块都是不可变的,都由纯函数的形式组成【纯函数:函数本身相互独立,互不影响】 - partial偏函数:对原始函数的二次封装,将现有函数的部分参数先绑定为指定值 - 偏函数通过将任意数量(顺序)的参数,转化为另一个带有剩余参数的函数对象,从而实现了截取函数功能(偏向)的效果 - 应用:可以使用一个原函数,然后将其封装多个偏函数 - 定义:偏函数名 = partial(func, *args, **kwargs) ## 5-4、*函数注解:为函数提供类型提示信息【python3的功能之一】demo-7 - 定义:为函数中的形参和返回值提供类型提示信息。 - print(func.__annotations__):会输出函数的注解信息 ## 5-5、偏函数 partial - 含义:对原始函数的二次封装,将现有函数的部分参数先绑定为指定值,就得到了一个偏函数 - 语法:partial(func, *args, **kwargs) - 优势:具有较少的可变参数,从而降低函数的调用难度 ## 5-6、闭包函数 - 含义:闭包函数,就是返回一个函数的函数。一般情况下会赋值给一个变量,这个变量可以在后面继续 使用 ## 5-7、lambda表达式【匿名函数】 - 含义:匿名函数,即没有名称的函数 - 语法:lambda 参数列表:表达式 ## 5-8、eval() 和 exec()函数 - 含义:用于动态执行字符串形式的Python代码 - 注意:这两个函数如果用于执行用户输入的内容,极易导致代码注入攻击! - ## 6、类和对象 ### 6-1、构造方法 - 定义:创建一个类时,自动调用;不论是否手动添加 - 参数:除了self参数外,还可以自定义一些参数,参数之间使用逗号进行分割 ### 6-2、动态属性添加 - 定义:__slots__,属性通过它可以避免频繁的给实例对象添加属性和方法 - 含义:其实就是一个元组,只有其中指定的元素,才可以作为动态添加的属性或者方法 - __slots__ 只能限制为【实例对象】动态添加属性和方法;且只能添加slots里面一样的名字的属性和方法; - 注意,对于动态添加的方法,__slots__ 限制的是其方法名,并不限制参数的个数。 ### 6-3、类变量的分类 - 类体中、所有函数之外:此范围定义的变量,称为类属性或类变量;【1-1】 - 类体中,任意类方法内部:以“self.变量名”的方式定义的变量,称为实例属性或实例变量;【1-2】 - 类体中,所有函数内部:以“变量名=变量值”的方式定义的变量,称为局部变量;【1-3】 ### 6-4、方法分类 - 类方法:类中定义的方法默认都是实例方法;特点是最少也要包含一个self参数 - 实例方法:自少也包含一个参数,只不过类方法中通常将其命名为 cls【与类绑定,不用实例化调用,直接类名调用即可】,需要使用@classmethod修饰符进行修饰, - 静态方法:没有类似self、cls这样的特殊参数【没有形参】;不会对它包含的参数做任何类或对象的绑定,所以无法调用任何属性和类方法; #### 6-4-1、3类方法【demo-10】 | 方法类型 | 定义方式 | 第一个参数 | 绑定对象 | 典型用途 | | -------- | --------------------- | ------------ | --------- | ------------------- | | **实例方法** | `def func(self, ...)` | `self`(实例对象) | 实例 | 操作实例数据(最常用) | | **类方法** | `@classmethod` 修饰 | `cls`(类对象) | 类 | 操作类级别的数据、工厂方法 | | **静态方法** | `@staticmethod` 修饰 | 无 | 类(但不自动传参) | 工具函数,与类逻辑相关但不依赖类或实例 | ##### 6-4-1-1、*实例方法 - 创建实例方法:def func(self, ...),自动传入 self - 调用实例方法:实例对象.方法名() - 用途:操作实例属性;访问其他实例方法;对象行为的主要定义处 ##### 6-4-1-2、*类方法 - 创建类方法:@classmethod装饰,自动传入 cls参数 - 调用类方法:类名.方法名() - 用途:访问或修改类属性(而非实例属性)、定义“工厂方法”;用来创建实例的辅助构造器;让方法在类层面共享逻辑 - 总结:cls 是类对象,【可以访问和修改类变量】,而 self 是实例对象,只能操作实例变量。 #### 6-4-1-3、*静态方法 - 创建静态方法:@staticmethod装饰,不自动传入任何参数 - 调用静态方法:类名.方法名() - 用途:工具方法(例如时间转换、字符串处理等);逻辑上属于类,但不操作类或实例数据 - 总结:静态方法看起来像【普通函数】,但组织在类中只是为了逻辑归属清晰。 ### 6-5、oop #### 6-5-1、封装 - 封装:属性或方法前面加上__代表私有化,实例化后的对象不能调用; - property(getLeg,setLeg):免去在外面重新设定 - @property:装饰器可以在类中定义一个函数,用来当做属性来访问 - 作用:通过 @property 装饰器,可以直接通过方法名来访问方法,不需要在方法名后添加一对“()”小括号。 #### 6-5-2、继承 - 支持多继承 - Super:对与子类重写父类的方法;使用super()方法,还可以直接调用父类的方法 #### 6-5-3、多态 - 含义:多态依赖于继承;使得不同的子类调用相同的方法,产生不同的执行结果 - 前提条件:继承、重写 - 继承:多态一定是发生在子类和父类之间 - 重写:子类重写了父类的方法 - Python 这种由多态衍生出的更灵活的编程机制,又称为“鸭子模型”或“鸭子类型”。【demo-8-1-多态应用】 ### 6-6、魔术方法 - __name__的使用 ### 6-7、枚举类 - 含义:对于实例化对象个数固定的类;如果想将一个类定义为枚举类,直接继承enum模块中Enum类即可 ## 7-异常 - 当程序发生异常时,异常无法再执行下去,程序是要终止的,如果要避免程序退出, - 需要捕获异常的方式捕获,再通过其他逻辑代码让程序继续执行 ### 7-1、分类 - 语法错误 - 运行时错误 #### 7-1-1、运行错误类型 - AssertionError:当关键字后的条件为假时,程序运行会停止,并抛出AssertionError异常 - IndexError:索引超出序列范围会引发异常 - KeyError:字典中查找一个不存在的关键字引发此异常 - NameError:访问一个未声明的变量时 - TypeError:不同类型数据之间的无效操作 ### 7-2、捕获异常流程 - 1、首先执行try中的代码块,如果出现异常,系统自动生成一个异常类型,并将异常提交给python解释器,此过程为捕获异常 - 2、当解释器收到异常时,会寻找能处理该异常的except块,然后交给合适except块 #### 7-2-1、获取特定异常的有关信息 - args:返回异常的错误编号和描述字符串 - str(e):返回异常信息,但不包括异常信息的类型 - repr(e):返回较全的异常信息,包括异常信息的类型 - 最顶级的异常父类对象:Exception ### 7-3、异常处理方式 - else:如果没有异常的返回内容 - finally:为了try的程序做扫尾工作,无论try块是否发生异常,最终都会进入,并执行其中 - finally:处理一些物理资源(文件、数据库链接等需要手动回收的动作),都放入finally中 ### 7-4、抛出异常 - 含义:使用关键字主动抛出异常 - 语法:raise #### 7-4-1、raise用法 - raise:单独一个raise,默认是RuntimeError异常 - raise 异常类名称:引发该类型的异常 - raise 异常类名称(描述信息) ### 7-5、自定义异常类 - 用户自定义:必须从任何一个内置异常类派生出来 ### 7-6、获取更多异常信息 - sys.exc_info():返回异常信息,已元祖的形式返回,包含3个元素,分别为type【异常类型的名称】、value【捕获到的异常实例】、traceback【traceback对象】 ### 7-7、logging模块 - 优势:可以很容易地创建自定义的消息记录 ## 8、模块 - 含义:模块是一个Python文件,定义了各种功能接口 ### 8-1、分类 - 内置模块 - 第三方模块 - 自定义模块 ### 8-2、模块导入 - import 模块名 [as 别名] - form 模块名 import 成员名 [as 别名] ### 8-3、第三方包导入 - 安装:pip install 包名 - 卸载:pip uninstall 包名 - 第三方库导出:pip freeze > requirements.txt - 第三方库批量安装导入:pip install -r requirements.txt ### 8-4、自定义模块 - 含义:用户创建的文件,用于组织、封装和重用可执行的代码块 - 步骤1:创建模块,创建一个新的python文件,编写自己的函数、类或变量,保存为.py文件 - 步骤2:导入模块,在另一个python文件中,使用import语句导入,以便使用其中定义的函数、类或变量 ### 8-5、包管理 - 含义:实质是一个文件夹,包含大量的模块文件;更好地组织和管理模块 - 规则:包中必须包含一个__init__.py文件来指示文件夹是一个包 - __init__.py作用:主要作用是导入该包内的其他模块 ## 9、文件IO - IO:输入和输出的操作 - 文件IO:指与文件进行读取和写入操作的过程 ### 9-1、文件IO过程 - 1、open打开一个文件:创建一个file对象 - 2、操作此文件(读、写,追加等): - 3、close关闭文件 - 补充:先刷新到缓冲区,再写入 ### 9-2、读取:size代表字节数 - read(size) - readline(size) - readlines(size) ### 9-3、with 表达式 [as 别名] - 表达式:必须是一个返回上下文管理对象的表达式,上下文管理对象必须实现 __enter__() 和 __exit__() 方法;只要实现这两个方法就能使用with方法 - 用途:管理文件的打开和关闭,以及其他一些资源的分配和释放 - 基本语法:with expression [as variable]: pass - 核心机制: ``` with 语句的执行过程: 1、调用 expression 的 __enter__() 方法,其返回值会被赋给 variable(如果有 as 子句)。 2、执行代码块。 3、无论代码块是否抛出异常,都会调用 expression 的 __exit__() 方法释放资源。 注意事项 1、异常处理:__exit__() 方法可以捕获并处理异常。如果返回 True,则异常会被抑制;否则异常会继续抛出。 2、嵌套使用:可以嵌套多个 with 语句: with open('input.txt') as infile, open('output.txt', 'w') as outfile: # 同时操作两个文件 pass 3、适用场景:适用于任何需要确保资源释放的场景,如网络连接、临时文件、数据库事务等 ``` ### 9-4、json文件的IO操作 ## 10、高阶内容 ### 10-1、迭代器 【demo-1】 - 含义:一个「可以被逐个取值」的对象,一次取一个,不占太多内存。比如 for 循环其实就是在用迭代器。 - 核心特征:实现了 __iter__() 和 __next__() 方法、用 next() 取下一个元素、数据取完会抛出 StopIteration - 用途:大数据按批读取(节省内存)、流式文件读取 / 网络数据流处理、数据分页 ### 10-2、生成器 【demo-2】 - 含义:一种简化版的迭代器。用 yield 代替 return,函数就能「暂停」和「继续」执行 - 用途:数据流式生成(避免一次加载全部)、 异步任务、数据管道、 大文件分块处理、 节省内存(非常常见) ### 10-3、装饰器 【demo-3-2】 - 含义:装饰器本质上是:接收一个函数,返回一个新函数。 - 作用:是把“横切关注点”(logging、性能统计、缓存、权限校验等)从业务逻辑中分离出来,做到复用和可组合。 #### 10-3-1、保持原始函数元数据:functools.wraps - 方式:@wraps(fn) 注意使用位置和方式 - 重要性:不使用 wraps 时,会遮盖原函数的 __name__、__doc__、签名等。用 functools.wraps 可以把这些信息拷贝到 wrapper。 - 用途:堆栈跟踪和打印函数名时能看到原始函数。一句话建议:只要你在写装饰器,就应该使用 functools.wraps。这是一个简单的习惯,但能让你的代码变得更加专业和健壮。 ## 11、进程和线程 - Unix/Linux操作系统提供了一个fork()系统调用,让父进程可以创建子进程。子进程永远返回0,而父进程返回子进程的ID ### 11-1、进程 - Pool:进程池 ### 11--2、线程 ## 12、异步IO - asyncio:内置了对异步IO的支持 - 含义:就是一个消息循环,内部实现了EventLoop,把需要执行的协程扔到EventLoop中,就实现了异步IO。 - async函数:把一个函数变成coroutine类型,然后再把这个函数扔到asyncio.run()中,就实现了异步IO。 - 【async 定义能力,await 表示暂停 、with / for 只要能等,就加 async 、并发靠 task,批量靠 gather】 ### 12-1、最主流、最标准的异步方案【1️⃣ async / await + 事件循环】【1-2】 - 特点:单线程、协作式并发(不是多线程)、遇到 await 才让出控制权 - 适用场景:✅ 高并发 I/O【HTTP 请求、数据库查询、Redis / MQ、WebSocket、FastAPI / aiohttp】 - 不适用:CPU 密集计算 ### 12-2、异步标识 - async def:定义协程函数,返回的是coroutine对象、不会立刻执行 - await:真正的“让出执行权”,等待一个 awaitable 对象,当前协程暂停,事件循环去跑别的任务 - async with: 异步上下文管理器 - async for: 异步迭代器 - asyncio.run(): 启动事件循环【创建事件循环,执行顶级协程,程序入口(只能用一次)】 - *asyncio.create_task() —— 并发执行 - *asyncio.gather() —— 并发等待 - *asyncio.wait() —— 更底层控制 - asyncio.sleep() —— 非阻塞 sleep - asyncio.to_thread() —— 调用同步函数 - | 标识 | 作用 | 典型场景 | | ----------- | ------ | --------- | | async def | 定义协程 | 所有异步函数 | | await | 等待并让出 | I/O 等待 | | async with | 异步资源管理 | HTTP / DB | | async for | 异步迭代 | 流式数据 | | asyncio.run | 启动循环 | 程序入口 | | create_task | 并发调度 | 后台任务 | | gather | 并发等待 | 批量请求 | | sleep | 非阻塞延时 | 定时任务 | | to_thread | 同步转异步 | 老库 | | Task | 已调度协程 | 任务控制 | | Future | 未来结果 | 底层抽象 |