Skip to content

Python 代码规范

PEP 8 与最佳实践


为什么需要代码规范?

  • 提高可读性
  • 便于协作
  • 减少错误
  • 专业形象

PEP 8 核心规则

1. 命名规范

python
#  好的命名
student_age = 25
total_income = 50000
calculate_mean()

class StudentRecord:
    pass

CONSTANT_VALUE = 100

#  不好的命名
s_age = 25         # 太简短
totalIncome = 50   # 驼峰(不是Python风格)
CalculateMean()    # 函数用驼峰

2. 缩进与空格

python
#  4个空格缩进
def process_data(data):
    for item in data:
        if item > 0:
            print(item)

#  运算符周围空格
x = 5 + 3
income = salary * 1.1

#  逗号后空格
numbers = [1, 2, 3, 4]

3. 行长度

python
#  每行不超过79字符
result = some_function(
    parameter1,
    parameter2,
    parameter3
)

#  长字符串换行
message = (
    "这是一段很长的文本,"
    "为了保持可读性,"
    "我们将它分成多行"
)

4. 导入顺序

python
#  正确顺序
# 1. 标准库
import os
import sys
from datetime import datetime

# 2. 第三方库
import pandas as pd
import numpy as np

# 3. 自己的模块
from mymodule import myfunction

最佳实践

1. 函数文档

python
def calculate_tax(income, rate=0.25):
    """计算税额

    Args:
        income (float): 年收入
        rate (float): 税率,默认0.25

    Returns:
        float: 应缴税额

    Example:
        >>> calculate_tax(100000, 0.3)
        30000.0
    """
    return income * rate

2. 异常处理

python
#  具体的异常
try:
    df = pd.read_csv('data.csv')
except FileNotFoundError:
    print("文件不存在")
except pd.errors.EmptyDataError:
    print("文件为空")

#  笼统的异常
try:
    df = pd.read_csv('data.csv')
except:
    print("出错了")

3. 使用列表推导式

python
#  简洁
squares = [x**2 for x in range(10)]

#  冗长
squares = []
for x in range(10):
    squares.append(x**2)

工具推荐

1. Black(自动格式化)

bash
pip install black
black my_script.py

2. Flake8(检查规范)

bash
pip install flake8
flake8 my_script.py

3. isort(排序导入)

bash
pip install isort
isort my_script.py

实用模板

数据分析脚本模板

python
"""
数据分析脚本模板
Author: Your Name
Date: 2024-01-01
"""

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 常量
DATA_PATH = 'data/raw/survey.csv'
OUTPUT_PATH = 'outputs/'

def load_data(filepath):
    """加载数据"""
    return pd.read_csv(filepath)

def clean_data(df):
    """清洗数据"""
    df = df.dropna()
    df = df[df['age'] > 0]
    return df

def analyze(df):
    """分析数据"""
    stats = df.describe()
    return stats

def main():
    """主函数"""
    # 加载
    df = load_data(DATA_PATH)

    # 清洗
    df_clean = clean_data(df)

    # 分析
    results = analyze(df_clean)

    # 保存
    results.to_csv(f'{OUTPUT_PATH}results.csv')

if __name__ == '__main__':
    main()

下一步

下一节:调试与性能分析

继续!

基于 MIT 许可证发布。内容版权归作者所有。