Python 基础之函数命名
几个问题
- 使用描述性蛇形命名法(snake_case)
- Python函数名应使用什么大小写格式?
- 为什么函数名要具有描述性?
- 方法的命名规范是什么?
- 函数、变量和类的命名有何区别?
Python函数的命名有一些不可违背的硬性规则,还有一些虽不报错但影响代码Python风格的重要约定。恰当的命名能提升代码可读性、便于维护,还能减少错误。
使用描述性蛇形命名法(snake_case)
Python中,对象的标识符称为名称(names)。函数名通过def
关键字定义。命名时可使用大小写字母、数字(不能开头)和下划线(_
)。虽然Unicode字符也可用,但建议仅使用ASCII字符以保证通用性。
有效与无效名称示例:
名称 | 有效性 | 说明 |
---|---|---|
number | 有效 | |
first_name | 有效 | |
first name | 无效 | 不能含空格 |
first_10_numbers | 有效 | |
10_numbers | 无效 | 不能以数字开头 |
_name | 有效 | |
greeting! | 无效 | 仅允许下划线作为标点 |
café | 有效 | 但不推荐 |
根据PEP 8风格指南,函数名应使用小写字母+下划线分隔(蛇形命名法)。例如:calculate_total()
优于total()
。
函数名应使用什么大小写格式?
不同编程语言偏好不同格式(如蛇形、驼峰)。Python函数推荐使用蛇形命名法(全小写+下划线分隔),例如:
find_winner()
save()
特殊前缀/后缀规则:
- 单前导下划线(如
_internal()
):表示内部使用,非强制私有。 - 单后缀下划线(如
import_()
):避免与关键字冲突。 - 双前导下划线(如
__private()
):触发名称改写(name mangling),用于类属性。
虽然蛇形命名是标准,但偶尔会见到驼峰式(如findWinner()
),通常因历史遗留或跨语言习惯。除非维护旧代码库,否则应避免。
为什么函数名要具有描述性?
可读性是现代编程的核心原则。对比以下两段代码:
# 不清晰的命名
def init(n): return " ".join(f"{i[0]}." for i in n.split()) # 清晰的命名
def get_initials(full_name): return " ".join(f"{name[0]}." for name in full_name.split())
后者通过函数名get_initials
和参数名full_name
直接表明用途,调用示例:
>>> get_initials("James Clerk Maxwell")
"J. C. M."
命名平衡:
- 避免过长(如
find_number_of_vowels()
可简化为find_num_vowels()
)。 - 早期编程受限于硬件需简短命名,如今更强调可读性。
方法的命名规范是什么?
方法(类中的函数)命名规则与普通函数相同,但需注意:
- 特殊方法(如
__init__()
):双下划线包裹,由Python调用。 - 非公共方法:单前导下划线(如
_verify_funds()
),提示内部使用。
示例:银行账户类
class BankAccount: def __init__(self, account_number, balance): self.account_number = account_number self.balance = balance def _verify_funds(self, amount): # 内部方法 return self.balance >= amount def withdraw(self, amount): # 公共接口 if self._verify_funds(amount): self.balance -= amount return True return False
函数、变量和类的命名有何区别?
- 变量:蛇形命名(如
selling_price
),常量全大写(如TIME_LIMIT
)。 - 类:首字母大写的驼峰式(如
BankAccount
),但内置类型(如list
)例外。 - 异常类:驼峰式+后缀
Error
(如SyntaxError
)。
1. 函数名应使用什么大小写格式?
- 小写蛇形命名法(snake_case):单词全小写,用下划线连接
例如:calculate_total()
,get_user_data()
- 为什么?:这是Python标准约定,与其他命名形式(如类名)形成明确区分。
2. 为什么函数名要具有描述性?
- 提高可读性:描述性名称能直接表达函数的功能(如
validate_email()
比check()
更清晰)。 - 减少注释依赖:好的函数名可以替代部分注释,让代码更自解释。
- 便于维护:清晰的命名能帮助其他开发者(或未来的你)快速理解代码逻辑。
3. 方法的命名规范是什么?
- 与函数相同:实例方法、类方法、静态方法均使用 小写蛇形命名法(snake_case)。
例如:class User: def get_name(self): ...
- 特殊情况:
- 魔术方法(双下划线包围):
__init__
,__str__
- 私有方法(单下划线开头):
_internal_logic()
(仅约定,非强制私有)
- 魔术方法(双下划线包围):
4. 函数、变量和类的命名区别
类型 | 命名规范 | 示例 |
---|---|---|
函数 | 小写蛇形(snake_case) | process_data() |
方法 | 小写蛇形(snake_case) | user.get_id() |
变量 | 小写蛇形(snake_case) | max_count = 100 |
类 | 大驼峰(PascalCase) | class DatabaseClient: |
常量 | 大写蛇形(SCREAMING_SNAKE_CASE) | MAX_SIZE = 1024 |
- 关键区别:
- 类名用大驼峰,其他(函数/方法/变量)用小写蛇形。
- 常量通过全大写显式标识。
附:PEP 8命名原则
- 一致性:项目内保持命名风格统一。
- 避免歧义:如不要用
l
(小写L)、O
(大写o)等易混淆字符。 - 描述性 > 简洁:
calculate_monthly_revenue()
优于calc_mrev()
。