2546 字
13 分钟
python相关备忘
Python
#调包的路径,字符数组形式可以自己加路径sys.path#查看当前命名空间的所有名称dir()特殊变量
一个普通模块的特殊变量
| 特殊变量 | 描述 | 常见用途 |
|---|---|---|
__annotations__ | 类型注解字典 | 类型检查、文档生成 |
__builtins__ | 内置函数模块 | 访问Python内置功能 |
__cached__ | 字节码缓存路径 | 性能优化、调试 |
__doc__ | 模块文档字符串 | 帮助文档、自动生成文档 |
__file__ | 模块文件路径 | 路径处理、资源加载 |
__loader__ | 模块加载器 | 高级导入机制 |
__name__ | 模块名称 | 条件执行、调试 |
__package__ | 包名称 | 相对导入、包管理 |
__spec__ | 模块规范 | 元编程、插件系统 |
如果是包的话多一个__all__变量 |
命名空间
1. 四种命名空间
- 内置:Python 自带函数 (
len,print等) - 全局:模块级别的变量和函数
- 闭包:嵌套函数的外部函数变量
- 局部:函数内部的变量
2. 查找顺序(LEGB规则)
name = "全局" # Global
def outer(): name = "闭包" # Enclosing
def inner(): name = "局部" # Local print(name) # 输出: "局部"
inner()
# 查找顺序: Local → Enclosing → Global → Built-in3. 关键语法
# 修改全局变量count = 0def increment(): global count # 声明使用全局变量 count += 1
# 修改闭包变量def outer(): num = 0 def inner(): nonlocal num # 声明使用闭包变量 num += 14. 查看命名空间
print(globals()) # 查看全局命名空间print(locals()) # 查看局部命名空间5. 导入与命名空间
import math # 安全: math.sqrt()from math import sqrt # 明确: sqrt()from math import * # 危险: 污染命名空间核心要点:命名空间就像”变量住址”,决定了在哪里能找到变量,避免命名冲突。
虚拟环境
创建虚拟环境
python -m venv <环境名称> #主流使用.venv他会在你的当前目录下创建一个对应名称的文件夹环境存在的地方
激活虚拟环境
# Windows<环境名称>\Scripts\activate# macOS/Linuxsource <环境名称>/bin/activate退出虚拟环境
deactivatePython 命名规范(PEP 8)
1. 项目/包/模块名(小写 + 下划线)
# ✅ Python 风格(蛇形命名法)my_project/├── anime_downloader/ # 包名├── rss_monitor.py # 模块名└── config_manager.py
# ❌ Java 风格(驼峰命名法)MyProject/├── AnimeDownloader/ # 看起来像类名!├── RssMonitor.py└── ConfigManager.py
# ❌ 其他错误My-Project/ # 不要用连字符(Python包名不能)myProject/ # 混合大小写(不推荐)2. 目录/文件夹名(小写 + 下划线)
# ✅ 正确project_name/├── src/ # 源代码目录├── tests/ # 测试目录├── docs/ # 文档目录├── scripts/ # 脚本目录├── data/ # 数据目录└── config/ # 配置目录
# ❌ 错误ProjectName/ # 看起来像类名src/ # 虽然可以,但最好用全小写Tests/ # 首字母大写,像模块名3. 模块名(小写 + 下划线)
# ✅ 正确import anime_downloaderfrom rss_monitor import RSSMonitorimport config_manager
# 文件对应:# anime_downloader.py# rss_monitor.py# config_manager.py
# ❌ 错误import AnimeDownloader # 看起来像导入类from RssMonitor import ... # 模块名应该小写import configManager # 混合大小写4. 类名(大驼峰命名法)
# ✅ 正确class RSSMonitor: # 大驼峰,首字母大写 pass
class AnimeDownloader: pass
class ConfigManager: pass
# ❌ 错误class rss_monitor: # 看起来像函数/变量class animeDownloader: # 小驼峰(Java风格)class config_manager: # 蛇形(应该是类方法)5. 函数/方法名(小写 + 下划线)
# ✅ 正确def download_episode(): # 函数:小写+下划线 pass
def parse_rss_feed(): pass
class RSSMonitor: def get_latest_items(self): # 方法:小写+下划线 pass
def save_to_database(self): pass
# ❌ 错误def DownloadEpisode(): # 看起来像类def parseRSSFeed(): # 小驼峰(Java风格)def Parse_RSS_Feed(): # 混合风格6. 变量名(小写 + 下划线)
# ✅ 正确rss_url = "https://example.com/rss"latest_episodes = []is_downloading = Falsemax_retry_count = 3
# 常量(全大写 + 下划线)MAX_CONNECTIONS = 10DEFAULT_TIMEOUT = 30CONFIG_FILE_PATH = "config.json"
# ❌ 错误rssUrl = "..." # 小驼峰RssUrl = "..." # 大驼峰(看起来像类)IsDownloading = False # 看起来像类🔄 对比表:Python vs Java
| 元素 | Python 风格 | Java 风格 | 记忆技巧 |
|---|---|---|---|
| 项目名 | anime_downloader | AnimeDownloader | Python:小写蛇形 |
| 包/模块 | rss_monitor.py | RssMonitor.java | Python:文件小写 |
| 类名 | RSSMonitor | RssMonitor | 都驼峰,Python首字母大写 |
| 函数/方法 | get_items() | getItems() | Python:蛇形 |
| 变量 | item_list | itemList | Python:蛇形 |
| 常量 | MAX_ITEMS | MAX_ITEMS | 一样! |
| 布尔变量 | is_ready | isReady | Python:蛇形 |
项目结构
project/├── package1/│ ├── __init__.py│ ├── module2.py│ └── module3.py├── package2/│ ├── __init__.py│ ├── package1/│ │ ├── __init__.py│ │ └── moudle4.py│ └── module5.py├── module1.py└── main.py模块
模块是一个python文件,里面可以含有函数,常量,变量,类,主函数。
比如
# 1. 模块的文档字符串"""module1
这个模块提供了什么功能作者时间等元数据"""# 2. 变量 (Variables)a=1
# 3. 常量 (Constants) - Python中没有真正的常量,但约定大写表示常量PI =3.14
# 4. 函数 (Functions)def add(a,b): return a+b
# 5. 类 (Classes)class Student:
def __init__(self, name=None, age=None): self._name = name self._age = age @property#相当于get方法 def age(self): return self._age
@age.setter#set方法 def age(self, value): self._age = value
# 6.模块的主函数import sysprint(f"__name__ = {__name__}")#如果是直接运行这个模块的话,__name__就是__main__,#如果是被调用的话,__name__是这个模块的名字。print(__doc__)#打印这个模块的文档字符串包
包是包含多个模块的目录,包含__init__.py文件。
Python 3.3 引入了“隐式命名空间包”, __init__.py 不再是必须的。
但是用__init__.py,你就可以import <包名>来直接调用你在init文件中导入的模块了。
#显示表示这个包里有什么模块,这两个模块会放在package1的命名空间中from . import module2from . import module3#init文件里可以写当这个包被调用时的函数,多次import这个包不会重复执行init文件里的主函数print("package1初始化文件被执行")#当然也能写包的函数,变量,常量,会进入到包的命名空间def add(a,b): return a+b#如果__init__.py里的命名和模块名重了,那么保留__init__.py里自带的,上面导入的模块将无法使用def module2(a,b):#p1.module2将不会指定到module2模块,而是这个函数 return a+b
from .module2 import add,PI
# 控制主函数 from package import * 引入的东西__all__ = ['add']#只引的进add导入方式
#导入整个模块,主函数命名空间dir()只有module1(模块名)被占用import module1a=module1.a# 从模块导入特定内容,主函数命名空间dir(),只有被import的命名会被占用,如果是*的话会把所有的module里的命令引入过来from module1 import a, adda=add(1,2)#如果使用了as那就只会把as后的名称进入命名空间import numpy as np#不能使用numpy只能用npimport package1.module2#package1被导入到主函数命名空间,module1被导入package1的命名空间,即使没用__init__.py也行#会被包的__all__控制from package1 import *包管理
pip
pip list# 生成环境库的列表pip freeze > requirements.txt#把requirements.txt里的依赖全安装下来pip install -r requirements.txt但是requirements.txt混合了所有直接和间接依赖, 所以现代配置依赖以及管理项目元数据使用pyproject.toml。
[project]name = "simple-project"version = "0.1.0"description = "一个简单的Python项目"authors = [{name = "Your Name"}]dependencies = [ "requests>=2.25.0", "click>=8.0.0", ][build-system]requires = ["setuptools>=45", "wheel"]build-backend = "setuptools.build_meta"使用pip安装.toml文件中的所有依赖
pip install -e .#-e代表编辑模式可以把自己的项目作为一个依赖放在依赖路径中,调用时可以当正常依赖调用uv
#列出所有可用的python版本,freetreaded实验版本不要用。uv python list#安装pythonuv python install [可选版本]#可以直接py脚本可以是python本身,进入对应版本的python解释器。如果没装过你指定的那个版本就会自动给你安装#后面-p <python版本>可以不写,toml文件中指定了版本,他就会自动调用那个版本,没指定就用已安装的最新的。#运行时自动进入该项目的虚拟环境uv run [-p <python版本>] <py脚本>#还可以运行python本身uv run python#还可以运行ruff等工具uv tool run [已安装的工具]#初始化一个标准python项目uv init [-p <python版本>]#自动帮你修改toml文件uv add <python库>#列出所有的依赖关系uv tree#工具将安装到全局uv tool install <工具名>uv tool list#根据当前项目的toml文件自动下载全部依赖nv sync教学视频
包管理 打包常用的库
| 库名 | PIP 安装命令 | 描述 |
|---|---|---|
| opencv | uv add opencv-python | 开源计算机视觉库,用于图像处理和计算机视觉任务 |
| matplotlib | uv add matplotlib | Python 绘图库,创建静态、动态和交互式可视化 |
| numpy | uv add numpy | 科学计算基础包,提供多维数组对象和各种派生对象 |
| os | (Python 内置) | 操作系统接口模块,提供文件和目录操作功能 |
| subprocess | (Python 内置) | 用于创建和管理子进程,执行外部命令 |
| pynput | uv add pynput | 控制和监控输入设备的库,支持键盘和鼠标监听 |
| flask | uv add flask | 轻量级 Web 框架,简单灵活,适合小型项目和 API |
| django | uv add django | 高级 Web 框架,功能完整,适合大型企业级应用 |
| fastapi | uv add fastapi | 现代高性能 Web 框架,基于类型提示,自动生成 API 文档 |
| ruff | uv add ruff | 极速的 Python 代码检查器和格式化工具 |
| BeautifulSoup | pip install beautifulsoup4 | HTML 和 XML 解析库,用于网页数据抓取 |
| Pandas | uv add pandas | 数据分析库,提供高性能、易用的数据结构和分析工具 |
| PySide | uv add PySide6 | Qt 框架的 Python 绑定,用于创建桌面应用程序 |
| pathlib | (Python 3.4+ 内置) | 面向对象的文件系统路径操作模块 |
| IPython | uv tool install ipython | 一个功能强大的 交互式 Python 解释器 |
| jupyter | uv tool install jupyterlab | 一个基于浏览器的交互式计算环境,让你能在网页中写代码、运行代码、并立即看到结果。 |