飞翔飞翔
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • 学习路径
  • 第1章 认识Python

    • Python 历史与特点
    • Python 2 与 Python 3 的核心差异
    • 安装与运行 Python 2.7.18
    • 编码规范 PEP 8
  • 第2章 基础语法

    • 变量与对象
    • 数字类型
    • 字符串 str
    • Unicode 字符串
    • 运算符
    • 空值 None
  • 第3章 流程控制

    • if 条件语句
    • if-else 条件语句
    • if-elif-else 多分支
    • 条件表达式(三元运算符)
    • while 循环
    • for 循环
    • range 与 xrange
    • 循环控制:break、continue、pass
    • 循环 else 子句
  • 第4章 数据结构

    • 列表基础
    • 列表方法
    • 列表推导式
    • 元组
    • 字典基础
    • 字典方法
    • 字典循环技巧
    • 集合
    • 序列解包
    • 序列比较
  • 第5章 函数

    • 定义函数
    • 参数传递机制
    • 默认参数
    • 关键字参数
    • 可变参数
    • Lambda 表达式
    • 文档字符串
    • 函数对象
  • 第6章 模块与包

    • import 导入
    • 模块搜索路径
    • name 与主程序
    • 编译文件 .pyc 与 .pyo
    • 包结构
    • dir() 函数
  • 第7章 文件与IO

    • 打开与关闭文件
    • 文件读写方法
    • with 上下文管理器
    • 格式化输出:% 操作符
    • 格式化输出:str.format()
    • JSON 序列化
  • 第8章 面向对象

    • 类定义与实例化
    • init 构造方法
    • 类变量与实例变量
    • 方法调用与 self
    • 继承基础
    • 多重继承
    • 新式类与旧式类
    • 私有变量与名称改写
    • 属性装饰器 property
    • 类方法与静态方法
    • 魔术方法
    • 空类与数据记录
  • 第9章 异常处理

    • 异常类型
    • try-except
    • try-except-else-finally
    • 抛出异常 raise
    • 自定义异常
    • with 语句与上下文管理器
  • 第10章 迭代器与生成器

    • 迭代器协议
    • 生成器函数
    • 生成器表达式
    • itertools模块
  • 第11章 标准库精要

    • os模块
    • sys模块
    • datetime模块
    • re模块
    • json模块
    • collections模块
    • math与random模块
    • urllib2与网络请求
    • subprocess与命令执行
    • threading与并发
    • unittest与测试
    • 虚拟环境与包管理
  • 第12章 工程实践

    • 调试技巧
    • 性能分析
    • 文档与注释
    • 下一步学习

编码规范 PEP 8

PEP 8 是 Python 官方的风格指南,由 Guido van Rossum 等人编写。它并非语法规则(违反不会报错),而是社区共识——遵循 PEP 8 的代码更容易被其他 Python 程序员阅读和维护。Python 之禅说:"可读性很重要(Readability counts)",PEP 8 就是这句话的具体实践。

缩进:4 个空格

Python 用缩进来表示代码块,而非大括号。PEP 8 规定使用 4 个空格 作为一级缩进,禁止使用 Tab 字符。

# 正确
if x > 0:
    print "positive"
    if x > 10:
        print "greater than 10"

# 错误:Tab 与空格混用
if x > 0:
	print "positive"    # 这是 Tab,不要这样做

混用 Tab 和空格是 Python 2 中最隐蔽的 bug 来源之一。解释器会抛出 IndentationError,但错误提示的位置往往让人困惑。大多数编辑器可以设置"将 Tab 自动转换为空格",建议开启这个功能。

行长度:79 字符

PEP 8 建议每行不超过 79 字符,文档字符串不超过 72 字符。这个限制源于早期终端的物理宽度,但沿用至今是因为它强迫程序员写出更简洁的表达式,避免嵌套过深。

如果一行太长,可以用圆括号隐式换行:

# 推荐:用圆括号包裹
result = (some_long_variable_name + another_long_name
          + yet_another_name)

# 也可以用反斜杠(不推荐,容易遗漏)
result = some_long_variable_name + another_long_name \
         + yet_another_name

命名规范

Python 社区对不同类型的标识符有约定俗成的命名方式:

# 模块/包/函数/变量:snake_case
import my_module
def calculate_average(scores):
    total_score = sum(scores)
    return total_score / len(scores)

# 类名:PascalCase(大驼峰)
class StudentRecord(object):
    pass

# 常量:UPPER_SNAKE_CASE
MAX_CONNECTIONS = 100
PI = 3.14159

# 私有成员:前导单下划线(约定,非强制)
class BankAccount(object):
    def __init__(self):
        self._balance = 0          # "内部使用,不要直接访问"

# 强私有/魔术方法:双下划线
class MyClass(object):
    def __init__(self):          # 构造方法
        pass
    def __str__(self):           # 字符串表示
        return "MyClass"

单下划线前缀 _name 是一种"温和"的隐私提示:它告诉其他程序员"这个属性是内部实现,外部不应直接访问",但技术上仍然可以访问。双下划线前缀 __name 会触发名称改写(name mangling),将 __name 变成 _ClassName__name,从而避免子类意外覆盖。

注释与文档字符串

行注释用 #,与代码之间至少隔两个空格:

x = x + 1  # 补偿边界

文档字符串(docstring) 用三引号,放在模块、函数、类的开头:

def calculate_average(scores):
    """计算分数列表的平均值。
    
    参数:
        scores: 包含数字的列表。
    
    返回:
        平均值,浮点数。如果列表为空返回 0.0。
    """
    if not scores:
        return 0.0
    return sum(scores) / float(len(scores))

文档字符串不是普通的注释,它可以通过 calculate_average.__doc__ 在运行时访问,也是 help() 函数的显示内容。

导入风格

导入语句应该分组排列,组之间空一行:

# 1. 标准库导入
import os
import sys
from math import sqrt

# 2. 第三方库导入
import requests
from django import db

# 3. 本地应用/模块导入
from mypackage import utils
from mypackage.models import User

避免 from module import *,因为它会导入模块中所有公开名称,可能覆盖你已有的变量,也让读者无法判断某个名字来自哪里。

# 不推荐
from os import *
print path.exists("file.txt")   # path 是从 os 导入的,不明显

# 推荐
import os
print os.path.exists("file.txt")

空行与空格

函数之间用两个空行分隔,类的方法之间用一个空行分隔:

def func_one():
    pass


def func_two():
    pass


class MyClass(object):
    def method_one(self):
        pass

    def method_two(self):
        pass

赋值和比较运算符两侧加空格,但函数调用和索引的括号内侧不加:

# 正确
x = 1
y = x + 2
if x == y:
    print func(x, y)
    print arr[0]

# 错误
x=1
y = x+2
if x==y:
    print func ( x , y )
    print arr[ 0 ]

一致性优先

PEP 8 的最后一条原则是:"当你无法判断时,保持一致。"如果你正在维护一个项目,而项目本身的风格与 PEP 8 有冲突(比如使用 2 个空格缩进),那么优先遵循项目现有风格,而不是强行套用 PEP 8。风格一致比风格正确更重要。

上一页
安装与运行 Python 2.7.18