1. Python基础语法入门:变量、注释与代码规范
刚接触Python时,很多人会疑惑为什么这个语言如此受欢迎。作为一个从Python 2.7时代就开始使用的老鸟,我认为它的魅力在于"简单事情简单做"的哲学。今天我们就来聊聊Python最基础的三个概念:变量、注释和代码规范,这些都是你写出优雅Python代码的基石。
Python的变量就像便利贴,你可以随时在上面写东西,也可以随时撕掉换新的。注释则是你写给未来自己或同事的小纸条,解释这段代码为什么要这么写。而代码规范就像交通规则,让不同人写的代码都能被其他人轻松理解。这三个概念看似简单,但真正掌握它们才能写出专业级的Python代码。
2. Python变量:不只是存储数据的容器
2.1 变量的本质与命名规则
在Python中,变量不需要声明类型,这和其他语言很不一样。当你写下x = 5时,Python会做三件事:
- 创建一个整数对象5
- 创建一个名为x的变量
- 将x指向这个整数对象
变量命名必须遵循以下规则:
- 只能包含字母、数字和下划线
- 不能以数字开头
- 不能是Python关键字(如if、else等)
- 区分大小写
提示:虽然
price和Price是两个合法变量名,但混用它们会导致难以发现的bug,建议统一使用小写。
我推荐使用蛇形命名法(snake_case)来命名变量,比如user_age而不是userAge。这是Python社区的约定俗成,虽然Python也支持驼峰命名法,但为了代码一致性,最好遵循PEP 8的推荐。
2.2 变量的动态特性
Python是动态类型语言,这意味着变量可以随时改变类型:
python复制x = 5 # x是整数
x = "hello" # 现在x是字符串
x = [1,2,3] # 又变成了列表
这种灵活性很方便,但也容易导致错误。比如:
python复制total = 0
total = "一百" # 突然变成字符串
result = total + 50 # 这里会报错
为了避免这类问题,我建议:
- 给变量起描述性名称
- 避免在代码中改变变量类型
- 使用类型注解(Python 3.5+):
python复制price: float = 9.99 # 明确表示price应该是浮点数
3. Python注释:写给未来的自己
3.1 注释的类型与最佳实践
Python有两种注释方式:
- 单行注释:以
#开头 - 多行注释:用三个引号
'''或"""包裹
好的注释应该解释"为什么"这么做,而不是"做什么"。比如:
python复制# 不好的注释
x = x + 1 # 给x加1
# 好的注释
x = x + 1 # 补偿数组索引偏移,因为API从1开始计数
我个人的注释习惯:
- 在函数/类定义下方用文档字符串说明用途
- 在复杂算法前用注释解释思路
- 在特殊处理处注明原因
- 避免显而易见的注释
3.2 文档字符串(Docstring)
文档字符串是Python特有的强大功能,可以通过help()函数查看。标准格式如下:
python复制def calculate_discount(price, discount_rate):
"""计算商品折扣后的价格
参数:
price (float): 商品原价
discount_rate (float): 折扣率(0-1之间)
返回:
float: 折扣后的价格
示例:
>>> calculate_discount(100, 0.2)
80.0
"""
return price * (1 - discount_rate)
注意:文档字符串应该遵循PEP 257规范,使用三重双引号,第一行简短描述,空一行后详细说明。
4. Python代码规范:PEP 8指南
4.1 基础格式规范
PEP 8是Python官方的代码风格指南,主要内容包括:
- 缩进:4个空格(不要用Tab)
- 行长度:不超过79个字符
- 空行:
- 函数/类定义前后各两行
- 方法定义前后各一行
- 导入:
- 分组导入,标准库在前
- 每行一个导入
- 避免通配符导入(from module import *)
示例:
python复制# 正确的导入方式
import os
import sys
from subprocess import Popen, PIPE
# 而不是
import os, sys
4.2 命名约定
PEP 8对不同对象有不同的命名约定:
- 变量/函数:小写+下划线(snake_case)
- 常量:全大写+下划线(UPPER_CASE)
- 类:驼峰命名法(CamelCase)
- 私有成员:单下划线开头(_private)
- 避免与关键字冲突:末尾加下划线(class_)
4.3 工具辅助
手动检查代码规范很麻烦,可以使用这些工具:
- flake8:检查PEP 8违规
- black:自动格式化代码
- isort:自动整理import语句
安装和使用:
bash复制pip install flake8 black isort
flake8 your_script.py # 检查
black your_script.py # 格式化
isort your_script.py # 整理imports
5. 常见问题与解决方案
5.1 变量相关错误
-
NameError: name 'var' is not defined
- 原因:使用了未定义的变量
- 解决:检查拼写,确保变量在使用前已赋值
-
UnboundLocalError: local variable referenced before assignment
- 原因:在函数内修改了全局变量
- 解决:使用
global关键字声明,或避免修改全局变量
5.2 注释相关技巧
-
快速注释/取消注释:
- VSCode:选中代码后按Ctrl+/
- PyCharm:选中代码后按Ctrl+/
-
多行字符串不是注释:
- 虽然三引号字符串可以当多行注释用,但它们实际上会创建字符串对象
- 对于真正的注释,还是应该用
#
5.3 代码规范检查
-
flake8常见错误:
- E501:行太长
- E302:函数间缺少空行
- W291:行尾有空格
- E225:运算符周围缺少空格
-
自动修复:
- 大多数格式问题可以用black自动修复
- isort可以自动整理import语句
6. 实战建议与个人经验
-
变量命名技巧:
- 避免使用
l、O等容易混淆的单个字母 - 布尔变量用
is_或has_开头,如is_valid - 集合/列表用复数形式,如
users而不是user_list
- 避免使用
-
注释习惯:
- 写代码时顺便写注释,不要留到以后
- 定期检查并更新过时的注释
- 删除无用的注释,它们会误导后来的维护者
-
代码规范执行:
- 在项目中添加
.flake8配置文件统一规则 - 在CI/CD流程中加入代码规范检查
- 使用pre-commit钩子在提交前自动检查
- 在项目中添加
我在实际项目中最常遇到的规范问题是行长度限制。当一行代码超过79字符时,可以考虑:
- 使用括号自然换行
- 将长字符串拆分为多个部分
- 提取部分逻辑到变量或函数
最后分享一个VSCode设置技巧,可以自动在保存时格式化代码:
json复制{
"editor.formatOnSave": true,
"python.formatting.provider": "black"
}
