2546 字
13 分钟
python相关备忘
2025-10-16

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-in

3. 关键语法#

# 修改全局变量
count = 0
def increment():
global count # 声明使用全局变量
count += 1
# 修改闭包变量
def outer():
num = 0
def inner():
nonlocal num # 声明使用闭包变量
num += 1

4. 查看命名空间#

print(globals()) # 查看全局命名空间
print(locals()) # 查看局部命名空间

5. 导入与命名空间#

import math # 安全: math.sqrt()
from math import sqrt # 明确: sqrt()
from math import * # 危险: 污染命名空间

核心要点:命名空间就像”变量住址”,决定了在哪里能找到变量,避免命名冲突。

虚拟环境#

创建虚拟环境#

Terminal window
python -m venv <环境名称> #主流使用.venv

他会在你的当前目录下创建一个对应名称的文件夹环境存在的地方

激活虚拟环境#

Terminal window
# Windows
<环境名称>\Scripts\activate
# macOS/Linux
source <环境名称>/bin/activate

退出虚拟环境#

Terminal window
deactivate

Python 命名规范(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_downloader
from rss_monitor import RSSMonitor
import 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 = False
max_retry_count = 3
# 常量(全大写 + 下划线)
MAX_CONNECTIONS = 10
DEFAULT_TIMEOUT = 30
CONFIG_FILE_PATH = "config.json"
# ❌ 错误
rssUrl = "..." # 小驼峰
RssUrl = "..." # 大驼峰(看起来像类)
IsDownloading = False # 看起来像类

🔄 对比表:Python vs Java#

元素Python 风格Java 风格记忆技巧
项目名anime_downloaderAnimeDownloaderPython:小写蛇形
包/模块rss_monitor.pyRssMonitor.javaPython:文件小写
类名RSSMonitorRssMonitor都驼峰,Python首字母大写
函数/方法get_items()getItems()Python:蛇形
变量item_listitemListPython:蛇形
常量MAX_ITEMSMAX_ITEMS一样!
布尔变量is_readyisReadyPython:蛇形

项目结构#

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 sys
print(f"__name__ = {__name__}")
#如果是直接运行这个模块的话,__name__就是__main__,
#如果是被调用的话,__name__是这个模块的名字。
print(__doc__)#打印这个模块的文档字符串

#

包是包含多个模块的目录,包含__init__.py文件。 Python 3.3 引入了“隐式命名空间包”, __init__.py 不再是必须的。 但是用__init__.py,你就可以import <包名>来直接调用你在init文件中导入的模块了。

package1/__init__.py
#显示表示这个包里有什么模块,这两个模块会放在package1的命名空间中
from . import module2
from . 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

导入方式#

main.py
#导入整个模块,主函数命名空间dir()只有module1(模块名)被占用
import module1
a=module1.a
# 从模块导入特定内容,主函数命名空间dir(),只有被import的命名会被占用,如果是*的话会把所有的module里的命令引入过来
from module1 import a, add
a=add(1,2)
#如果使用了as那就只会把as后的名称进入命名空间
import numpy as np
#不能使用numpy只能用np
import package1.module2#package1被导入到主函数命名空间,module1被导入package1的命名空间,即使没用__init__.py也行
#会被包的__all__控制
from package1 import *

包管理#

pip#

Terminal window
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文件中的所有依赖

Terminal window
pip install -e .
#-e代表编辑模式可以把自己的项目作为一个依赖放在依赖路径中,调用时可以当正常依赖调用

uv#

Terminal window
#列出所有可用的python版本,freetreaded实验版本不要用。
uv python list
#安装python
uv 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 安装命令描述
opencvuv add opencv-python开源计算机视觉库,用于图像处理和计算机视觉任务
matplotlibuv add matplotlibPython 绘图库,创建静态、动态和交互式可视化
numpyuv add numpy科学计算基础包,提供多维数组对象和各种派生对象
os(Python 内置)操作系统接口模块,提供文件和目录操作功能
subprocess(Python 内置)用于创建和管理子进程,执行外部命令
pynputuv add pynput控制和监控输入设备的库,支持键盘和鼠标监听
flaskuv add flask轻量级 Web 框架,简单灵活,适合小型项目和 API
djangouv add django高级 Web 框架,功能完整,适合大型企业级应用
fastapiuv add fastapi现代高性能 Web 框架,基于类型提示,自动生成 API 文档
ruffuv add ruff极速的 Python 代码检查器和格式化工具
BeautifulSouppip install beautifulsoup4HTML 和 XML 解析库,用于网页数据抓取
Pandasuv add pandas数据分析库,提供高性能、易用的数据结构和分析工具
PySideuv add PySide6Qt 框架的 Python 绑定,用于创建桌面应用程序
pathlib(Python 3.4+ 内置)面向对象的文件系统路径操作模块
IPythonuv tool install ipython一个功能强大的 交互式 Python 解释器
jupyteruv tool install jupyterlab一个基于浏览器的交互式计算环境,让你能在网页中写代码、运行代码、并立即看到结果。
python相关备忘
https://blog.cannian.space/posts/2025-10-16-python/
作者
Cannian
发布于
2025-10-16
许可协议
CC BY-NC-SA 4.0