程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Python 基础

    • Python基础
  • Python 进阶

    • 装饰器与生成器
    • 异常处理
    • 标准库精讲
    • 模块与包
    • pip包管理工具
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
前端 (opens new window)
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Python 基础

    • Python基础
  • Python 进阶

    • 装饰器与生成器
    • 异常处理
    • 标准库精讲
    • 模块与包
    • pip包管理工具
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
前端 (opens new window)
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • Python 基础

    • 环境搭建
    • 标识符
    • 变量
    • 缩进和注释
      • 1. 缩进:Python 的语法基石
        • 1.1 为什么缩进如此重要?
        • 1.2 缩进的黄金法则 (PEP 8 规范)
        • 1.3 缩进的应用场景
        • 1.4 常见的缩进错误 (IndentationError)
      • 2. 注释:让代码“会说话”
        • 2.1 注释的类型
        • 1. 单行注释 (#)
        • 2. 多行注释 (文档字符串)
        • 2.2 文档字符串 (Docstring) 的艺术
        • 2.3 编写高质量注释的最佳实践
      • 3. 综合实践:优雅的代码风格
    • 数据类型
    • 数据类型转换
    • 运算符
    • 字符串
    • 列表
    • 元组
    • 字典
    • 集合
    • if判断
    • for循环
    • while循环
    • 循环综合练习
    • Python函数
    • 函数与循环实战
    • 生成式
    • 文件读写
    • 面向对象
    • 面向对象综合案例
  • Python 进阶

  • Python
  • Python 基础
scholar
2025-07-20
目录

缩进和注释

# 缩进与注释

Python 是一门非常注重代码可读性的语言,其强制性的缩进规则和灵活的注释系统是实现这一目标的核心。理解并掌握它们,是写出优雅、规范、易于维护的 Python 代码的第一步。


# 1. 缩进:Python 的语法基石

在许多编程语言(如 C++、Java)中,代码块由花括号 {} 包裹。然而,Python 独树一帜,使用 缩进(Indentation) 来定义代码块的层级结构。这不仅是为了美观,更是 Python 的 强制语法要求。

# 1.1 为什么缩进如此重要?

  • 定义代码块:缩进是 Python 识别 if 语句、循环(for, while)、函数(def)、类(class)等逻辑结构的唯一方式。
  • 强制代码可读性:通过统一的缩进,所有 Python 代码都保持着高度相似的视觉结构,大大降低了阅读和理解他人代码的难度。
  • 避免语法错误:不正确的缩进会导致 IndentationError,程序将无法运行。

# 1.2 缩进的黄金法则 (PEP 8 规范)

PEP 8 是 Python 官方的代码风格指南,其中对缩进有明确的建议:

  1. 使用 4 个空格作为一级缩进:这是社区最广泛接受的标准。
  2. 使用空格而非制表符 (Tab):虽然 Tab 也能实现缩进,但它在不同编辑器中的显示宽度可能不一致,容易引发混乱。Python 3 不允许混合使用空格和 Tab,否则会直接报错。强烈建议将你的编辑器设置为“按 Tab 键自动转换为空格”。
  3. 保持一致:同一个代码块内的所有语句,必须保持完全相同的缩进量。

# 1.3 缩进的应用场景

# 场景一:if-elif-else 判断
age = 20
if age >= 18:
    print("你已成年。")  # if 代码块,缩进4个空格
    print("可以独立承担法律责任。") # 同上
else:
    print("你还未成年。") # else 代码块,缩进4个空格

# 场景二:for 循环
for i in range(3):
    print(f"这是第 {i+1} 次循环。") # for 循环体,缩进4个空格

# 场景三:函数定义与嵌套缩进
def check_user(name, is_vip):
    """一个演示嵌套缩进的函数"""
    print(f"欢迎, {name}!")
    
    if is_vip:
        print("您是尊贵的 VIP 用户。") # if 代码块,在函数基础上再缩进4个空格
        print("享有专属特权。")       # 嵌套缩进为 8 个空格
    else:
        print("您是普通用户。") # else 代码块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 1.4 常见的缩进错误 (IndentationError)

  • expected an indented block (期望一个缩进块) 这通常发生在该有缩进的地方没有缩进,比如 if、for 语句的冒号之后。

    # 错误示例
    if True:
    print("这里会报错") # 错误:冒号后缺少缩进
    
    1
    2
    3
  • unexpected indent (意外的缩进) 这发生在不应该有缩进的地方添加了缩进。

    # 错误示例
    name = "Alice"
      print(name) # 错误:此行不属于任何代码块,不应缩进
    
    1
    2
    3
  • unindent does not match any outer indentation level (取消缩进与外部缩进级别不匹配) 这通常是由于缩进层次混乱,比如一个块里的缩进量不一致。

    # 错误示例
    if True:
        print("第一行,4个空格")
       print("第二行,5个空格,导致错误") # 错误:与上一行缩进不一致
    
    1
    2
    3
    4

# 2. 注释:让代码“会说话”

注释是代码中不会被解释器执行的部分,它的唯一目的是向阅读代码的人(包括未来的你自己)解释代码的逻辑、意图和用法。

# 2.1 注释的类型

# 1. 单行注释 (#)

以 # 开头,从 # 到行尾的所有内容都属于注释。

  • 块注释 (Block Comments):用于解释紧随其后的一整段代码的功能。

    # 检查用户登录状态,如果未登录则跳转
    if not user.is_logged_in:
        redirect_to_login_page()
    
    1
    2
    3
  • 行内注释 (Inline Comments):跟在代码行的后面,用于解释该行代码的特殊之处。PEP 8 建议行内注释与代码至少隔开 两个空格。

    x = x + 1  # 计数器加一
    
    1

# 2. 多行注释 (文档字符串)

Python 没有专门的多行注释语法,但通常使用三个单引号 '''...''' 或三个双引号 """...""" 包裹的字符串字面量来达到多行注释的效果。

这种形式的注释有一个更重要且官方的用途——文档字符串(Docstring)。

# 2.2 文档字符串 (Docstring) 的艺术

Docstring 是模块、函数、类或方法定义中的第一个语句。它会成为该对象的 __doc__ 属性,是 Python 内省机制的重要组成部分。help() 函数、IDE 和各种文档生成工具都会利用 Docstring 来展示帮助信息。

一个好的 Docstring 应该简洁地概括对象的功能,并说明其参数、返回值等。

  • 简单的单行 Docstring

    def say_hello():
        """打印一条问候信息。"""
        print("Hello, World!")
    
    1
    2
    3
  • 规范的多行 Docstring (Google 风格示例)

    class Student:
        """学生类,用于存储和管理学生信息。
    
        Attributes:
            name (str): 学生姓名。
            age (int): 学生年龄。
        """
    
        def __init__(self, name, age):
            """初始化学生对象。
    
            Args:
                name (str): 学生的姓名。
                age (int): 学生的年龄,必须为正整数。
            """
            self.name = name
            self.age = age
    
        def get_details(self):
            """获取学生的详细信息字符串。
    
            Returns:
                str: 包含学生姓名和年龄的描述性字符串。
            """
            return f"学生姓名: {self.name}, 年龄: {self.age}"
    
    # 如何查看 Docstring
    # print(Student.get_details.__doc__)
    # help(Student)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29

# 2.3 编写高质量注释的最佳实践

  • 注释要保持更新:过时的注释比没有注释更糟糕,因为它会误导读者。
  • 注释“为什么”,而不是“是什么”:好的代码本身就能说明它“是什么”,注释应该聚焦于代码背后的设计意图和“为什么”要这么写。
  • 简洁明了:避免写冗长、复杂的注释。
  • 避免无意义的注释:
    # 差的注释
    i = 1  # 将 i 设置为 1
    
    # 好的注释
    i = 1  # 初始化循环起始索引为 1 (因为 0 是特殊情况)
    
    1
    2
    3
    4
    5

# 3. 综合实践:优雅的代码风格

下面是一个结合了良好缩进和规范注释的综合示例:

def find_first_even(numbers):
    """
    在一个整数列表中查找并返回第一个偶数。

    Args:
        numbers (list of int): 一个包含整数的列表。

    Returns:
        int or None: 如果找到偶数,则返回第一个偶数;
                     如果列表中没有偶数,则返回 None。
    """
    
    # 遍历列表中的每一个数字
    for num in numbers:
        # 使用取模运算符检查数字是否为偶数
        if num % 2 == 0:
            print("已找到第一个偶数。")
            return num  # 找到后立即返回,结束函数
            
    # 如果循环正常结束(没有中途 return),说明没有找到偶数
    print("列表中没有偶数。")
    return None


# --- 函数调用示例 ---
my_numbers = [1, 3, 5, 8, 10, 13]
first_even_number = find_first_even(my_numbers)  # 调用函数

if first_even_number is not None:
    print(f"找到的第一个偶数是: {first_even_number}")
else:
    print("未找到任何偶数。")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

在这个示例中,清晰的缩进定义了代码的逻辑流程,而规范的 Docstring 和恰到好处的注释则让代码的意图一目了然。

编辑此页 (opens new window)
上次更新: 2025/07/23, 06:33:16
变量
数据类型

← 变量 数据类型→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式