python启航:1.基础语法知识
·

个人主页:
个人专栏:
1. 注释:代码的无声导师
1.1 注释的作用
- 本质:程序代码中,对代码进行解释说明的文字。它写给未来的自己和协作者看。
- 执行特性:注释是纯粹的文本,Python解释器在执行时会完全忽略它们,不产生任何字节码,也不占用程序运行时间。
- 核心价值:
- 解释“为什么”,而非“做什么”:好的代码应自解释“做什么”,注释应聚焦于背后的业务逻辑、算法选择或临时解决方案。
- 文档化接口:为函数、类、模块提供使用说明,无需查看内部实现。
- 降低认知负荷:让读者快速进入上下文,理解代码意图,而非反复进行逆向工程。
- 实际意义:
- 在团队协作中,避免“这段代码谁写的?”式困惑和指责。
- 维护旧项目时,让自己快速回忆逻辑,缩短修复时间。
- 是个人和小型项目走向专业化的第一步。
1.2 注释的分类与规范
1.2.1 单行注释
- 语法:以井号
#开头,#右侧的所有内容均为注释。 - 最佳实践:
- 与代码同级时,建议至少空两格再写
#,增加可读性。 - 放在代码上方独立一行,用于阐述一段逻辑。
- 与代码同级时,建议至少空两格再写
- 示例:
# 计算用户税后薪资(逻辑说明注释) tax_rate = 0.08 # 当前默认税率(行内注释) net_income = gross_income * (1 - tax_rate)
1.2.2 多行注释(文档字符串)
- 语法:使用三个单引号
'''或三个双引号"""包裹。 - 本质:它们实际上创建了一个未被赋值给任何变量的字符串对象。Python解释器会将其加载后立刻丢弃,因此能起到“注释”作用。
- 文档字符串: 这是多行注释最重要的用途,它不仅仅是注释,而是对象的
__doc__元数据。def 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 应用案例与反面教材
- 好的注释:
# 根据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 - 无用的/坏的注释:
# 坏的注释:重复代码 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
- 变量、函数名:蛇形命名法
- 多重赋值与交换:
# 一次性为多个变量赋不同值 x, y, z = 10, 20.0, "hello" # Python特色的值交换,无需临时变量 a, b = b, a
2.3 变量的数据细节
- 打印多个变量:
name = "Alice" age = 30 # 使用sep参数自定义分隔符 print(name, age, sep=' is ', end='.\n') # 输出: Alice is 30. - 变量删除:使用
del语句解除变量名与对象的绑定,若对象引用计数归零,则会被垃圾回收。a = 100 del a # print(a) # 报错 NameError: name 'a' is not defined
2.4 核心数据类型精讲
- 整型:Python 3的
int型是任意精度的,其大小仅受限于内存。googol = 10**100 # 一个古戈尔 - 浮点型:IEEE 754双精度陷阱
- 运算存在精度问题,源于计算机的二进制存储方式。
print(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,可以参与算术运算。
print(True + 1) # 输出 2 print(isinstance(True, int)) # 输出 True- 判定为假的规则:任何空值、零值、
None、空容器('', [], {}, ())在布尔上下文中均为False。
- 字符串的引号哲学:
- 单双引号无实质性区别,巧妙使用可避免转义。内部有单引号,外部就用双引号包裹。
- 在三引号前加
\可防止自动换行,改善代码美观度。
long_text = "\ 这是一个很长的字符串,\ 我把它分成多行写,但输出是一行。"
3. 变量与类型的深入类比与机制
3.1 强化生活类比
- 变量名 = 酒店房卡:卡本身不是房间,但通过它能找到房间。
- 数据类型 = 房间类型:单人间、标间、套房,决定了能容纳什么样的“数据”住客及其占用空间大小。
- 动态类型 = 万能房卡:一张房卡这次可以打开单人间,下次可以打开大堂,每次都刷不同的房间(指向不同类型的对象)。
- 内存地址 = 房间物理门牌号:通过
id()函数可以查看。a = 10 print(id(a)) # 打印出类似 140724310174760 的地址
3.2 变量驻留机制
- 小整数池:Python启动时,会把[-5, 256]范围内常用的整数对象预先创建好。任何引用这些值的变量,都直接指向同一份对象,以节省内存。
a = 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+首选,速度最快,可读性最高。
name = "Bob" weight = 65.5 info = f"姓名:{name},体重:{weight:.1f}公斤" # .1f保留一位小数 str.format()方法:兼容性最好的通用方法。info = "姓名:{},年龄:{}".format("Charlie", 35)
5. 知识体系升华与易错点辨析
5.1 核心知识点关联
- 变量、类型与对象:变量是标签,类型是标签所贴对象的分类。理解这三者关系是Python内功的核心。
- 可变与不可变类型:
- 不可变类型:
int, float, str, bool, tuple。修改值实质上是创建新对象,并让变量指向新对象。 - 可变类型:
list, dict, set。可以在原地修改对象内容,所有指向该对象的变量都会发现变化。
# 不可变 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的强烈推荐,且性能更好、更准确。
result = 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(浮点数陷阱)
更多推荐



所有评论(0)