Python 常用操作与模块速查
常用操作法
uv venv .venv # 新建虚拟环境
uv venv --python 3.11 .venv # 根据特定版本新建虚拟环境
uv init my-project # 新建项目
uv sync # 同步项目依赖
.venv\Scripts\activate # 激活虚拟环境
deactivate # 退出虚拟环境在.python-version修改python版本
Python 基础复习
enumerate
用于遍历列表/元组/字符串,获取索引和值
enumerate(iterable, start=0)
iterable: 任何可迭代对象(列表、元组等)
start: 索引起始值,默认为0
fruits = ['苹果', '香蕉', '橙子']
for index, fruit in enumerate(fruits,start=1):
print(f"索引: {index}, 水果: {fruit}")
与或非
and 与
or 或
not 非
!=:检查两个值是否不相等。
is not:判断两个值是否不是同一个对象。
not in:检查一个元素是否不在元组、列表或字典中。
模块化
# a.py
def add(a,b):
return a+b
# main.py
from a import add
add(1,2)
# src/a.py
src = 1
# main.py
import src.a as src # 或者 from src.a import src
a = src
# src/mysql/main.py
import config
data = config.database
# config.py
database="http://localhost:3306"#src/mysql/main
import config
data = config.database
def connect_to_db():
return data
# src / a
from .mysql.main import connect_to_db
异常
try-except
try:
xxxxx
except 错误类型:
xxxxx
else 没有异常时:
xxxxx
finally 不管有没有异常都执行
xxxxxraise
主动抛出异常
raise ValueError("错误")数据类型
str
- title() 首字母大写
类型转换
- str()
- int()
dict
dict.update():向字典中插入或更新键值对。
# 获取字典的某个值
object:Dict[str,int] = {"age":17}
object.get("age",{})
object["age"]tuple
tuples = ('a','b')
## 解包元组
b, c = tuples
b # a
c # bfile
with open("my_file.txt","w",encoding="utf-8") as file:
file.write("使用 with 语句写入的内容\n")
file.write("第二行内容")
"""
file.writelines(lines:list[any,any]):写入多条数据
"""open() 函数的第二个参数决定了写入行为:
| 模式 | 说明 | 文件不存在 | 文件存在 |
|---|---|---|---|
'w' | 写入(覆盖) | 自动创建 | 覆盖原内容 |
'a' | 追加 | 自动创建 | 在末尾添加内容 |
'x' | 独占创建 | 自动创建 | 抛出 FileExistsError 异常 |
typing
像 TypeScript 一样,为 Python 添加类型标注。
def get_full_name(first_name:str, last_name:str)->str:
full_name = first_name.title() + " " + last_name.title()
return full_name# 给 list,dict,tuple,set等添加类型。使用typing
from typing import List,Dict,Tuple,Set
其中有子类型 则 List[str],Dict[str,str].......
其他
1. hasattr
判断某个对象是否有某个属性
from dataclasses import dataclass
@dataclass
class toolList:
name:str
msg = toolList('a')
print(hasattr(msg,"n"))常用模块
Rich
一个美化输出的模块
uv add richfrom rich.console import Console
console = Console() #实例化
console.print("这是一条信息", style="bold blue") # 加粗 颜色
console.print("这是一条消息", style="#00ff00") # 十六进制
console.print("这是一条消息", style="rgb(0, 255, 0)") # rgb
console.print("这是一条消息", style="on rgb(0, 255, 0)") # 背景颜色
console.print(
style css
justify 对齐方式
)typing
标注类型
from typing import Annotated, Literal, Optional, Union
Union[str, int] # 相当于 TypeScript 的联合类型
Annotated[str, "说明"] # 为类型附加额外说明
Literal["a", "b"] # 限制变量只能取指定值
Optional[str] # 等价于 str | NonePydantic
用于数据校验。
from pydantic import BaseModel, EmailStr, Field, SecretStr, field_validator
# BaseModel 类似 TypeScript 的 interface
# Field 用于声明数值范围、字符串正则等校验规则
# field_validator 用于校验单个字段
# EmailStr 校验邮箱地址,SecretStr 保护敏感字段
# e.g.:
class User(BaseModel):
username: str = Field(min_length=2, max_length=20, description="用户名")
email: EmailStr = Field(description="邮箱")
age: int = Field(ge=0, le=150, description="年龄")
password: str = Field(min_length=6, description="密码")
"""
min_length: 最小长度
max_length: 最大长度
ge:大于等于
le:小于等于
gt:大于
lt:小于
"""env
from dotenv import load_dotenv
import os
# 加载.env文件
load_dotenv()
# 读取环境变量
database_url = os.getenv('DB_HOST')
api_key = os.getenv('DB_PORT')
yaml
keywords:
- 解脱者
name:
- 塞拉斯from pathlib import Path
import yaml
PROJECT_ROOT = Path(__file__).resolve().parent.parent # 得到项目根目录
def get_yaml(filename: str = "keywords.yaml") -> dict:
config_path = PROJECT_ROOT / filename
with open(config_path, "r", encoding="utf-8") as f:
return yaml.safe_load(f) or {}
getyaml() # {'keywords': ['解脱者'], 'name': ['塞拉斯']}
logging
logging 是 Python 标准库,无需额外安装。
import logging
logging.basicConfig(
# 日志级别:DEBUG < INFO < WARNING < ERROR < CRITICAL
# 设置DEBUG就能看到所有级别的日志
level=logging.DEBUG,
# 日志格式
format='%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s',
# 时间格式
datefmt="%Y-%m-%d %H:%M:%S",
# 输出到文件,不设置默认输出到控制台
filename='app.log',
# 文件写入模式 a=追加 w=覆盖
filemode='a',
# 编码
encoding='utf-8'
)
"""
format = (
'%(asctime)s' # 时间 2024-01-01 12:00:00
'%(levelname)s' # 级别 DEBUG INFO WARNING ERROR
'%(filename)s' # 文件名 main.py
'%(lineno)d' # 行号 42
'%(funcName)s' # 函数名 login
'%(name)s' # logger名称
'%(message)s' # 日志内容
)
"""json
import json
data = {
"name": "张三",
"age": 25,
"hobbies": ["读书", "游泳"],
"is_active": True
}
# 序列化 python dict -> json
json_str = json.dumps(data,indent=2)
# 反序列化 json -> python dict
data = json.loads(json_str)
常用装饰器
@property
将方法变成属性,只读
# 这是普通方法,使用时需要加括号
person.get_age() # 调用方法
# 加了@property后,方法变成属性
person.age # 像访问属性一样访问,不加括号@dataclass
自动生成__init__, __repr__ , __eq__等方法
from dataclasses import dataclass
@dataclass
class toolList:
name:str
def get_display_name(self, age):
obj = {
"self":self,
"age":age
}
return obj
item = toolList('join')
'*args'与'**kwargs'
如果处理数量不确定的同类型参数,使用* 返回元组
def concat(*strings):
result = ""
for str in strings:
result +=str
return result如果处理数量不确定的字典,使用** 返回字典
def requests_send(url,**requestOptions):
timeout = requestOptions.get("timeout")
method = requestOptions.get("methods")
header = requestOptions.get("header")
return f"url={url},timeout:{timeout},method:{method},header:{header}"自定义装饰器
装饰器本质上就是一个接收函数、返回函数的高阶函数,用来在不修改原函数代码的前提下,给它"包"上一层额外的功能。
def log(func):
def wrapper(*args, **kwargs):
print(f"调用参数: args={args}, kwargs={kwargs}")
return func(*args, **kwargs)
return wrapper
@log # 相当于create_user = log(create_user)
def create_user(name, age, city='Beijing', vip=False):
print(f"{name}, {age}, {city}, VIP={vip}")
create_user('job', 18, city='Shanghai', vip=True) # 调用参数: args=('job', 18), kwargs={'city': 'Shanghai', 'vip': True}
有参数的装饰器
from functools import wraps
def my_decorator(**kwargs): # 第1层:用**kwargs收集任意关键字参数
def decorator(func):
@wraps(func)
def wrapper(*args, **kw):
print(f"装饰器配置: {kwargs}")
return func(*args, **kw)
return wrapper
return decorator
@my_decorator(times=3, delay=2, name="测试")
def risky_function():
return "执行成功"
risky_function()
# 装饰器配置: {'times': 3, 'delay': 2, 'name': '测试'}