1. Python代码风格规范(PEP 8)入门指南
刚接触Python时,我经常被同事吐槽代码写得像"意大利面条"。直到系统学习了PEP 8规范,才明白好的代码不仅要能运行,更要像优美的散文一样易读。这份指南将带你快速掌握Python代码风格的核心要点,避开我当年踩过的坑。
PEP 8是Python官方的代码风格指南,涵盖了从命名规范到行长度等各个方面。遵守这些规范能让你的代码:
- 更易于团队协作和维护
- 减少低级语法错误
- 提升代码的可读性和一致性
- 更容易通过代码审查
2. 基础规范详解
2.1 命名规范
命名是代码可读性的第一道门槛。Python的命名约定遵循以下原则:
-
变量名:小写字母,单词间用下划线连接(snake_case)
python复制# 好的写法 student_name = "张三" max_score = 100 # 不好的写法 studentName = "张三" # 混合大小写 StudentName = "张三" # 类风格命名 -
常量名:全大写字母,单词间用下划线连接
python复制MAX_CONNECTIONS = 100 DEFAULT_TIMEOUT = 30 -
函数名:小写字母,动词开头,snake_case
python复制def calculate_average(scores): return sum(scores) / len(scores) -
类名:首字母大写的驼峰命名法(CapWords)
python复制class StudentRecord: pass
注意:避免使用单个字符作为变量名(除了简单的循环计数器如i/j/k)。描述性的名称能让代码自文档化。
2.2 代码布局
2.2.1 缩进
Python对缩进极其敏感,建议:
- 使用4个空格作为一级缩进(绝对不要用Tab)
- 续行应与包裹元素对齐
python复制# 正确的缩进 def long_function_name( var_one, var_two, var_three, var_four): print(var_one) # 错误的缩进(混用空格和Tab) def wrong_indent(): print("mixed") # 2 spaces print("indent") # 4 spaces
2.2.2 行长度
- 每行不超过79个字符(文档字符串/注释不超过72字符)
- 长表达式换行时,操作符应放在行首
python复制
total = (first_value + second_value - third_value)
2.2.3 空行
- 顶层函数和类定义之间空两行
- 类内方法定义之间空一行
- 相关函数组之间可空一行
python复制def function_one(): pass def function_two(): pass class MyClass: def method_one(self): pass def method_two(self): pass
2.3 导入规范
导入语句应该:
- 分组书写,顺序为:标准库→第三方库→本地应用/库
- 每组之间空一行
- 避免通配符导入(from module import *)
python复制# 正确的导入方式 import os import sys from typing import Dict, List import requests from flask import Flask from . import local_module from .submodule import helper
3. 表达式与语句规范
3.1 空格使用
在以下场景中应该避免多余空格:
-
紧贴括号/中括号/大括号内
python复制# 好的写法 spam(ham[1], {eggs: 2}) # 不好的写法 spam( ham[ 1 ], { eggs: 2 } ) -
在逗号、分号、冒号前
python复制# 好的写法 if x == 4: print(x, y); x, y = y, x # 不好的写法 if x == 4 : print(x , y) ; x , y = y , x
但在以下场景需要空格:
- 二元运算符两侧
python复制i = i + 1 submitted += 1 x = x*2 - 1
3.2 比较运算符
-
避免使用
==与True/False/None比较python复制# 好的写法 if greeting: # 不好的写法 if greeting == True: -
使用
is和is not检查Nonepython复制# 正确的None检查 if value is None: # 错误的None检查 if value == None:
3.3 异常处理
- 捕获异常时指定具体异常类型,避免裸
except: - 尽量少的代码放在try块中
python复制# 好的写法 try: value = int(input_str) except ValueError: value = 0 # 不好的写法 try: value = int(input_str) print("Got value:", value) # 不应该放在try块中 except: pass # 捕获所有异常
4. 注释与文档字符串
4.1 行内注释
- 与代码至少间隔2个空格
- 以
#加一个空格开始python复制x = x + 1 # 补偿边界条件
4.2 文档字符串
- 公共模块、函数、类和方法都应该有文档字符串
- 使用三重双引号
"""包裹 - 第一行是简要描述,结尾不加句号
- 第二行空行,第三行开始详细说明
python复制def calculate_average(numbers): """计算数字列表的平均值 参数: numbers: 包含数字的可迭代对象 返回: 平均值,如果列表为空返回0 """ if not numbers: return 0 return sum(numbers) / len(numbers)
5. 类型提示(Python 3.5+)
类型提示虽然不是PEP 8的强制要求,但能显著提升代码可维护性:
python复制from typing import List, Dict, Optional
def process_items(
items: List[str],
prices: Dict[str, float]
) -> Optional[float]:
"""处理商品列表和价格字典"""
total = 0.0
for item in items:
if item not in prices:
return None
total += prices[item]
return total
6. 常见问题与解决方案
6.1 代码格式化工具
手动遵守所有规则很困难,推荐使用自动化工具:
-
autopep8:自动格式化代码符合PEP 8
bash复制
pip install autopep8 autopep8 --in-place --aggressive --aggressive <filename> -
flake8:检查PEP 8违规
bash复制
pip install flake8 flake8 <filename>
6.2 何时可以违反PEP 8
PEP 8本身指出,在以下情况可以违反规范:
- 遵循规范会降低代码可读性
- 与周围代码保持一致性更重要
- 历史代码需要保持原有风格
但请确保这是经过深思熟虑的决定,而不是因为懒惰。
6.3 团队协作建议
-
在项目根目录添加
.flake8配置文件ini复制[flake8] max-line-length = 88 exclude = .git,__pycache__,old,build,dist ignore = E203 -
使用pre-commit钩子自动检查
yaml复制# .pre-commit-config.yaml repos: - repo: https://github.com/PyCQA/flake8 rev: 3.9.2 hooks: - id: flake8
7. 实战技巧与经验分享
-
长参数列表处理:当函数参数过多时,可以考虑以下模式
python复制def complex_function( param1, param2, param3, param4=None, param5="default"): """使用垂直对齐提高可读性""" pass -
字典字面量格式化:大字典可以这样写更清晰
python复制my_dict = { "key1": 1, "long_key_name": 2, "another_key": 3, } -
避免魔法数字:用常量代替直接使用的数字
python复制# 不好的写法 if status == 1: # 好的写法 ACTIVE = 1 if status == ACTIVE: -
字符串引号选择:PEP 8没有强制规定,但建议:
- 普通字符串用单引号
- 字符串中包含引号时用双引号
- 多行字符串用三重双引号
-
调试技巧:临时变量可以用下划线前缀
python复制
_temp = calculate_value() result = process(_temp)
记住,代码风格的一致性比死守规则更重要。刚开始可能会觉得这些规范很繁琐,但坚持几周后,你会发现写出优雅的Python代码已经成为一种本能。