当前位置: 首页 > news >正文

[Python 基础课程]注释

什么是注释

在编程语言中,注释是写给程序员自己或他人看的文本。它不会被 Python 解释器执行,也就是说,它不是程序的一部分,它仅仅是提供额外的说明、解释或备注。

注释的作用就像代码中的“便签”或“说明书”,它们帮助我们:

  • 理解代码: 解释代码的意图、逻辑或某个部分的复杂性。
  • 记录思考: 记下当初为什么选择这种实现方式,或者未来可能需要改进的地方。
  • 方便协作: 让你的队友更快地理解你的代码,提高团队的开发效率。
  • 调试: 临时禁用部分代码(虽然不推荐作为主要调试手段)。
# 产品经理说必须加这个需求,逻辑如下
# PM insisted this feature, stupid logic below:

Python 中的注释类型

Python 支持两种主要的注释类型:单行注释和多行注释。

单行注释

单行注释使用井号 # 开始, 从 # 符号开始,直到行尾的所有内容都被视为注释。

# 这是一个单行注释,它解释了下面的变量
name = "爱丽丝" # 变量 'name' 存储了用户的姓名# 你可以在代码上方写注释
age = 30# 不推荐使用行尾注释
print(name) # 打印用户的姓名
print(age)  # 打印用户的年龄

:::warning
单行注释可以单独占一行,也可以在代码行的末尾添加,但是一般规范的是单行,不推荐在代码行的末尾添加

:::

多行注释

Python 没有专门的多行注释语法。但是,我们通常使用**三引号字符串(Triple-quoted strings)**来充当多行注释。当这些三引号字符串没有被赋值给变量时,它们不会被解释器执行,因此起到了多行注释的作用。

多行注释使用三个单引号 ‘’’ 或三个双引号 “”" 包裹。它适用于需要解释一段代码块、函数或文件的整体功能时。

"""
这是一个多行注释的例子。
它可以跨越多行,用于解释代码的整体功能,
或者提供更详细的说明。
"""'''
你也可以使用三个单引号来创建多行注释。
效果是一样的。
这通常用于模块、类或函数的文档字符串(docstrings),
但也可以作为普通的多行注释使用。
'''def calculate_area(length, width):"""这个函数用于计算矩形的面积。参数:length (int/float): 矩形的长度。width (int/float): 矩形的宽度。返回:int/float: 矩形的面积。"""return length * widthprint(calculate_area(5, 10))

虽然三引号字符串可以充当多行注释,但它们更常用于编写 文档字符串(Docstrings)。文档字符串是紧跟在模块、类或函数定义之后的第一行非空字符串,它用于自动化文档生成工具提取代码说明。

help() 函数可以查看文档字符串:

def example_function():"""这是一个文档字符串。它用于解释函数的功能。"""passhelp(example_function)
# 输出会包含 "这是一个文档字符串。它用于解释函数的功能。"

普通的三引号注释只是为了给人看,而文档字符串则有特殊的地位,可以被工具识别和提取。

函数的文档字符串(函数文档)可以通过可以通过特殊属性 __doc__获取,比如:

def say_hai():"""打印 Hai:return:"""print("Hai")if __name__ == '__main__':print(say_hai.__doc__)

这里将 say_hai 这个函数的函数文档打印出来了。

什么是好的注释

注释不是越多越好,也不是越少越好,关键在于有效性

  • 解释“为什么”,而不是“是什么”:不好的例子:# 将 x 赋值为 10 (代码本身就说明了“是什么”),好的例子:# 限制最大用户数量,防止服务器过载 (解释了为什么做这个操作)
  • 解释复杂逻辑: 当代码逻辑比较复杂、不易理解时,添加注释来拆解或概括其思路
  • 解释非显而易见的变量: 当变量名本身不够清晰时,用注释补充其含义
  • TODO 或 FIXME: 标记待办事项或需要修复的问题
# TODO: 这里需要添加用户输入验证
# FIXME: 循环条件可能导致死循环,待修复
  • 高层次概括: 在函数或类定义的上方,用多行注释(文档字符串)概括其整体功能。
  • 保持更新: 代码修改后,及时更新相关注释,避免误导。过时的注释比没有注释更糟糕。
  • 避免冗余: 显而易见的代码不需要注释。
# 不好的注释
# print("Hello") # 打印 "Hello"
http://www.xdnf.cn/news/1190611.html

相关文章:

  • Flowable 实战落地核心:选型决策与坑点破解
  • uniapp 自定义tab栏切换
  • 全球化2.0 | 云轴科技ZStack亮相阿里云印尼国有企业CXO专家活动
  • 数据结构预备知识
  • JavaWeb01——基础标签及样式(黑马视频笔记)
  • 伟淼科技李志伟:破解二代接班传承困局,系统性方案破除三代魔咒
  • mysql查找数据库表中某几个连续的编号中中断的编号
  • 如何实现打印功能
  • Kafka——Java消费者是如何管理TCP连接的?
  • 两个USB-CAN-A收发测试
  • pytorch学习笔记-自定义卷积
  • 在C#中判断两个列表数据是否相同
  • Day04–链表–24. 两两交换链表中的节点,19. 删除链表的倒数第 N 个结点,面试题 02.07. 链表相交,142. 环形链表 II
  • # JsSIP 从入门到实战:构建你的第一个 Web 电话
  • VTK交互——ImageRegion
  • kali [DNS劫持] 实验(详细步骤)
  • python I 本地 html 文件读取方法及编码报错问题详解
  • Android 蓝牙学习
  • 在python3.8和pytorch1.8.1的基础上安装tensorflow
  • 对比JS“上下文”与“作用域”
  • kafka中生产者的数据分发策略
  • RabbitMQ面试精讲 Day 5:Virtual Host与权限控制
  • GMP模型
  • Qt 多线程编程最佳实践
  • 公域流量向私域流量转化策略研究——基于开源AI智能客服、AI智能名片与S2B2C商城小程序的融合应用
  • 数据结构 二叉树(2)---二叉树的实现
  • Spring AI Alibaba Video 示例
  • “三十二应身”架构设计:论高扩展性度化系统的实现原理
  • MyBatis_3
  • 想入门网络编程?——网络通信的基本概念