
个人主页:
wengqidaifeng
✨ 永远在路上,永远向前走
个人专栏:
数据结构
文章目录
-
-
- [1. 注释:代码的无声导师](#1. 注释:代码的无声导师)
-
- [1.1 注释的作用](#1.1 注释的作用)
- [1.2 注释的分类与规范](#1.2 注释的分类与规范)
-
- [1.2.1 单行注释](#1.2.1 单行注释)
- [1.2.2 多行注释(文档字符串)](#1.2.2 多行注释(文档字符串))
- [1.3 应用案例与反面教材](#1.3 应用案例与反面教材)
- [2. 变量及类型:数据的化身](#2. 变量及类型:数据的化身)
-
- [2.1 变量的深度理解](#2.1 变量的深度理解)
- [2.2 变量的定义、命名与赋值](#2.2 变量的定义、命名与赋值)
- [2.3 变量的数据细节](#2.3 变量的数据细节)
- [2.4 核心数据类型精讲](#2.4 核心数据类型精讲)
- [3. 变量与类型的深入类比与机制](#3. 变量与类型的深入类比与机制)
-
- [3.1 强化生活类比](#3.1 强化生活类比)
- [3.2 变量驻留机制](#3.2 变量驻留机制)
- [4. 常见变量数据类型操作](#4. 常见变量数据类型操作)
-
- [4.1 类型转换](#4.1 类型转换)
- [4.2 格式化输出](#4.2 格式化输出)
- [5. 知识体系升华与易错点辨析](#5. 知识体系升华与易错点辨析)
-
- [5.1 核心知识点关联](#5.1 核心知识点关联)
- [5.2 考试与面试易混淆点辨析](#5.2 考试与面试易混淆点辨析)
- 总结
-
1. 注释:代码的无声导师
1.1 注释的作用
- 本质:程序代码中,对代码进行解释说明的文字。它写给未来的自己和协作者看。
- 执行特性:注释是纯粹的文本,Python解释器在执行时会完全忽略它们,不产生任何字节码,也不占用程序运行时间。
- 核心价值 :
- 解释"为什么",而非"做什么":好的代码应自解释"做什么",注释应聚焦于背后的业务逻辑、算法选择或临时解决方案。
- 文档化接口:为函数、类、模块提供使用说明,无需查看内部实现。
- 降低认知负荷:让读者快速进入上下文,理解代码意图,而非反复进行逆向工程。
- 实际意义 :
- 在团队协作中,避免"这段代码谁写的?"式困惑和指责。
- 维护旧项目时,让自己快速回忆逻辑,缩短修复时间。
- 是个人和小型项目走向专业化的第一步。
1.2 注释的分类与规范
1.2.1 单行注释
-
语法 :以井号
#开头,#右侧的所有内容均为注释。 -
最佳实践 :
- 与代码同级时,建议至少空两格再写
#,增加可读性。 - 放在代码上方独立一行,用于阐述一段逻辑。
- 与代码同级时,建议至少空两格再写
-
示例 :
python# 计算用户税后薪资(逻辑说明注释) tax_rate = 0.08 # 当前默认税率(行内注释) net_income = gross_income * (1 - tax_rate)
1.2.2 多行注释(文档字符串)
-
语法 :使用三个单引号
'''或三个双引号"""包裹。 -
本质:它们实际上创建了一个未被赋值给任何变量的字符串对象。Python解释器会将其加载后立刻丢弃,因此能起到"注释"作用。
-
文档字符串 : 这是多行注释最重要的用途,它不仅仅是注释,而是对象的
__doc__元数据。pythondef complex_calculation(a, b): """ 此函数执行一个复杂的金融模型计算。 算法基于Black-Scholes模型,参数说明如下: Args: a (float): 标的资产当前价格 b (float): 行权价格 Returns: float: 期权理论价格 Raises: ValueError: 如果输入参数为负数 """ if a < 0 or b < 0: raise ValueError("价格不能为负") # ... 计算逻辑 return result # 可打印文档字符串 print(complex_calculation.__doc__)
1.3 应用案例与反面教材
-
好的注释 :
python# 根据RFC 5322标准验证邮箱格式 # 采用正则表达式实现,避免安装额外依赖 def validate_email(email): pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$' return re.match(pattern, email) is not None -
无用的/坏的注释 :
python# 坏的注释:重复代码 x = x + 1 # 将x加1 # 过时的注释:代码已更新,注释未更新,极具误导性 # 使用旧版API v1获取用户数据 user = api_v2.get_user_data()
2. 变量及类型:数据的化身
2.1 变量的深度理解
- 核心作用 :在内存中为某个值贴上一个标签(引用)。变量名指向存储该值的内存地址。
- 应用场景深化 :
- 会话状态管理:Web应用中,Session变量保存用户的登录状态与购物车信息。
- 数据库游标:存储从数据库查询返回的结果集。
- 配置项:临时存储从配置文件或环境变量读取的动态设置。
- Python的变量本质 :Python变量没有类型,是动态类型 和强类型 语言的结合。
- 动态类型 :变量可以在运行时重新赋值为任意类型。(如:
a = 10; a = "hello") - 强类型 :不同类型之间进行操作时,必须进行显式转换。(如:
"a" + 1会报错,不像JS会自动转换)。
- 动态类型 :变量可以在运行时重新赋值为任意类型。(如:
- 面向对象视角 :在Python中,一切皆对象。变量
a = 10中,a是引用名,它指向的是一个值为10的int类的实例对象。
2.2 变量的定义、命名与赋值
-
赋值本质 :
- 在内存中创建对象(如整数
100)。 - 创建变量名
a。 - 将变量名
a指向内存中的对象100。
- 在内存中创建对象(如整数
-
标识符命名规则详解 :
- 由字母(区分大小写)、数字、下划线组成。
- 不能以数字开头。
- 不能是Python关键字(如
if, for, class, def, True, None等)。 - PEP 8命名约定(行业黄金标准) :
- 变量、函数名:蛇形命名法
user_name,get_user_data - 常量名:全大写加下划线
MAX_CONNECTIONS = 100 - 类名:驼峰命名法
UserProfile,MyClass
- 变量、函数名:蛇形命名法
-
多重赋值与交换 :
python# 一次性为多个变量赋不同值 x, y, z = 10, 20.0, "hello" # Python特色的值交换,无需临时变量 a, b = b, a
2.3 变量的数据细节
-
打印多个变量 :
pythonname = "Alice" age = 30 # 使用sep参数自定义分隔符 print(name, age, sep=' is ', end='.\n') # 输出: Alice is 30. -
变量删除 :使用
del语句解除变量名与对象的绑定,若对象引用计数归零,则会被垃圾回收。pythona = 100 del a # print(a) # 报错 NameError: name 'a' is not defined
2.4 核心数据类型精讲
-
整型 :Python 3的
int型是任意精度 的,其大小仅受限于内存。pythongoogol = 10**100 # 一个古戈尔 -
浮点型:IEEE 754双精度陷阱
- 运算存在精度问题,源于计算机的二进制存储方式。
pythonprint(0.1 + 0.2 == 0.3) # False! 结果是0.30000000000000004 # 解决方案:使用decimal模块进行精确十进制运算 from decimal import Decimal print(Decimal('0.1') + Decimal('0.2') == Decimal('0.3')) # True -
布尔型:整数子类
True实际上是1,False是0,可以参与算术运算。
pythonprint(True + 1) # 输出 2 print(isinstance(True, int)) # 输出 True- 判定为假的规则 :任何空值、零值、
None、空容器('', [], {}, ())在布尔上下文中均为False。
-
字符串的引号哲学 :
- 单双引号无实质性区别,巧妙使用可避免转义。内部有单引号,外部就用双引号包裹。
- 在三引号前加
\可防止自动换行,改善代码美观度。
pythonlong_text = "\ 这是一个很长的字符串,\ 我把它分成多行写,但输出是一行。"
3. 变量与类型的深入类比与机制
3.1 强化生活类比
-
变量名 = 酒店房卡:卡本身不是房间,但通过它能找到房间。
-
数据类型 = 房间类型:单人间、标间、套房,决定了能容纳什么样的"数据"住客及其占用空间大小。
-
动态类型 = 万能房卡:一张房卡这次可以打开单人间,下次可以打开大堂,每次都刷不同的房间(指向不同类型的对象)。
-
内存地址 = 房间物理门牌号 :通过
id()函数可以查看。pythona = 10 print(id(a)) # 打印出类似 140724310174760 的地址
3.2 变量驻留机制
-
小整数池 :Python启动时,会把[-5, 256]范围内常用的整数对象预先创建好。任何引用这些值的变量,都直接指向同一份对象,以节省内存。
pythona = 256 b = 256 print(a is b) # True,指向同一内存地址 c = 257 d = 257 print(c is d) # False,在交互环境或一行内执行可能为True,取决于解释器优化 -
intern字符串机制:由字母、数字、下划线组成的短字符串,同样会被驻留和复用。
4. 常见变量数据类型操作
4.1 类型转换
这是Python强类型特性的体现,必须显式操作。
- 转整型 :
int("10"),int(3.14)(向下取整为3) - 转浮点 :
float("3.14"),float(10) - 转字符串 :
str(100),str(True)(得到字符串"True") - 转布尔 :
bool(1)为True,bool([])为False
4.2 格式化输出
变量类型最终常需以字符串形式呈现给人。
-
f-string :Python 3.6+首选,速度最快,可读性最高。
pythonname = "Bob" weight = 65.5 info = f"姓名:{name},体重:{weight:.1f}公斤" # .1f保留一位小数 -
str.format()方法 :兼容性最好的通用方法。pythoninfo = "姓名:{},年龄:{}".format("Charlie", 35)
5. 知识体系升华与易错点辨析
5.1 核心知识点关联
-
变量、类型与对象:变量是标签,类型是标签所贴对象的分类。理解这三者关系是Python内功的核心。
-
可变与不可变类型 :
- 不可变类型 :
int, float, str, bool, tuple。修改值实质上是创建新对象,并让变量指向新对象。 - 可变类型 :
list, dict, set。可以在原地修改对象内容,所有指向该对象的变量都会发现变化。
python# 不可变 s = "hello" id_before = id(s) s += " world" # 创建了新字符串对象 id_after = id(s) print(id_before == id_after) # False # 可变 lst = [1, 2] id_before = id(lst) lst.append(3) # 原地修改 id_after = id(lst) print(id_before == id_after) # True - 不可变类型 :
5.2 考试与面试易混淆点辨析
-
比较运算符
==与 身份运算符is:==比较两个对象所代表的值是否相等。is比较两个变量是否指向同一块内存地址(即是否是同一个对象)。- 用例:
a = [1,2]; b = [1,2]; print(a==b) # True; print(a is b) # False
-
None的类型与判断 :None是NoneType类型的唯一值,表示空或无。- 判断一个变量是否为
None,必须使用is None而不是== None,这是PEP 8的强烈推荐,且性能更好、更准确。
pythonresult = None if result is None: print("数据尚未准备好") -
字符串拼接效率 :
- 在循环中使用
+拼接字符串效率极低,因为每次都会创建新的字符串对象。推荐使用"".join(list)方法。
- 在循环中使用
总结
注释
- 单行 用
#,多行 用"""...""" - 核心原则:解释为什么,而非重复代码做了什么
- 文档字符串可作函数/类的元数据
变量
- 本质是内存对象的标签,不是存储数据的盒子
- Python是动态强类型:变量可随时指向不同类型,但不同类型操作需显式转换
- 命名遵循蛇形命名法
user_name,常量全大写MAX_SIZE
数据类型
| 类型 | 关键点 |
|---|---|
int |
任意精度,仅受内存限制 |
float |
存在精度问题,精确计算用Decimal |
bool |
是int子类,True=1, False=0 |
str |
不可变类型,循环拼接用"".join() |
易混淆重点
==比较值 ,is比较内存地址- 判断
None必须用is None 0.1 + 0.2 != 0.3(浮点数陷阱)