变量与命名规范从入门到精通(最新推荐)
更新时间是二零二六年二月二十五日, 具体时间为上午九点三十六零四秒, 作者是张三蜂。
这篇文章所描述的编程语言, 把可读性看得很重, 在变量的使用上面有一套属于自己的独特思路, 本文将会深入到变量是什么东西这个层面去进行探讨, 同时也介绍一些使用上面的技巧, 还会详细说明命名的规则到底是什么, 希望这样的内容能够帮助大家写出那种代码质量很高的程序, 整个文章的内容是关于变量以及命名规范方面的, 是从最基本的入门知识一直到最后的精通水平, 对于这种话题感兴趣的用户朋友们可以一起过来阅读查看。
引言:为什么变量和命名如此重要?
想象一种状况, 就是你正在读一本小说, 小说里面的所有角色全都叫同一个名字, 叫做“一个人”, 那就会变得非常混乱, 也会让人觉得困惑, 根本没法子去理解这种情境。
编程这件事情也是同样的道理, 变量其实就是用来存放数据的容器, 而给变量取名字呢, 就是贴上这些容器的标签。如果大家都能遵守良好的命名规范, 那么阅读代码这件事儿就会变得更简单容易, 同时也能够减少程序中错误的数量, 还能提高团队成员之间互相协作的效率。
因为这门语言很看重好不好看, 所以呢, 它关于变量这个东西的思考方法跟别的不一样。这篇文章里面会把变量的实际样子、用的时候有什么门道、还有起名字的时候要遵守什么规矩, 这些都讲得比较深一点, 目的就是为了让大家能够写出那种读起来很清楚、写出来也正规的代码。
第一章我们对变量进行深度解析, 第一部分的内容是讲一讲到底什么是变量。
在代码中间这个地方, 变量大家都能这么去理解它,它就是指向内存里面那个对象的标签, 和别人家别的编程语言不一样的是, 这个变量不需要你先期去声明它的类型是什么, 等到代码跑起来的时候, 它会根据你给它赋的那个对象是什么, 自己就把类型给推断出来了。
# 变量的基本赋值message = "Hello, Python" # 字符串类型
count = 42 # 整数类型
price = 19.99 # 浮点类型
is_valid = True # 布尔类型
1.2 变量的内存模型
要搞清楚这个事儿, 理解内存模型对于变量来说是一个关键点:
# 变量是对象的引用a = [1, 2, 3] # a 引用了列表对象
b = a # b 引用了同一个列表对象
b.append(4) # 修改b指向的列表
print(a) # 输出: [1, 2, 3, 4] - a也改变了!
# 验证内存地址
print(id(a)) # 输出内存地址
print(id(b)) # 与a相同,证明指向同一对象
1.第三, 是动态类型以及在编程的时候系统帮忙进行的类型推断过程。
这种语言属于动态类型语言的范畴, 其中变量所指向的对象的具体数据类型能够在运行的时候被随时进行修改和变更。
# 变量的类型可以动态改变x = 10 # x是整数
print(type(x)) #
x = "Hello" # x现在是字符串
print(type(x)) #
x = [1, 2, 3] # x现在是列表
print(type(x)) #
1.关于多重赋值以及序列解包这一内容, 这里需要提及。
这个功能给到了大家一个可以灵活地进行赋值操作的方法。
# 多重赋值a, b, c = 1, 2, 3
print(a, b, c) # 1 2 3
# 交换变量 - Python特色语法
x, y = 10, 20
x, y = y, x # 优雅地交换
print(x, y) # 20 10
# 序列解包
numbers = [1, 2, 3]
first, second, third = numbers
print(first) # 1
# 使用星号收集剩余元素
first, *rest, last = [1, 2, 3, 4, 5]
print(first) # 1
print(rest) # [2, 3, 4]
print(last) # 5
1.5 变量的作用域
变量存在不同层级, 它们各自具有不同的有效使用范围。
# LEGB规则:Local -> Enclosing -> Global -> Built-inglobal_var = "全局变量" # 全局作用域
def outer_function():
enclosing_var = "嵌套变量" # 嵌套作用域
def inner_function():
local_var = "局部变量" # 局部作用域
print(local_var)
print(enclosing_var) # 可以访问外层变量
print(global_var) # 可以访问全局变量
inner_function()
outer_function()
1.第 6 章, 是常量与变量。
其实根本就不存在所谓的真正的常量, 可是我们可以使用那些约定的命名方式, 好让大家都明白它代表的是一个常量的意思, 是这样的。
# 常量通常用大写字母命名MAX_CONNECTIONS = 1000
DEFAULT_TIMEOUT = 30
PI = 3.14159
# 注意:这仍然是变量,可以修改,但不应该修改
MAX_CONNECTIONS = 2000 # 技术上可行,但违反约定
第二章关于命名规范权威指南这一文档, 其中的第二点一章节主要讲的是为什么需要命名规范这个问题。
命名规范要是能够保持得好, 那是能够带来非常多实际好处的。
2.2 命名规范总览
那个被叫做PEP 8的官方风格指南, 它其实就是给大家规定好了下面这几个最主要的规矩。
关于类型命名规范的示例说明如下。
变量名
小写+下划线
,
最常用的变量命名
常量
大写+下划线
,
表示不应修改的值
函数名
小写+下划线
(), ()
让动词作为句子的开头部分会更好一些。
类名
驼峰式
,
每个单词首字母大写
私有变量
在前导位置的下划线。
这是表示该事物是属于内部使用范围的。
魔术变量
双下划线包裹
,
这种所谓的特殊方法。
避免使用
单个下划线
临时或无关变量
2.第3项, 是关于变量命名的最佳实践里面的, 也就是2.3.1部分, 这一部分的内容是建议大家去使用那些能够具有明显描述意义的名称。
# 不好的命名a = "张三"
b = 25
c = True
# 好的命名
user_name = "张三"
user_age = 25
is_active = True
2.在第3.2条内容中, 我们要避免地去使用那些含义不太明确且带有模糊性质的简称。
# 不好的命名usr_cnt = 10
txt = "Hello"
val = calculate()
# 好的命名
user_count = 10
message_text = "Hello"
result = calculate()
2.在使用动词开头来表示函数的时候。
# 不好的函数命名def name():
return user.name
def data():
return fetch_data()
# 好的函数命名
def get_user_name():
return user.name
def fetch_user_data():
return fetch_data()
2.关于3.4部分中, 那些用于表示布尔类型数据的变量的名字是怎么起的。
# 布尔变量通常用is/has/can开头is_authenticated = True
has_permission = False
can_edit = True
is_visible = False
2.4特殊命名场景2.4.1单字符变量的合理的, 使用。
在有些情况当中, 使用单个字符作为变量名称这件事情是能够被大家所认可的。
# 循环计数器for i in range(10): # i, j, k 常用于循环计数
print(i)
# 数学公式
for x, y in points: # x, y 常用于坐标
distance = (x**2 + y**2)**0.5
# 临时变量
_, value = get_pair() # _ 表示我们不关心的值
2.在4.2部分里, 我们会聊到私有属性这东西, 还有名称修饰是怎么一个回事。
我们是通过去使用那种叫做命名约定的方式, 来间接地完成对于私有性的这种要求的实现的。
class User:def __init__(self, name):
self.name = name # 公有属性
self._internal_id = 123 # 私有属性(约定)
self.__password = "secret" # 名称修饰(避免子类冲突)
def _internal_method(self): # 私有方法
pass
def __str__(self): # 魔术方法
return self.name
# 访问测试
user = User("Alice")
print(user.name) # 可以访问
print(user._internal_id) # 技术上可以访问,但不应该
# print(user.__password) # 报错:属性不存在
print(user._User__password) # 名称修饰后的实际名称
2.常见的命名错误都有哪些, 以及应该如何去避免这类错误发生, 以下会逐一列出错误的类型, 并提供具体的错误示例来说明问题所在, 最后给出正确的做法。
与关键字冲突
class = "math"
语法错误
= "math"
请采用系统预设的那些名字。
list =
覆盖内置函数
=
混淆字母数字
O0 = 100
易读性差
变量的值被设定为一百。
过度缩写
含义模糊
长度极端
a vs long
极端都不好
适中描述性
第三章在进阶技巧和最佳实践这一部分中, 关于3.1节的内容是类型提示。
3.支持类型注解, 使得代码的可读性能够得到提高。
from typing import List, Optional# 带类型注解的变量
name: str = "Alice"
age: int = 30
scores: List[float] = [95.5, 87.0, 92.5]
# 函数参数和返回值类型注解
def greet(user_name: str, is_formal: bool = False) -> str:
"""生成问候语"""
prefix = "Dear" if is_formal else "Hello"
return f"{prefix} {user_name}"
# Optional表示可能为None
def find_user(user_id: int) -> Optional[dict]:
# 返回用户字典或None
pass
3.2 命名约定在不同框架中的变体
不同的那些个框架呀, 它们每一个都可能拥有属于自己特有的那个种命名的习惯模式。
# Django框架class BlogPost(models.Model):
title = models.CharField(max_length=200)
publish_date = models.DateTimeField() # 下划线命名
def get_absolute_url(self): # 特定方法名
return f"/post/{self.id}/"
# Flask框架
app = Flask(__name__)
@app.route('/users/')
def get_user_profile(user_id): # 函数名明确
return render_template('profile.html')
# 数据科学(Pandas)
df_users = pd.read_csv('users.csv') # df_前缀表示DataFrame
3.第三项内容为重构技巧, 也就是对变量名称进行重新指派。
在需要重命名变量的时候, 可以调用IDE提供的工具来完成任务。
# 重构前temp = calculate_average(scores)
if temp > 60:
print("Pass:", temp)
# 重构后 - 使用更有意义的名称
average_score = calculate_average(scores)
if average_score > 60:
print("Pass:", average_score)
3.关于第四点内容是命名方面的事情, 还有代码气味问题。
如果一个名称起得不好, 那么这在很大程度上是能够暗示出代码的设计本身可能存在一些问题的。
# 代码气味1:魔法数字def calculate_price(quantity):
return quantity * 299 # 299是什么?
# 改进
PRODUCT_PRICE = 299
def calculate_price(quantity):
return quantity * PRODUCT_PRICE
# 代码气味2:过长参数列表
def process(name, age, email, phone, address, city, country, zipcode):
pass
# 改进
class UserData:
def __init__(self, name, age, email, phone, address):
self.name = name
# ...
def process(user_data: UserData):
pass
第四章在实战案例分析的这个部分里面, 我们可以看见编号是4.1的那个具体案例。而在该章节中, 第一个具体的例子就是关于用户管理系统的介绍。
# 不好的实现class user:
def __init__(self, n, a):
self.n = n # name
self.a = a # age
self.s = True # status
def g_n(self):
return self.n
# 好的实现
class User:
"""用户类"""
def __init__(self, name: str, age: int):
self.name = name
self.age = age
self.is_active = True # 状态名清晰
def get_name(self) -> str:
"""获取用户名"""
return self.name
def deactivate(self):
"""停用用户"""
self.is_active = False
4.这是第二个案例, 也就是购物车系统。
class ShoppingCart:def __init__(self):
self._items = [] # 私有属性
self.total_price = 0.0
def add_item(self, item_name: str, price: float, quantity: int = 1):
"""添加商品到购物车"""
for _ in range(quantity):
self._items.append(item_name)
self.total_price += price * quantity
def get_item_count(self) -> int:
"""获取商品总数"""
return len(self._items)
def is_empty(self) -> bool:
"""判断购物车是否为空"""
return len(self._items) == 0
# 使用示例
cart = ShoppingCart()
cart.add_item("Python编程", 89.00, 2)
cart.add_item("机械键盘", 299.00)
if not cart.is_empty():
print(f"购物车共{cart.get_item_count()}件商品")
print(f"总价: ¥{cart.total_price}")
第五章这一部分是关于工具的以及自动化的处理, 具体来说呢, 第5.1小节的内容是有关代码检查的这种工具方面的东西。
# pylint - 检查命名规范pip install pylint
pylint your_script.py
# flake8 - 综合检查
pip install flake8
flake8 your_script.py
# black - 自动格式化
pip install black
black your_script.py
5.2 IDE支持
现在的那些主流集成开发环境, 都是会给命名规范搞一个检查的功能的。
结语:命名是一种思维方式
那个良好的变量命名这件事, 它绝对不是说仅仅只是为了去遵守那些所谓的规则而已。它其实更多地是在体现一种思维方式的存在状态。同时呢, 它也正在不断地迫使着你去进行深入的一种思考活动。
记住这句编程格言:
代码的撰写, 其根本指向乃是给人进行阅读, 至于让计算机去顺利执行这一项任务, 只不过是附带完成的一个小小效果而已。
从此刻起, 你要给每一个变量都去一个清楚、准确又漂亮的名称, 这样一来, 你代码的档次自然就会高出一个层次。
这里是快速参考卡片这一场景之下, 对于避免使用某些特定内容的命名方式进行推荐的一个附录部分。
循环计数
i, j, k
, 还有那个临时文件。
用户输入
inp, u
临时结果
,
那个是x, 还有data。
大家集合。
users, items
,
布尔标志
,
valid,
单复数
user vs users
u vs us
你一定要记住的是, 在代码命名这个方面, 其实并不存在一种绝对意义上的“正确”说法, 但是确实存在一些比较“更好”的选择方案。只有靠着在实际工作当中不断地进行实践和尝试, 你才能够慢慢培养出属于你自己的那种关于命名的直觉能力, 从而让编写代码这件事变成一件真正令人感到愉悦和享受的工作内容。
到此为止, 这篇标题为变量与命名规范从入门到精通(最新推荐)的文章的介绍就全部写完了。如果各位想要了解更多和变量与命名规范有关的内容的话, 请诸位去搜索脚本之家以前的相关文章来进行查找。或者请大家接着往下看下面的这些相关文章。在这里希望大家能够在今后的日子里多多支持一下脚本之家啊!