「Python代码的化妆师」:PEP8教你写出颜值爆表的程序!
本文包含两部分内容:
- 基础速递
- 经典示例
一、基础速递
Python PEP8 是 Python 官方推荐的代码风格指南(全称 Python Enhancement Proposal 8),旨在统一 Python 代码的书写规范,提升代码的可读性和一致性。无论是个人项目还是团队协作,遵循 PEP8 都能让代码更易维护和理解。
PEP8 的核心规则
以下是 PEP8 中一些关键规范:
-
缩进
- 每级缩进用 4 个空格(禁用 Tab 键)。
- 续行(如长表达式)需与包裹元素对齐或用悬挂缩进。
-
行长度
- 每行不超过 79 个字符(长文本/注释放宽至 72 字符)。
-
空格与运算符
- 在
=
,+
,-
,==
等二元运算符两侧加空格,但函数参数默认值(如def func(a=1)
)的等号不加。 - 避免多余空格(如紧贴括号或逗号后)。
- 在
-
空行
- 函数和类之间用 2 个空行分隔。
- 类内部方法之间用 1 个空行分隔。
-
导入(Imports)
- 每个导入语句独占一行。
- 分组顺序:标准库 → 第三方库 → 本地模块,组间用空行隔开。
- 避免通配符导入(如
from module import *
)。
-
命名规范
- 变量/函数名:小写 + 下划线(
snake_case
,如calculate_sum
)。 - 类名:首字母大写的驼峰式(
CamelCase
,如ClassName
)。 - 常量:全大写 + 下划线(
UPPER_CASE
,如MAX_SIZE
)。
- 变量/函数名:小写 + 下划线(
-
注释
- 使用英文句子,首字母大写,句末加句号。
- 避免无意义的注释(如
# 增加 x
),应解释“为什么”而非“做什么”。
-
异常处理
- 避免裸
except:
捕获所有异常,需明确指定异常类型(如except ValueError:
)。
- 避免裸
-
引号
- 单双引号均可,但需保持项目内统一。
-
尾部逗号
- 多行结构(如列表、元组)的最后一个元素可加逗号,便于后续扩展。
为什么重要?
- 可读性:统一的代码风格降低他人阅读成本。
- 协作效率:团队无需争论格式细节,专注逻辑实现。
- 减少错误:规范的结构能间接避免语法或逻辑疏漏。
工具支持
- 自动格式化工具:
autopep8
/black
:自动调整代码格式以符合 PEP8。flake8
/pylint
:检查代码规范并提供修改建议。
- IDE 插件:
PyCharm、VS Code 等编辑器内置 PEP8 检查功能。
例外情况
PEP8 是指导而非铁律。若遵循规范导致代码可读性下降(如长表达式强制换行),可灵活调整,但需保持上下文一致。
遵循 PEP8 能让你的代码更专业、更易于协作,建议在开发中结合工具养成习惯!
二、经典示例
以下是符合 PEP8 规范的代码示例及其说明,同时对比不符合规范的写法:
1. 缩进与换行
✅ 符合 PEP8
# 使用 4 个空格缩进
def calculate_sum(a, b):
result = (
a + b # 换行与包裹元素对齐
)
return result
❌ 不符合 PEP8
# 使用 Tab 或 2 空格缩进
def calculate_sum(a, b):
result = a + \ # 反斜杠换行(不推荐)
b
return result
2. 行长度限制
✅ 符合 PEP8
# 通过括号换行保持行长度 <=79 字符
long_string = (
"This is a very long string that needs to be split into "
"multiple lines for readability."
)
❌ 不符合 PEP8
# 单行超过 79 字符
long_string = "This is a very long string that needs to be split into multiple lines for readability, but it's not done here."
3. 命名规范
✅ 符合 PEP8
# 类名用 CamelCase,变量/函数用 snake_case,常量用 UPPER_CASE
class UserProfile:
MAX_AGE = 100
def __init__(self, user_name):
self.user_name = user_name
def get_user_data(self):
pass
❌ 不符合 PEP8
class userProfile: # 类名应为 CamelCase
maxAge = 100 # 常量应为 UPPER_CASE,变量名应用 snake_case
def GetUserData(self): # 方法名应为 snake_case
pass
4. 空格使用
✅ 符合 PEP8
# 运算符两侧加空格,函数参数默认值不加
x = 5 + 3
y = (x == 8)
def greet(name, greeting="Hello"):
print(f"{greeting}, {name}!")
❌ 不符合 PEP8
x=5+3 # 运算符两侧无空格
y = (x==8) # 比较运算符两侧无空格
def greet(name, greeting = "Hello"): # 默认值的等号两侧不应有空格
print(f"{greeting}, {name}!")
5. 导入规范
✅ 符合 PEP8
# 分组导入,每组用空行分隔
import os
import sys
from datetime import datetime
import requests # 第三方库
from .local_module import LocalClass # 本地模块
❌ 不符合 PEP8
# 混合导入,未分组
import sys, os # 多个导入在同一行
from datetime import *
from local_module import LocalClass
import requests
6. 注释与文档字符串
✅ 符合 PEP8
def calculate_area(radius):
"""Calculate the area of a circle.
Args:
radius (float): Radius of the circle.
Returns:
float: Area value.
"""
return 3.14 * radius ** 2 # 使用近似值 π=3.14(注释解释为什么)
❌ 不符合 PEP8
def calculate_area(r):
# 计算面积
return 3.14 * r**2 # 无意义的注释,参数名不清晰
7. 异常处理
✅ 符合 PEP8
try:
value = int("123")
except ValueError as e:
print(f"Error: {e}")
❌ 不符合 PEP8
try:
value = int("abc")
except: # 裸 except,未指定异常类型
print("Error!")
8. 引号一致性
✅ 符合 PEP8
# 统一使用双引号(或单引号,但需项目内一致)
message = "This is a string."
❌ 不符合 PEP8
message = 'This is a string.' # 如果项目中约定用双引号,则此写法不一致
工具自动格式化示例
使用 black
或 autopep8
等工具一键修正代码格式:
# 安装工具
pip install black
# 格式化文件
black your_script.py
通过对比示例,可以直观理解 PEP8 的规范要求。实际开发中建议结合工具自动检查(如 flake8
)和手动调整,确保代码风格统一!