GIN.
返回首页
Python
Python
uv
模块化

Python 常用操作与模块速查

Gin8 分钟

常用操作法

BASH
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

PYTHON
fruits = ['苹果', '香蕉', '橙子']
 
for index, fruit in enumerate(fruits,start=1):
    print(f"索引: {index}, 水果: {fruit}")
 

与或非

and 与 or 或 not 非 !=:检查两个值是否不相等。 is not:判断两个值是否不是同一个对象。 not in:检查一个元素是否不在元组、列表或字典中。

模块化

PYTHON
# a.py
def add(a,b):
    return a+b
 
# main.py
from a import add
add(1,2)
 
PYTHON
# src/a.py
src = 1
 
# main.py
import src.a as src # 或者    from src.a import src
 
a = src
 
PYTHON
# src/mysql/main.py
import config
data = config.database
 
# config.py
database="http://localhost:3306"
PYTHON
#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

PYTHON
try:
    xxxxx
except 错误类型:
    xxxxx
else   没有异常时:
    xxxxx
finally 不管有没有异常都执行
    xxxxx

raise

主动抛出异常

PYTHON
raise ValueError("错误")

数据类型

str

  • title() 首字母大写

类型转换

  • str()
  • int()

dict

dict.update():向字典中插入或更新键值对。

PY
# 获取字典的某个值
object:Dict[str,int] = {"age":17}
 
object.get("age",{}) 
object["age"]

tuple

PYTHON
tuples = ('a','b')
## 解包元组
b, c = tuples
b # a
c # b

file

PY
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 添加类型标注。

PYTHON
def get_full_name(first_name:str, last_name:str)->str:
    full_name = first_name.title() + " " + last_name.title()
    return full_name
PYTHON
# 给 list,dict,tuple,set等添加类型。使用typing
from typing import List,Dict,Tuple,Set
 
其中有子类型 则 List[str],Dict[str,str].......
 

其他

1. hasattr

判断某个对象是否有某个属性

PYTHON
from dataclasses import dataclass
 
@dataclass
class toolList:
    name:str
 
msg = toolList('a')
 
print(hasattr(msg,"n"))

常用模块

Rich

一个美化输出的模块

BASH
uv add rich
PYTHON
from 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

标注类型

PYTHON
from typing import Annotated, Literal, Optional, Union
 
Union[str, int]  # 相当于 TypeScript 的联合类型
Annotated[str, "说明"]  # 为类型附加额外说明
Literal["a", "b"]  # 限制变量只能取指定值
Optional[str]  # 等价于 str | None

Pydantic

用于数据校验。

PYTHON
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

PYTHON
from dotenv import load_dotenv
import os
 
# 加载.env文件
load_dotenv()
 
# 读取环境变量
database_url = os.getenv('DB_HOST')
api_key = os.getenv('DB_PORT')
 

yaml

YAML
keywords:
    - 解脱者
 
name:
    - 塞拉斯
PY
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 标准库,无需额外安装。

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

PY
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

将方法变成属性,只读

PYTHON
# 这是普通方法,使用时需要加括号
person.get_age()  # 调用方法
 
# 加了@property后,方法变成属性
person.age  # 像访问属性一样访问,不加括号

@dataclass

自动生成__init__, __repr__ , __eq__等方法

PYTHON
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'

如果处理数量不确定的同类型参数,使用* 返回元组

PYTHON
def concat(*strings):
    result = ""
    for str in strings:
        result +=str
    return result

如果处理数量不确定的字典,使用** 返回字典

PYTHON
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}"

自定义装饰器

装饰器本质上就是一个接收函数、返回函数的高阶函数,用来在不修改原函数代码的前提下,给它"包"上一层额外的功能。

PY
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}
 
有参数的装饰器
PY
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': '测试'}