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

个人主页:
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. 文档化接口:为函数、类、模块提供使用说明,无需查看内部实现。
    3. 降低认知负荷:让读者快速进入上下文,理解代码意图,而非反复进行逆向工程。
  • 实际意义
    • 在团队协作中,避免"这段代码谁写的?"式困惑和指责。
    • 维护旧项目时,让自己快速回忆逻辑,缩短修复时间。
    • 是个人和小型项目走向专业化的第一步。
1.2 注释的分类与规范
1.2.1 单行注释
  • 语法 :以井号 # 开头,# 右侧的所有内容均为注释。

  • 最佳实践

    • 与代码同级时,建议至少空两格再写 #,增加可读性。
    • 放在代码上方独立一行,用于阐述一段逻辑。
  • 示例

    python 复制代码
    # 计算用户税后薪资(逻辑说明注释)
    tax_rate = 0.08  # 当前默认税率(行内注释)
    net_income = gross_income * (1 - tax_rate)
1.2.2 多行注释(文档字符串)
  • 语法 :使用三个单引号 ''' 或三个双引号 """ 包裹。

  • 本质:它们实际上创建了一个未被赋值给任何变量的字符串对象。Python解释器会将其加载后立刻丢弃,因此能起到"注释"作用。

  • 文档字符串 : 这是多行注释最重要的用途,它不仅仅是注释,而是对象的__doc__元数据。

    python 复制代码
    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 应用案例与反面教材
  • 好的注释

    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是引用名,它指向的是一个值为10int类的实例对象。
2.2 变量的定义、命名与赋值
  • 赋值本质

    1. 在内存中创建对象(如整数100)。
    2. 创建变量名a
    3. 将变量名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 变量的数据细节
  • 打印多个变量

    python 复制代码
    name = "Alice"
    age = 30
    # 使用sep参数自定义分隔符
    print(name, age, sep=' is ', end='.\n') # 输出: Alice is 30.
  • 变量删除 :使用del语句解除变量名与对象的绑定,若对象引用计数归零,则会被垃圾回收。

    python 复制代码
    a = 100
    del a
    # print(a)  # 报错 NameError: name 'a' is not defined
2.4 核心数据类型精讲
  • 整型 :Python 3的int型是任意精度 的,其大小仅受限于内存。

    python 复制代码
    googol = 10**100  # 一个古戈尔
  • 浮点型:IEEE 754双精度陷阱

    • 运算存在精度问题,源于计算机的二进制存储方式。
    python 复制代码
    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实际上是1False0,可以参与算术运算。
    python 复制代码
    print(True + 1) # 输出 2
    print(isinstance(True, int)) # 输出 True
    • 判定为假的规则 :任何空值、零值、None、空容器('', [], {}, ())在布尔上下文中均为False
  • 字符串的引号哲学

    • 单双引号无实质性区别,巧妙使用可避免转义。内部有单引号,外部就用双引号包裹。
    • 在三引号前加\可防止自动换行,改善代码美观度。
    python 复制代码
    long_text = "\
       这是一个很长的字符串,\
       我把它分成多行写,但输出是一行。"

3. 变量与类型的深入类比与机制

3.1 强化生活类比
  • 变量名 = 酒店房卡:卡本身不是房间,但通过它能找到房间。

  • 数据类型 = 房间类型:单人间、标间、套房,决定了能容纳什么样的"数据"住客及其占用空间大小。

  • 动态类型 = 万能房卡:一张房卡这次可以打开单人间,下次可以打开大堂,每次都刷不同的房间(指向不同类型的对象)。

  • 内存地址 = 房间物理门牌号 :通过id()函数可以查看。

    python 复制代码
    a = 10
    print(id(a))  # 打印出类似 140724310174760 的地址
3.2 变量驻留机制
  • 小整数池 :Python启动时,会把[-5, 256]范围内常用的整数对象预先创建好。任何引用这些值的变量,都直接指向同一份对象,以节省内存。

    python 复制代码
    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+首选,速度最快,可读性最高。

    python 复制代码
    name = "Bob"
    weight = 65.5
    info = f"姓名:{name},体重:{weight:.1f}公斤" # .1f保留一位小数
  • str.format()方法 :兼容性最好的通用方法。

    python 复制代码
    info = "姓名:{},年龄:{}".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的类型与判断

    • NoneNoneType类型的唯一值,表示空或无。
    • 判断一个变量是否为None,必须使用is None而不是== None,这是PEP 8的强烈推荐,且性能更好、更准确。
    python 复制代码
    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(浮点数陷阱)
相关推荐
观北海2 小时前
Windows 平台 Python 极简 ORB-SLAM3 Demo,从零实现实时视觉定位
开发语言·python·动态规划
FreakStudio2 小时前
做了个Claude Code CLI 电子宠物:程序员的实体监工代码搭子
python·单片机·嵌入式·面向对象·并行计算·电子diy·电子计算机
柴米油盐那点事儿2 小时前
python+mysql+bootstrap条件搜索分页
python·mysql·flask·bootstrap
AC赳赳老秦3 小时前
OpenClaw二次开发实战:编写专属办公自动化技能,适配个性化需求
linux·javascript·人工智能·python·django·测试用例·openclaw
Ulyanov3 小时前
《PySide6 GUI开发指南:QML核心与实践》 第二篇:QML语法精要——构建声明式UI的基础
java·开发语言·javascript·python·ui·gui·雷达电子对抗系统仿真
码界筑梦坊3 小时前
357-基于Java的大型商场应急预案管理系统
java·开发语言·毕业设计·知识分享
anzhxu3 小时前
Go基础之环境搭建
开发语言·后端·golang
刀法如飞4 小时前
一款Python语言Django框架DDD脚手架,助你快速搭建项目
python·ddd·脚手架
刀法如飞4 小时前
一款Python语言Django框架DDD脚手架,适合中大型项目
后端·python·领域驱动设计